2009-12-11 66 views
9

Có lợi thế lớn nào về quản lý C++/CLI trên C# hay không. Chắc chắn không phải là cú pháp Tôi cho rằng như đoạn mã sau trong C++/CLI là có thật xấu xí,C++/CLI: Ưu điểm so với C#

C++/CLI mã:

[Out]List<SomeObject^>^% someVariable 

Hãy so sánh trên với C# Code:

out List<SomeObject> someVariable 

Chỉ cần ra khỏi sự tò mò, là có một cú pháp thậm chí xấu hơn trong C++/CLI so với ở trên.

Trả lời

13

Nó gần như là một ngôn ngữ có khả năng tương thích - cho phép mã .Net truy cập các thư viện C++ cũ hoặc cho các cơ sở mã C++ mở rộng hiện có (có nguồn gốc) với quyền truy cập vào thư viện .Net (và một số biến thể về các chủ đề này).

Trong khi đó có thể viết các ứng dụng hoàn chỉnh trong C++/CLI và thậm chí nó cung cấp cho bạn một số tính năng ngôn ngữ không có sẵn trong C++ (chẳng hạn như thu gom rác), tôi nghi ngờ có nhiều người thực sự làm cái này. Nếu bạn đã di chuyển ra khỏi C++ thuần túy và không có mục tiêu interop với. Net có lẽ có nhiều sự lựa chọn tự nhiên hơn (ví dụ như D hoặc Scala, tùy thuộc vào hướng bạn muốn đi vào).

Tương tự, việc chuyển từ C# sang C++/CLI thuần túy có thể mang lại lợi thế cho các mẫu C++, nhưng hiếm khi nhu cầu này dẫn đến việc bạn thực hiện bước đó.

+1

Tôi có thể thêm để hỗ trợ điều này. Trong một dự án trước, tôi đã phải viết một giao diện giữa một ứng dụng dịch vụ web asmx C# và phần mềm trung gian của IBM mà chỉ có một thư viện api C++ (không phải là một dll mà là một lib tĩnh). C++/CLI là lựa chọn duy nhất để tạo ra cây cầu này. – softveda

+1

Việc triển khai D .Net đang hoạt động. Có thể là, trong tương lai gần, D có thể tương thích với .Net. – dsimcha

+0

@dsimcha - điều đó sẽ rất tuyệt vời – philsquared

2

Lợi thế của quản lý C++ là dễ dàng trộn mã được quản lý và không được quản lý. Nhưng nếu tất cả (hoặc gần như tất cả) mã của bạn sẽ được quản lý, thì C# chắc chắn nên được sử dụng (và bạn vẫn có thể invoking unmanaged code from C# bằng cách sử dụng DllImport attribute).

12

Kết nối dễ dàng hơn với mã C++ gốc là một lợi thế.

Cho dù đó là một lợi thế chính là chủ quan.

Trừ khi bạn muốn trộn lẫn với mã C++ gốc hiện có, bạn có thể tốt hơn nhiều với C#.

+0

Câu trả lời hay. Nhưng nó không thực sự chủ quan - đó là một lợi thế lớn nếu (và chỉ nếu) bạn không có sự lựa chọn, nhưng để đối phó với mã nguồn gốc hiện có. – OregonGhost

+3

Nó vẫn chủ quan. Nếu những gì bạn cần là sử dụng một DLL hiện có, bạn có thể chọn để tương thích với mã hiện tại bằng cách sử dụng C# và sử dụng P/Invoke. Cho dù đó là lợi thế "lớn" hay lợi ích "nhỏ" để bạn có được sự tương tác dễ dàng hơn so với lợi thế "lớn" hoặc lợi thế "nhỏ" để C# hoàn toàn phụ thuộc vào người hỏi câu hỏi. –

+2

P/Gọi với các thư viện C++ hiện tại gần như không thể ... – Milan

3

Sử dụng C++/CLI nó là rất dễ dàng để tương tác với mẹ đẻ C++

0

bạn chỉ cần chuyển sang C++ \ cli khi bạn phải, nếu bạn có thể gặp các bạn yêu cầu sử dụng C#, tại sao bận tâm đi C++ \ cli

0

Nói chung, tôi nghĩ lợi thế chính của C++/CLI đơn giản là sự quen thuộc đối với các nhà phát triển C++. Nếu bạn không đến từ nền C++ thì hãy đi với C#.

+0

Tôi nghĩ là không. Tôi đến từ một nền C++ (trộn lẫn với Java và Delphi), và C# rất đơn giản để nắm bắt. Không cần C++/CLI chỉ để làm quen. Tôi khá may mắn khi thoát khỏi cú pháp C++ :) – OregonGhost

