Là C ++. Net được sử dụng rộng rãi?


25

Tôi là một lập trình viên C ++ theo truyền thống. Trong khoảng 12 tháng qua, tôi đã thực hiện nhiều mã hóa C # và đã rất ngạc nhiên với cách tiếp cận thực dụng của C # (một khi tôi đã ngừng cố gắng viết mã như thể đó là "C ++ với bộ sưu tập rác").

Gần đây chúng tôi đã có một số sinh viên tốt nghiệp và khi giúp đỡ một trong số họ, tôi nhận ra cô ấy đang sử dụng .Net trong C ++. Sau khi hỏi cô ấy tại sao, cô ấy nói rằng cô ấy đã được "quản lý sử dụng C ++". Rõ ràng vấn đề giao tiếp sang một bên, tôi cho rằng cô ấy đang sử dụng .Net vì đó là khuôn khổ duy nhất cô ấy tiếp xúc.

Sau đó tôi tình cờ thấy một dự án cũ của một nhà phát triển cấp cao, người cũng đã sử dụng C ++ để lái một giao diện người dùng. Bây giờ điều này đã được viết vào khoảng thời gian .Net lần đầu tiên xuất hiện, vì vậy tôi cho rằng đây là một bài tập học tập để chơi xung quanh với .Net. Nó chỉ là một ứng dụng tiện ích nhỏ.

Phải thực hiện một số sửa đổi nhỏ trong ứng dụng này, đối với tôi, dường như việc sử dụng C ++ để lái .Net mang đến cho bạn điều tồi tệ nhất của cả hai thế giới. Không có bộ sưu tập rác hoặc an toàn bộ nhớ, nhưng cũng không có cơ hội tối ưu hóa / tốc độ thực tế tương tự vì bạn đang xử lý một khung được quản lý.

Vì vậy, câu hỏi của tôi là liệu mọi người có sử dụng C ++ .Net cho bất kỳ mã sản xuất độc lập lớn nào (tức là không phải ống nước) không, và nếu vậy lý do của bạn để làm như vậy là gì? Tôi thoải mái thừa nhận rằng tôi chưa bao giờ đào sâu vào các phần mở rộng C ++ .Net vì vậy tôi có thể thực hiện nó như một sự bất đồng.

Câu trả lời:


32

C ++. NET (hay chính xác là C ++ / CLI) không có bộ sưu tập rác, giống như mọi thứ khác chạy trên .NET. Để đạt được điều này trong khi vẫn tương thích với C ++, nó sử dụng ^cú pháp và gcnewcho các con trỏ được thu gom rác ('an toàn').

C ++ / CLI bị nhiều người coi là gớm ghiếc, làm việc khó chịu hơn đáng kể so với C # hoặc C ++, và cũng phức tạp hơn cả (đơn giản vì nó mang lại sự phức tạp của chính C ++ cho bảng và thêm những gì nó cần để làm việc với .NET để trộn). Học C # thường được đền đáp ngay cả trong phạm vi của một dự án cỡ trung bình. Tuy nhiên, có một điều nó có thể làm mà cả C # và C ++ không thể làm được: biên dịch C ++ hiện có với .NET và nói chuyện với các thành phần .NET khác.

Do đó, việc sử dụng C ++ / CLI cho dự án từ đầu không có ý nghĩa gì - mọi thứ liên quan đến .NET có thể được thực hiện trong C #, với cú pháp đẹp hơn và an toàn hơn khi không hiển thị thô con trỏ theo mặc định. Raison-d'etre nổi bật nhất của nó là chuyển các cơ sở mã hiện có sang .NET. Một công ty quyết định bắt đầu sử dụng .NET, nhưng không muốn (hoặc không thể do hạn chế về tài nguyên và thời gian) để viết lại mọi phần mềm họ đã sản xuất cho đến nay, có thể sử dụng C ++ / CLI để tiếp tục sử dụng cơ sở mã hiện tại của họ chỉ với những thay đổi tối thiểu, và sau đó viết lại các thành phần của hệ thống của họ trong C # từng cái một. Ít nhất đó là lý thuyết; Tôi chưa bao giờ thấy nó được thực hiện trong thực tế, vì vậy tôi không thể biết nó hoạt động tốt như thế nào.

Cũng lưu ý rằng chính C # có thể giao tiếp với các thư viện riêng, vì vậy ngay cả khi bạn phải sử dụng các cơ sở mã C ++ hiện có, bạn không nhất thiết phải biên dịch lại chúng với .NET: thường xuyên, giao tiếp với chúng thông qua COM hoặc P / Invoke là giải pháp tốt hơn .


10
Xin lưu ý rằng 'giao tiếp với các thư viện gốc' với P / Invoke bị giới hạn ở dll với các hàm tĩnh và COM là một rắc rối theo đúng nghĩa của nó. Một trình bao bọc trong C ++ / CLR cho phép bạn truy cập một dự án / phụ trợ gốc có kích thước đầy đủ trong mã C # của bạn với rất ít hạn chế. Tôi sẽ không sử dụng nó để phát triển, nhưng như keo, nó RẤT NHIỀU hơn P / Gọi và nó đang được xử lý.
Tối đa

Thứ hai - Và tôi nghĩ Microsoft đã ngầm đồng ý, đánh giá bằng cách họ đã liên kết lại C ++ với vị trí xứng đáng của nó trong phát triển bản địa.
Josh Greifer

2
Lưu ý rằng ngôn ngữ thực sự được gọi là C ++ / CLI, không phải C ++. NET.
Svick

@svick: Đúng. Đã chỉnh sửa.
tdammers

1
@Max TBH Microsoft đã làm mọi thứ tự nhiên. Vì vậy, bây giờ, bạn hoàn toàn không cần C ++ / CLI, không cần phải viết các trình bao bọc khó chịu đó để giao diện C # thành mã gốc - chỉ cần đảm bảo rằng chúng là các đối tượng WinRT / COM và bạn đã hoàn thành.
gbjbaanb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.