Apakah C ++. Net digunakan secara luas?

25

Saya seorang C + + coder oleh tradisi. Selama 12 bulan terakhir ini saya telah melakukan banyak pengkodean C #, dan sangat terkejut dengan pendekatan pragmatis C # (begitu saya berhenti mencoba kode itu seolah-olah itu "C ++ dengan pengumpulan sampah").

Kami baru-baru ini memiliki beberapa lulusan dan ketika membantu salah satu dari mereka saya menyadari dia menggunakan .Net di dalam C ++. Setelah menanyakan alasannya, dia bilang dia "disuruh menggunakan C ++ oleh manajernya". Di samping masalah komunikasi yang jelas, saya berasumsi dia menggunakan .Net karena itulah satu-satunya kerangka kerja yang dia gunakan.

Saya kemudian menemukan sebuah proyek lama oleh pengembang senior yang juga menggunakan C ++ untuk menggerakkan ujung depan Formulir. Sekarang ini akan ditulis sekitar waktu. Net pertama kali muncul, jadi saya menganggap itu adalah latihan belajar untuk bermain-main dengan .Net. Itu hanya aplikasi utilitas kecil.

Setelah melakukan beberapa modifikasi kecil dalam aplikasi ini, bagi saya tampaknya menggunakan C ++ untuk mendorong .Net memberi Anda yang terburuk dari kedua dunia. Tidak ada pengumpulan sampah atau keamanan memori, tetapi juga tidak ada peluang kecepatan / optimisasi nyata karena Anda berurusan dengan kerangka kerja yang dikelola.

Jadi pertanyaan saya adalah apakah orang menggunakan C ++ .Net untuk kode produksi yang berdiri sendiri (yaitu non-plumbing), dan jika demikian apa alasan Anda melakukannya? Saya dengan bebas mengakui bahwa saya tidak pernah menggali secara mendalam ke dalam ekstensi C ++ .Net jadi saya mungkin akan melakukan hal yang merugikan.

GazTheDestroyer
sumber

Jawaban:

32

C ++. NET (atau, tepatnya, C ++ / CLI) memang memiliki pengumpulan sampah, seperti semua yang berjalan di atas .NET. Untuk mencapai hal ini sementara tetap kompatibel dengan C ++ yang tepat, ia menggunakan ^sintaks dan gcnewuntuk pointer yang dikumpulkan oleh sampah ('aman').

C ++ / CLI dianggap kekejian oleh banyak orang, itu secara signifikan lebih tidak menyenangkan untuk bekerja dengan baik daripada C # atau C ++ yang tepat, dan juga lebih rumit daripada keduanya (hanya karena itu membawa kompleksitas C ++ sendiri ke meja dan menambahkan apa yang diperlukan untuk bekerja dengan NET ke dalam campuran). Belajar C # biasanya terbayar bahkan dalam lingkup satu proyek berukuran sedang. Namun, ada satu hal yang dapat dilakukan yang tidak dapat dilakukan oleh C # maupun asli C ++: kompilasi C ++ yang ada terhadap .NET dan minta ia berbicara dengan komponen .NET lainnya.

Akibatnya, tidak masuk akal untuk menggunakan C ++ / CLI untuk proyek dari awal - apa pun. Terkait NET yang dapat dilakukan dengan itu juga dapat dilakukan dalam C #, dengan sintaks yang jauh lebih baik dan keamanan tambahan tidak mengekspos mentah pointer secara default. Raison-d'etre yang paling menonjol adalah porting basis kode yang ada ke .NET. Sebuah perusahaan yang memutuskan untuk mulai menggunakan .NET, tetapi tidak mau (atau tidak dapat karena keterbatasan sumber daya dan waktu) untuk menulis ulang setiap perangkat lunak yang telah mereka hasilkan sejauh ini, dapat menggunakan C ++ / CLI untuk tetap menggunakan basis kode yang ada dengan hanya perubahan minimal, dan kemudian menulis ulang komponen sistem mereka dalam C # satu per satu. Setidaknya itulah teorinya; Saya belum pernah melihat itu dilakukan dalam latihan sendiri, jadi saya tidak bisa mengatakan seberapa baik kerjanya.

Perhatikan juga bahwa C # sendiri dapat berinteraksi dengan pustaka asli, jadi meskipun Anda harus menggunakan basis kode C ++ yang sudah ada, Anda tidak harus mengkompilasi ulang terhadap .NET: sering, berinteraksi dengan mereka melalui COM atau P / Invoke adalah solusi yang lebih baik .

tammmer
sumber
10
Harap dicatat bahwa 'berinteraksi dengan perpustakaan asli' dengan P / Invoke terbatas pada dll dengan fungsi statis, dan COM merepotkan dengan haknya sendiri. Wrapper dalam C ++ / CLR memungkinkan Anda untuk mengakses backend / proyek asli berukuran penuh dengan bersih dalam kode C # Anda dengan sedikit batasan. Saya tidak akan menggunakannya untuk pengembangan, tetapi sebagai lem, ini JAUH lebih bersih dari P / Invoke dan itu marshalling.
Maks
Diperbanyak - Dan saya pikir Microsoft secara diam-diam setuju, menilai dari cara mereka menyelaraskan kembali C ++ ke tempat yang seharusnya dalam pengembangan asli.
Josh Greifer
2
Perhatikan bahwa bahasa tersebut sebenarnya disebut C ++ / CLI, bukan C ++. NET.
svick
@vick: Benar. Diedit.
tdammers
1
@ Max TBH Microsoft telah membuat semuanya asli. Jadi sekarang, Anda tidak perlu C ++ / CLI sama sekali, tidak perlu menulis pembungkus jahat ke antarmuka C # ke kode asli - pastikan mereka WinRT / COM objek dan Anda selesai.
gbjbaanb