2012-01-14 43 views
12

Đây là một câu hỏi rất chung chung. Tôi là một 'lập trình viên' tự học có chương trình trong C#. Một dự án tôi muốn làm việc trên sẽ được thực hiện dễ dàng hơn rất nhiều (trong chương trình lớn của sự vật) nếu tôi biết C++. Chuyển từ C# sang C++ dễ đến mức nào? Bất kỳ cạm bẫy tôi nên xem ra cho? Và nếu tôi đang sử dụng VS2010, tôi có thể lập trình (không phải trong cùng một lớp, nhưng cùng một dự án) một cái gì đó trong cả C# và C + +?Di chuyển từ C# sang C++ (cộng với làm việc với cả hai trong cùng một giải pháp)

+14

Dễ dàng hơn khi [tự chụp chân mình trong C++] (http://m5p.com/~pravn/foot.html) và nó sẽ làm tổn thương bạn nhiều hơn trong C#. –

+7

@UweKeim Điều này thật vui nhộn, tôi đã có một tiếng cười thực sự tốt! Cảm ơn bạn! – formatc

+2

@keynesiancross Tôi xin lỗi khi nói rằng bạn có một số ** ngày thực sự khó khăn ** trước ahahahahaah – Chani

Trả lời

21

Chuyển từ C# sang C++ là không dễ dàng. Cú pháp cơ bản có thể xuất hiện giống nhau (ví dụ: nếu, cho ...), nhưng có sự khác biệt sâu sâu, ví dụ: mô hình RAII và các biến ngữ nghĩa ngăn xếp có các hàm hủy được gọi khi chúng ra khỏi phạm vi, vv không có trong C#.

Hơn nữa, C# sử dụng bộ thu gom rác không xác định (có thể được chấp nhận đối với tài nguyên bộ nhớ, nhưng vô dụng đối với các loại tài nguyên khác). Thay vào đó, với C++ hiện đại, bạn có thể sử dụng mẫu và con trỏ thông minh (như std ::/boost :: * shared_ptr *), cho phép bạn có xác định "bộ sưu tập rác" được tham chiếu, rất hiệu quả và hợp lệ cho cả tài nguyên bộ nhớ và bộ nhớ không (như xử lý tệp, ổ cắm, họa tiết ...).

Hơn nữa, C# Generics là rất khác so với C++ templates (C++ mẫu là rất mạnh mẽ, và cho phép một mức độ tiên tiến của chương trình được gọi là mẫu meta-lập trình).

Trong VS2010 bạn có thể có giải pháp lưu trữ cả dự án C++ và C#. Để giao tiếp giữa hai thế giới (thế giới bản địa của C++ và thế giới được quản lý của .NET/C#), bạn có thể sử dụng C++/CLI như một loại lớp cầu nối.

Trong Windows 8, một công nghệ mới nên được giới thiệu, được gọi là WinRT (dựa trên COM), cho phép giao tiếp liên ngôn ngữ. Trong trường hợp này, bạn có thể sử dụng C++ với WRL (thư viện dựa trên mẫu) hoặc phần mở rộng ngôn ngữ C++/CX để xây dựng các thành phần C++ có thể được sử dụng từ C# và .NET.

Học tập vui vẻ.

+1

Cảm ơn phản hồi vững chắc của bạn. Bây giờ, thừa nhận, tôi không có ý tưởng những gì ba điều đầu tiên bạn nói về là ... (RAII/stack sematics ??, thu gom rác không xác định ?? và các mẫu?) – keynesiancross

+1

Nếu bạn đề cập đến 'shared_ptr' bạn nên ít nhất cũng đề cập đến những vấn đề rõ ràng với nó so với một GC (chu kỳ, đa luồng, hiệu suất) nếu không điều đó có thể dẫn đến những bất ngờ thú vị cho người không biết. Ghi chú nhỏ: đếm đếm hiệu quả? Không thật sự lắm. – Voo

+0

@Voo: đếm đếm chắc chắn hiệu quả hơn là có một bộ thu gom rác chạy dưới dạng chủ đề nền và tại một thời điểm nào đó, đóng băng mọi thứ đi bộ và đánh dấu nó. Hơn nữa, tôi nghĩ .NET GC được chạy dưới áp lực bộ nhớ, nhưng nó không có đầu mối về các tài nguyên khác (như ổ cắm, hoặc bộ nhớ kết cấu trên card đồ họa, vv). Thay vào đó với C++ destructors và shared_ptr mọi tài nguyên (không chỉ bộ nhớ hệ thống) được phát hành ngay khi không có ai tham chiếu chúng nữa. –

5

tôi có thể lập trình (không cùng lớp, nhưng cùng một dự án) ở cả C# và C++?

Trả lời là không bạn không thể. Bạn có thể nếu bạn sử dụng Managed C++ & C++. Nhưng nếu bạn đang làm việc với C# thì bạn không thể có C# và C++ code bên trong cùng một dự án

Làm thế nào dễ dàng là nó để di chuyển từ C# C++? '

Nó là một chút chủ quan nhưng theo ý kiến ​​của tôi, nó sẽ là một bước rất khó khăn. C++ là một ngôn ngữ khác vì vậy nó sẽ khó như học một ngôn ngữ mới :) một lần nữa nó chủ quan nên tôi sẽ không đi vào chi tiết