+0

Thú vị, đã lâu rồi tôi không có bất kỳ C++ nào nhưng tôi cho rằng cú pháp C++/CLI sẽ quen thuộc hơn C#, nhưng tôi đoán là không! –

6

tôi có thể nghĩ ra 3 lý do chính để sử dụng C++/CLI:

  1. Bạn đã có một ++ Dự án C lớn và muốn sử dụng NET trong nó (cho dù bạn muốn di chuyển nó hoàn toàn trong tương lai hoặc không)
  2. Bạn muốn sử dụng thư viện được viết bằng C hoặc C++. Đối với các thư viện đơn giản, bạn có thể sử dụng C#/PInvoke, nhưng ví dụ: nếu thư viện đi kèm với một hệ thống kiểu phức tạp, bạn có thể nên tạo trình bao bọc C++/CLI thay vì tạo lại hệ thống kiểu trong C#
  3. Các phần trong dự án của bạn được viết tốt nhất bằng C++. Ví dụ. nếu bạn đang thực hiện nhận dạng giọng nói hoặc xử lý hình ảnh, C++ có thể đơn giản là phù hợp hơn cho tác vụ.
+0

Bạn có thể giải thích tại điểm 3 liên quan đến nhận dạng giọng nói hoặc xử lý hình ảnh không? – Lopper

+0

Xử lý hình ảnh trong C++ => http://www.boost.org/doc/libs/1_41_0/libs/gil/doc/index.html – Oliver

0

ứng dụng C++ không được quản lý không cần khung để chạy, C# sẽ chỉ chạy trên các máy có khung dotnet 1, 2, 3 hoặc 4. đáng ngạc nhiên là có bao nhiêu máy vẫn chạy mà không có khung này.

1

Là một lập trình viên C# chủ yếu, tôi thấy mình phải sử dụng C++/CLI với một chút đau đớn. Tuy nhiên, như là một ngôn ngữ interop, nó FAR outweighs C# cho việc phải làm việc với mã nguồn gốc. IDE C++/CLI trong Visual Studio thiếu rất nhiều tính năng trong hương vị C#.

Nhìn chung, nó có vị trí của nó và sẽ vẫn tồn tại miễn là mã gốc tồn tại. Tôi sẽ không muốn phải tạo các ứng dụng WinForm từ đầu với IDE C++/CLI nếu tôi không phải làm như vậy.

5

Có thể sử dụng tệp tiêu đề gốc trực tiếp là một lợi thế rất lớn, nhưng không phải là lợi thế duy nhất.

Ngữ nghĩa ngăn xếp tốt hơn rất nhiều so với bất kỳ điều gì mà C# cung cấp để quản lý IDisposable. C++/CLI có một cú pháp thống nhất để quản lý chính xác các biến là IDisposable và những cú pháp không phải là cả hai biến cục bộ và là các trường thành viên. So sánh:

ref class MyClass 
{ 
    FileStream fs; 
} 

vs

class MyClass : IDisposable 
{ 
    FileStream fs; 

    void IDisposable.Dispose() { Dispose(true); } 
    ~MyClass() { Dispose(false); } 

    public virtual void Dispose(bool disposing) { if (disposing) fs.Dispose(); } 
} 

Bây giờ mà ngôn ngữ được tìm kiếm xấu xí?

Sau đó, có các mẫu, interior_ptr, #define, xuất bản DLL gốc, con trỏ thành thành viên và có thể một số thứ khác mà tôi đã quên.

+0

Tôi đồng ý, ngoại trừ #define. Từ quan điểm của tôi, việc sử dụng rộng rãi và thờ ơ của nó trong rất nhiều dự án là một PITA. – Alex

2

CLI/C++ có nhiều lợi thế hơn C#.

  1. thư viện STD
  2. Native C++/C không thể được xem bằng cách disassembler (như Reflector) bởi vì họ không thực sự CLI (không cần phải xáo trộn (mặc dù một hacker tốt đã có thể nhận được bằng cách này)).
  3. Giả lập các dự án C/C++ làm trình bao bọc để sử dụng với các ngôn ngữ .Net. C++/CLI không phải là một ngôn ngữ chỉ là thêm hỗ trợ cho. Net với C/C++.
  4. Một số điều khiển trên bộ nhớ thông qua con trỏ C/C++ trỏ đến các đối tượng C/C++ trên heap.

Tôi ghét phải tin tưởng vào GC để truy cập vào đối tượng bị kẹt trên gen 2. Chúa biết khi nào sẽ được giải phóng khỏi vùng được quản lý.

Các vấn đề liên quan