5

Vì bạn đang làm việc với .NET, tôi đoán bạn đang sử dụng Visual Studio?

Thật dễ dàng để kết hợp C# và C++ trong cùng một chương trình, sử dụng tùy chọn trình biên dịch /clr. Mã C++ của bạn có thể bao gồm cả các lớp C++ chuẩn, tuân thủ chuẩn và cũng là các đối tượng .NET ref class được thiết kế để sử dụng từ C#. Cả hai là riêng biệt nhưng có thể truy cập lẫn nhau, thông qua con trỏ từ ref class đến gốc class và mẫu gcroot từ gốc class đến ref class.

Lưu ý rằng tôi đã nói "trong cùng một chương trình ", không phải "trong cùng một dự án ". Bạn sẽ phải chia thành hai phần, một dự án C# và một dự án C++/CLI, và một sẽ là một DLL mà các tải khác. Ngoài ra còn có một thủ thuật để kết hợp cả hai trong quá trình xây dựng, do đó bạn kết thúc với một tệp thực thi duy nhất, nhưng đó là rắc rối nhiều hơn nó thường có giá trị.


Lưu ý, bạn có thể thấy lớp này con trỏ thông minh tôi đã viết hữu ích, nó làm cho việc sử dụng các nguồn gốc class đối tượng từ ref class NET đối tượng dễ dàng hơn nhiều.

9

tôi đến con đường khác từ C++ C#. Trong nhiều cách đó là một cứu trợ. C++ có nhiều quy tắc hơn C# đặc biệt là phân bổ bộ nhớ. Cú pháp này cũng có thể là thách thức và rất dễ dàng để đi lang thang vào bộ nhớ ngoài giới hạn. Tuy nhiên, C++ phù hợp hơn nhiều với lập trình cấp hệ thống nhưng với sức mạnh to lớn có trách nhiệm lớn.

Tôi khuyên bạn nên lấy một bản sao của Scott Meyer Effective C++ và đọc nó để trang trải. Đây là tài nguyên tốt nhất mà tôi biết để có được những điều cơ bản đúng và không có câu hỏi nào cải thiện chất lượng của mã tôi đã sản xuất, thậm chí là nhà phát triển C++ "có kinh nghiệm". Sau đó, lấy một khung kiểm thử đơn vị và xem một c++ kata (trong trường hợp này là một dự án xcode nhưng vẫn hữu ích). Và làm quen với Standard Template Library chứa nhiều mã/lớp hữu ích/hiệu quả cho vùng chứa, thuật toán, v.v.

Cuối cùng, may mắn nhất. Học một ngôn ngữ mới luôn luôn là một thách thức và có thể gây khó khăn nhưng phần thưởng thường đáng giá. Nếu không có gì khác bạn sẽ thấy mã C# của bạn với đôi mắt mới.

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