Vì lý do gì tôi nên chọn C # trên Java và C ++? [đóng cửa]


46

C # dường như là phổ biến những ngày này. Tôi nghe nói rằng về mặt cú pháp, nó gần giống như Java. Java và C ++ đã tồn tại trong một thời gian dài hơn. Vì lý do gì tôi nên chọn C # trên Java và C ++?


16
Như đã viết câu hỏi là một ví dụ trong sách giáo khoa về việc không mang tính xây dựng "ngôn ngữ nào tốt hơn?" câu hỏi ngoài chủ đề ở đây. Tôi đã cố gắng làm cho nó có tính xây dựng hơn với một chỉnh sửa vì nó thực sự có câu trả lời tốt, được suy nghĩ kỹ. Tuy nhiên, vui lòng ghi nhớ Câu hỏi thường gặpbài đăng trên blog này khi đặt câu hỏi về bản chất này.
Adam Lear

Hãy để tôi thêm một số mặt hàng edgier. .NET có một DOM được xác định rõ ( ví dụ CodeDOM ) cho ngôn ngữ của nó và do đó việc tạo ra mọi thứ một cách linh hoạt trong thời gian chạy đơn giản hơn và hiệu quả hơn rất nhiều. Điều này cũng có thể hữu ích như một khả năng cơ sở hạ tầng. Ngoài ra, hệ thống loại có kết quả khớp 1-1 với tất cả các loại W3 gốc. Tại cốt lõi của nó, W3 và các giao diện khác đã được đưa vào ngôn ngữ ngay từ đầu. Đối với các ngôn ngữ khác, những mối quan tâm này chỉ được củng cố và đưa ra nhiều thách thức cho chúng. Ngoài ra, nếu bạn sẽ xen kẽ với nhiều ngôn ngữ và / hoặc giao thức thì .NET cũng rất mạnh
JoeGeeky

5
Này, JoeGeeky, thêm nhận xét của bạn làm câu trả lời cho câu hỏi.
Anthony Mastrean

1
Các câu hỏi thực sự là: Vì lý do gì tôi nên chọn Nemerle, F * và F # trên C #? (ví dụ, tất cả ba ngôn ngữ là từ MS và cả ba đều tốt hơn)
mrsteve

Tôi thực sự không nghĩ bất kỳ tuyên bố nào về thể loại "ngôn ngữ / nền tảng X so với ngôn ngữ / nền tảng Y là LUÔN tốt hơn" là hợp lệ và tôi cũng nghĩ rằng đối với bất kỳ X và Y nào, nó có thể dễ dàng bị vô hiệu hóa đối với các bối cảnh nhất định. Điểm của câu hỏi này là gì?
Shivan Dragon

Câu trả lời:


76

Câu hỏi nên là "Ngôn ngữ nào phù hợp hơn cho phát triển ứng dụng điển hình, hiện đại?".

Chỉnh sửa: Tôi đã giải quyết một số ý kiến ​​dưới đây. Một lưu ý nhỏ: hãy xem xét rằng khi bạn có rất nhiều thứ nguyên bản, như thành ngữ, thì đó là một sự khác biệt lớn so với việc thực hiện hoặc tải xuống và sử dụng chúng mỗi lần. Hầu hết mọi thứ có thể được thực hiện trong bất kỳ ngôn ngữ nào. Câu hỏi là - những ngôn ngữ thực sự cung cấp cho bạn.

Vì vậy, trên đỉnh đầu của tôi (một số đối số áp dụng cho cả hai ngôn ngữ) ...

C # tốt hơn C ++ ở chỗ:

  • Nó có bộ sưu tập rác tự nhiên .
  • Nó cho phép bạn coi chữ ký của các phương thức lớp là các hàm miễn phí (nghĩa là bỏ qua thisđối số con trỏ được gõ tĩnh ) và do đó tạo ra các mối quan hệ linh hoạt và linh hoạt hơn giữa các lớp. chỉnh sửa nếu bạn không biết điều này có nghĩa là gì, sau đó thử gán một phương thức thành viên trả về void và chấp nhận void cho một void (*ptr)()biến. Các đại biểu C # mang theo thiscon trỏ bên mình, nhưng người dùng không phải lúc nào cũng phải quan tâm đến điều đó. Họ chỉ có thể gán một void()phương thức của bất kỳ lớp nào cho bất kỳ void()đại biểu nào khác .
  • Nó có một thư viện tiêu chuẩn khổng lồ với rất nhiều thứ hữu ích được triển khai tốt và dễ sử dụng.
  • Nó cho phép cả khối mã được quản lý và mã gốc.
  • Phiên bản hội dễ dàng khắc phục vấn đề địa ngục DLL.
  • Bạn có thể đặt các lớp, phương thức và trường thành tập hợp bên trong (có nghĩa là chúng có thể truy cập được từ mọi nơi trong DLL mà chúng được khai báo, nhưng không phải từ các tập hợp khác).

C # tốt hơn Java ở chỗ:

  • Thay vì nhiều tiếng ồn (EJB, triển khai lớp tĩnh riêng, v.v.), bạn có được các cấu trúc gốc thanh lịch và thân thiện như Thuộc tính và Sự kiện.
  • Bạn có khái quát thực sự (không phải trò đùa đúc xấu mà Java gọi là tổng quát) và bạn có thể thực hiện phản ánh về chúng.
  • Nó hỗ trợ các thành ngữ quản lý tài nguyên bản địa ( usingtuyên bố). Java 7 cũng sẽ hỗ trợ điều này, nhưng C # đã có nó trong một thời gian dài hơn.
  • Nó không kiểm tra ngoại lệ :) (tranh luận liệu điều này tốt hay xấu)
  • Nó được tích hợp sâu với Windows, nếu đó là những gì bạn muốn.
  • Nó có Lambdas và LINQ, do đó hỗ trợ một lượng nhỏ lập trình chức năng.
  • Nó cho phép cả hiệp phương sai chung và chống chỉ định rõ ràng.
  • Nó có các biến động, nếu bạn muốn chúng.
  • Hỗ trợ liệt kê tốt hơn, với yieldtuyên bố.
  • Nó cho phép bạn xác định các loại giá trị mới (hoặc không tham chiếu).

Chỉnh sửa - Địa chỉ bình luận

  • Tôi không nói C ++ không hỗ trợ RAII bản địa. Tôi đã nói Java không có nó (bạn nhất định phải thử / cuối cùng). C ++ có các con trỏ tự động rất tốt cho RAII và (nếu bạn biết bạn đang làm gì) cũng có thể thay thế bộ sưu tập rác.
  • Tôi đã không nói bất cứ điều gì về việc mô phỏng các chức năng miễn phí. Nhưng ví dụ, nếu bạn cần truy cập vào một trường bằng một thiscon trỏ và liên kết phương thức thực hiện nó với một con trỏ hàm chung (nghĩa là không cùng lớp), thì đơn giản là không có cách nào để làm điều đó. Trong C #, bạn nhận được miễn phí. Bạn thậm chí không cần phải biết nó hoạt động như thế nào.
  • Bằng cách "coi các phương thức thành viên là các hàm miễn phí", ý tôi là, ví dụ, bạn không thể liên kết một phương thức thành viên với một chữ ký hàm miễn phí, bởi vì phương thức thành viên "bí mật" cần thiscon trỏ.
  • Các usingtuyên bố, rõ ràng cùng với giấy gói IDisposable, là một ví dụ tuyệt vời của RAII. Xem liên kết này . Hãy xem xét rằng bạn không cần RAII nhiều như C # như bạn làm trong C ++, bởi vì bạn có GC. Đối với những thời điểm cụ thể bạn cần, bạn có thể sử dụng usingcâu lệnh một cách rõ ràng . Một nhắc nhở nhỏ: giải phóng bộ nhớ là một thủ tục đắt tiền. GC có lợi thế về hiệu suất của chúng trong rất nhiều trường hợp (đặc biệt là khi bạn có nhiều bộ nhớ). Bộ nhớ sẽ không bị rò rỉ và bạn sẽ không dành nhiều thời gian cho việc giải quyết. Hơn nữa, phân bổ cũng nhanh hơn, vì bạn không phân bổ bộ nhớ mỗi lần, chỉ một lần trong một lần. Gọi newchỉ đơn giản là tăng một con trỏ đối tượng cuối cùng.
  • "C # tệ hơn ở chỗ nó có bộ sưu tập rác". Điều này thực sự chủ quan, nhưng như tôi đã nói ở trên, đối với hầu hết các phát triển ứng dụng điển hình, hiện đại, bộ sưu tập rác là một lợi thế.
    Trong C ++, các lựa chọn của bạn là quản lý bộ nhớ theo cách thủ công bằng cách sử dụng newdelete, theo kinh nghiệm luôn dẫn đến lỗi ở đây và ở đó, hoặc (với C ++ 11), bạn có thể sử dụng con trỏ tự động, nhưng hãy nhớ rằng chúng thêm rất nhiều của tiếng ồn cho mã. Vì vậy, GC vẫn có một lợi thế ở đó.
  • "Generics yếu hơn mẫu" - Tôi chỉ không biết bạn lấy nó từ đâu. Các mẫu có thể có lợi thế của chúng, nhưng theo các hạn chế kinh nghiệm của tôi, kiểm tra loại tham số chung, chống chỉ định và hiệp phương sai là các công cụ mạnh mẽ và thanh lịch hơn nhiều. Điểm mạnh trong các mẫu là chúng cho phép bạn chơi với ngôn ngữ một chút, điều này có thể hay, nhưng cũng gây ra nhiều đau đầu khi bạn muốn gỡ lỗi một cái gì đó. Vì vậy, tất cả trong tất cả, các mẫu có các tính năng tốt đẹp của họ, nhưng tôi thấy khái quát thực tế và sạch sẽ hơn.

5
Và nếu bạn vẫn muốn một Garbage Collector cho C ++, bạn có thể tải xuống .
dòng chảy


6
Một tính năng quan trọng khác trong C # so với Java, vì lý do hiệu năng, là "struct", một loại đối tượng có thể được lưu trữ trên ngăn xếp (hoặc trong các thanh ghi CPU, trong trường hợp đặc biệt) hoặc được nhúng trong các đối tượng heap khác. Chúng thường được sử dụng cho các đối tượng nhỏ có các trường 1-4, chẳng hạn như các cặp tọa độ X, Y.
Qwertie

2
@LokiAstari Tâm giải thích? Miễn là bạn nhớ hủy đăng ký xử lý sự kiện và sử dụng mẫu Vứt bỏ trên các lớp có chứa trình bao bọc riêng, bạn sẽ ổn. Điều đó ít được biết và nhớ hơn so với quản lý bộ nhớ trong C ++.
Yam Marcovic

2
-1 vì tôi thiếu các phần "C ++ tốt hơn C # trong đó ..." và "Java tốt hơn C # ...". Tôi không nghĩ C # vượt trội trong tất cả các lĩnh vực nên một câu trả lời mà không có hai phần này có lẽ thiếu một số thông tin quan trọng.
Giorgio

30

Môi trường

.NET Framework và máy khách Windows

Windows là hệ điều hành thống trị trên các máy khách. Các khung GUI tốt nhất cho các ứng dụng Windows là Winforms và WPF cùng với .NET Framework . Ngôn ngữ lập trình tốt nhất để làm việc với .NET Framework và API của nó là C # . Java không phải là một thay thế cho điều này. Và C ++ là một ngôn ngữ cũ hơn mà không cần quản lý bộ nhớ tự động. C # tương tự như C ++ nhưng có quản lý bộ nhớ tự động và bạn không phải làm việc với các con trỏ, điều này giúp bạn làm việc hiệu quả hơn. C ++ vẫn có thể là lựa chọn tốt nhất cho một số trường hợp, nhưng không phải cho các ứng dụng cơ sở dữ liệu chuyên sâu về hình thức phổ biến trong kinh doanh.

Máy chủ IIS và Windows

Nếu bạn đã quen làm việc trong môi trường Windows và với C #, bạn sẽ cần đầu tư ít nhất để học IIS cho lập trình máy chủ và Windows Server cho quản trị cơ bản.

Active Directory và Windows Server

Nếu bạn đang phát triển phần mềm sắp được triển khai trong các mạng công ty, có khả năng họ sử dụng môi trường tập trung vào Windows bằng Windows Server với Active Directory. Trong một môi trường như vậy, nó dễ dàng tích hợp và triển khai một giải pháp được thực hiện trong C #.NET Framework .

Cá nhân tôi là nhà phát triển Java, không phải nhà phát triển C #, nhưng tôi làm việc với web. Tôi sẽ chuyển sang C # nếu tôi đang phát triển các ứng dụng mạng cho mạng Windows. Nhưng tôi thích Java cho các máy chủ web dựa trên Linux. Tôi sẽ chọn C ++ cho các hệ thống nhúng vì tôi sẽ không có nhiều phụ thuộc.

Đúng, C # là ngôn ngữ tốt hơn với các tính năng hiện đại hơn C ++ và Java, nhưng đó không phải là điều quan trọng nhất để chọn C # .

Tóm lược

Môi trường cho phần mềm của bạn là quan trọng nhất để chọn C # . Nếu bạn làm việc trong môi trường với các máy khách Windows, máy chủ Windows, Active Directory, IIS và có thể SQL Server thì C # là ngôn ngữ tốt nhất với .NET Framework .

Nếu bạn làm việc trong môi trường Unix với các dịch vụ web, ví dụ Java sẽ là lựa chọn của tôi. Và nếu bạn làm việc với các hệ thống nhúng hoặc phải tích hợp với các thiết bị phần cứng thì C ++ sẽ là một lựa chọn tốt.


3
Hoàn toàn - đây là lý do tại sao tôi sử dụng C # không thực sự có lý do nào khác
Murph

Bạn chắc chắn có thể sử dụng .NET trên các nền tảng khác thông qua Mono, MonoTouch và MonoDroid, nhưng điểm chuẩn của tôi cho thấy Mono chậm hơn đáng kể so với .NET cho Windows và Compact Framework của Microsoft cực kỳ chậm trên Windows CE: codeproject.com/KB/cross -pl platform / BenchmarkCppVsDotNet.aspx ... tất nhiên, WPF chỉ có sẵn trên Windows (nhưng dù sao tôi cũng không thích nó.)
Qwertie

Ý bạn là phụ thuộc nào "Tôi sẽ chọn C ++ cho các hệ thống nhúng là tôi sẽ không có nhiều phụ thuộc." Bạn có nghĩa là các thư viện java?
Puckl

@Puckl có, nhưng chủ yếu là jvm / jre.
Jonas

"Nếu bạn làm việc trong môi trường Unix với các dịch vụ web", có một số ngôn ngữ và khung khác có thể được xem xét: ruby, Python, node.js, v.v.
MarkJ

15

C # và Java

C # là một ngôn ngữ rất tốt nếu:

  • Bạn muốn làm mục đích chung phát triển hướng đối tượng. Đó là một ngôn ngữ OOP cổ điển, được gõ tĩnh.
  • Bạn chỉ nhắm mục tiêu các nền tảng của Microsoft (đáng nhớ là Microsoft đã nhân bản Java một cách hiệu quả để tạo C # vì họ muốn một ngôn ngữ giống như Java sẽ khóa mọi người vào Windows. Họ có thể sử dụng Java, nhưng điều đó sẽ cho phép mọi người dễ dàng chạy các ứng dụng trên các nền tảng khác ....)

C # như một ngôn ngữ đẹp hơn Java theo nhiều cách khác nhau (cú pháp tốt hơn cho các thuộc tính, loại giá trị, tổng quát thống nhất, v.v.). Tôi thích C # là ngôn ngữ của Java nhưng trong lược đồ lớn, chúng là những ngôn ngữ khá giống nhau và phù hợp với các ứng dụng tương tự.

Mặt khác, Java cũng có một số lợi thế lớn:

  • Hệ sinh thái mã nguồn mở khổng lồ - các thư viện cho Java mà bạn có thể nhận được miễn phí cho đến nay là tốt nhất trong mọi ngôn ngữ. Thật khó để nói quá tầm quan trọng của việc này - từ khi hoàn thành công việc, Java rất hiệu quả.
  • Các công cụ - các công cụ Java theo quan điểm của tôi tốt hơn những gì bạn có thể có được trong thế giới .Net. ví dụ Maven (một khi bạn đã thành thạo nó!) đặc biệt ấn tượng.
  • Khả năng bảo trì - Java đã xuất hiện được một thời gian và đã thành công ở các công ty lớn vì nó tương đối ổn định và đã có rất nhiều nỗ lực đưa vào khả năng tương thích ngược. Cú pháp đơn giản và hơi dài dòng cũng giúp Java ở đây - việc đọc và duy trì mã dễ dàng hơn nếu mã rất rõ ràng và rõ ràng.
  • Các ngôn ngữ mới - JVM có một số ngôn ngữ mới tuyệt vời (Scala, Clojure, Groovy, v.v.) là tương lai của nền tảng Java. Đây là nơi diễn ra nhiều sự đổi mới ngôn ngữ và nó diễn ra nhanh hơn nhiều so với Java hoặc C #.

Vì vậy, Java so với C # là một cuộc gọi khá gần gũi và nó thực sự phụ thuộc vào việc bạn muốn ở trong trại Microsoft hay trại mã nguồn mở / đa nền tảng.

Cá nhân, tôi thích Java vì:

  • Hệ sinh thái thư viện theo quan điểm của tôi quan trọng hơn nhiều là thực tế là C # có cú pháp đẹp hơn Java
  • Về lâu dài, tôi muốn tất cả mã của mình là đa nền tảng chính xác và có thể chạy trên các cụm máy linux giá rẻ trên đám mây.
  • Clojure là IMHO ngôn ngữ hứa hẹn nhất trên thế giới hiện tại và nếu tôi gắn bó với nền tảng JVM, tôi có thể dễ dàng chuyển mã và kỹ năng của mình sang Clojure theo thời gian.

C / C ++

C / C ++ về cơ bản là một con thú hoàn toàn khác. Tôi sẽ không đề xuất nó cho phát triển ứng dụng cho mục đích chung hiện nay vì những lý do sau:

  • Quản lý bộ nhớ - đối với hầu hết các chương trình có mục đích chung hiện nay, bạn không muốn quản lý bộ nhớ của riêng mình. Bộ sưu tập rác trong C # hoặc Java tốt hơn nhiều cho năng suất và sự minh mẫn của bạn so với bất kỳ kỹ thuật quản lý bộ nhớ rõ ràng nào bạn sẽ phải sử dụng trong C / C ++
  • Độ phức tạp - Đặc biệt C ++ là một ngôn ngữ cực kỳ phức tạp. Phải mất một thời gian dài để thành thạo và bản thân mã cũng có thể phức tạp. (Ví dụ, các mẫu C ++ đặc biệt có lông ....)
  • Năng suất - hầu hết thời gian và tất cả những thứ khác đều bằng nhau, bạn sẽ mất nhiều thời gian hơn để hoàn thành công việc trong C / C ++.

Tuy nhiên, chắc chắn đây là một lựa chọn tuyệt vời trong một số lĩnh vực đặc biệt hạn chế, đặc biệt:

  • Hệ điều hành - bạn có thể muốn sử dụng C / C ++ nếu bạn đang viết một hệ điều hành.
  • Phát triển trò chơi - gần như tất cả các công cụ trò chơi thương mại tốt nhất là C / C ++. Đây vẫn là lựa chọn tốt nhất nếu bạn đang phát triển một tựa game AAA đòi hỏi khắt khe (C # và Java hoàn toàn tốt cho các game thông thường / ít đòi hỏi hơn)
  • Điện toán hiệu năng cao - C / C ++ được tối ưu hóa có lẽ là cách tốt nhất để tạo mã hiệu suất rất cao. Đối với hầu hết các ứng dụng thực hiện mức tối ưu hóa này không đáng để bỏ công sức, nhưng trong một số miền nhất định, nó có thể cực kỳ có giá trị (ví dụ: giao dịch tần số cao)
  • Truy cập phần cứng - Bạn cần truy cập trực tiếp vào phần cứng (ví dụ: đối với hệ thống nhúng)

Vì vậy, về cơ bản, C / C ++ là một lựa chọn tuyệt vời nếu và chỉ khi bạn tập trung vào một trong những lĩnh vực mà nó đặc biệt phù hợp.


1
Bạn đề cập đến maven như một ví dụ về các công cụ tốt hơn cho java. Tôi không đặc biệt nổi tiếng với nó, nhưng nhìn vào tài liệu, Maven trông giống như công cụ xây dựng .Net bản địa MSBuild. Điều gì làm cho Maven tốt hơn MSBuild?
Kevin Cathcart

1
+! (chỉ vì tôi chỉ có một phiếu bầu): bạn đã giải thích rất rõ lý do tại sao hệ sinh thái Java tốt hơn và tại sao người ta không nên chỉ so sánh cú pháp của C # vs Java. Java có nhiều thư viện và công cụ tốt hơn. Bản thân ngôn ngữ Java không có nhiều, nhưng các ngôn ngữ mới rất thú vị đang xuất hiện cho JVM, (IMO) thú vị hơn nhiều so với C #. Tôi không biết Clojure nhưng tôi thấy Scala rất thú vị: được thiết kế để trở thành OOP + FP ngay từ đầu.
Giorgio

2
Tại sao mọi người nghĩ rằng mã C ++ chứa đầy quản lý bộ nhớ thủ công. Đó không phải là C mà bạn biết, RAII có nghĩa là bạn gần như không bao giờ phải phân bổ thủ công / bộ nhớ trống (thời gian bạn làm là những ngôn ngữ mà ngôn ngữ như C # sẽ vô dụng với bạn).
gbjbaanb

3
@gbjbaanb - có lẽ vì RAII không đủ để quản lý bộ nhớ cho mục đích chung. Nó không có tính linh hoạt tương đương với một hệ thống GC đầy đủ như bạn thấy trong Java hoặc C #. Ngay khi bạn vượt ra ngoài giới hạn của RAII, bạn sẽ quay lại lãnh thổ quản lý bộ nhớ thủ công.
mikera

3
@mikera Chỉ muốn chỉ ra rằng có khá nhiều sự phát triển ngôn ngữ trên nền tảng .NET. Ví dụ F # ​​là một ngôn ngữ chức năng gọn gàng, tích hợp trơn tru phần còn lại của .NET và Python gần đây đã được chuyển sang .NET dưới dạng Iron Python (và cũng có một IDE đẹp !).
ikh

13
I heard that syntactically they are almost the same.

Cú pháp? Ai cho một con khỉ bay về cú pháp? Cú pháp chỉ tốt cho một điều: cho phép di chuyển nhanh hơn từ các ngôn ngữ tương tự cú pháp. Đó là nó.

C # tốt hơn rất nhiều so với Java. Hãy xem xét hỗ trợ lập trình chung và chức năng của họ - C # đi trước Java. Chưa kể quá tải nhà điều hành, và các công cụ tốt khác - C # là đặc trưng tốt hơn nhiều. Không có cách nào mà Java có thể được coi là tốt hơn C #.

C ++ và C # là một cuộc thi. C ++ có một mô hình biên dịch cổ xưa cực kỳ khó chịu và một loạt các bệnh di sản từ C, nhưng các mẫu của nó mạnh hơn rất nhiều so với thuốc generic và nói chung, các cách tiếp cận quản lý tài nguyên của nó linh hoạt và mạnh mẽ hơn, vì usingnó hoàn toàn thất bại, và nó thực thi nhanh hơn


6
Tôi nghĩ người ta nên so sánh cả các tính năng ngôn ngữ và tính sẵn có của một ngôn ngữ trên các nền tảng khác nhau. Với C #, một bị khóa với Microsoft, với Java thì không: đó là một lợi thế lớn, ít nhất là đối với các nhà phát triển UNIX / Linux. OOP + FP là các tính năng thú vị nhưng tại sao lại bận tâm về C # nếu bạn có thể sử dụng Scala, chạy trên JVM và có thể giao tiếp với mã Java kế thừa? Tôi sẽ không bao giờ học một ngôn ngữ dành riêng cho nền tảng trừ khi tôi bị ép buộc.
Giorgio

2
@Giorgio: Dự án Mono không tồn tại. Nhưng thứ hai, Microsoft thực sự quan tâm đến nền tảng của họ - họ cung cấp cho nó những nâng cấp lớn thường xuyên. Java hầu như không có gì mới. Ngoài ra, câu hỏi là về C # vs Java, không phải CLR vs JVM.
DeadMG

4
@DeadMG: Theo như tôi biết, tôi không thể lấy bất kỳ chương trình C # nào được phát triển trên Windows và xây dựng nó bằng Mono. Không phải CLR vs JVM? Câu hỏi là về lý do tại sao mọi người sử dụng C # hoặc Java. Để mọi người sử dụng ngôn ngữ, họ cần có thời gian chạy và hệ điều hành. Tôi không thảo luận về thực tế rằng C # có nhiều tính năng hơn Java, nhưng Java dễ mang theo hơn nhiều: đây là yếu tố có thể ảnh hưởng đến việc áp dụng ngôn ngữ. Trong thực tế, Java vẫn được sử dụng thường xuyên hơn C # ngay cả khi nó thiếu một số tính năng nâng cao nhất định.
Giorgio

3
@Giorgio, bạn có thể lấy bất kỳ chương trình C # nào và xây dựng nó với Mono. Bạn không thể sử dụng một số thư viện nhất định (dù sao đó không phải là một phần của ngôn ngữ C #). Và java không phải là "di động hơn nhiều". Bạn có thể mã cho iOS bằng C #, nhưng không phải bằng Java chẳng hạn.
SK-logic

2
@Giogio, Mono ít nhất là di động như JVM.
SK-logic

7

Vâng C#có một số tính năng tích hợp tốt như LINQvà đại biểu. Nó đang nhận được tốt nhất từ ​​cả hai thế giới - JavaC++. Nhìn vào đây để so sánh đầy đủ.

Nhưng tôi thích Javathế giới hơn - các khung nguồn mở hơn nhiều và nó chạy trên mọi nền tảng. Và đừng nói với tôi về Mono- đó không phải là một lựa chọn đáng tin cậy.


9
+1: "Nhưng tôi thích thế giới Java hơn - các khung công tác nguồn mở nhiều hơn và nó chạy trên mọi nền tảng." Hãy hy vọng Oracle không thay đổi điều này!
Giorgio

15
Tâm trí giải thích, những gì không "đáng tin cậy" trong Mono?
SK-logic

2
@Petar Minchev, Không có gì ngoài lỗi của bạn. Bạn phải tuân theo các nguyên tắc về tính di động và bạn không nên sử dụng các thư viện không di động - và theo cách này, bất kỳ ứng dụng phức tạp nào cũng sẽ chạy đáng tin cậy với Mono. Những thứ như WPF sẽ không bao giờ được chuyển.
SK-logic

2
@Petar Minchev, có rất nhiều thư viện Java không di động ngoài kia. Bạn phải luôn thận trọng về tính di động, bất kể bạn đang sử dụng ngôn ngữ nào. Và dù sao, câu hỏi là về các ngôn ngữ, không phải các thư viện bên thứ ba.
SK-logic

3
@Petar Minchev, GTK # là hàng xách tay. Sử dụng nó thay thế.
SK-logic

3

Theo một số nguồn (xem ví dụ: http://www.indeed.com/jobtrends ) C # vẫn ít phổ biến hơn Java và phổ biến như C ++.

C # không cung cấp các tính năng mà Java thiếu, ví dụ: hỗ trợ trực tiếp cho các thành ngữ lập trình nhất định như các thuộc tính, kiểu lập trình chức năng, v.v. C # có mức độ trừu tượng cao hơn C ++, đây là một lợi thế khi thời gian phát triển quan trọng hơn là tốc độ chương trình.

Cá nhân, tôi vẫn thích thế giới Java / C ++. Như Petar Minchev đã nói, Java có nhiều khung và ứng dụng nguồn mở hơn, nó chạy ở mọi nơi, ít bị ràng buộc với một nhà cung cấp và hệ điều hành cụ thể. C ++ có những ưu điểm tương tự, mặc dù mã thường cần sự thích ứng đi từ nền tảng này sang nền tảng khác. Vì tôi thích phát triển trên Linux và theo hiểu biết của tôi, tôi không thể tìm hiểu đầy đủ về C # trên Linux, tôi không bao giờ có hứng thú thực sự với C # vì nhu cầu lập trình của tôi được bảo vệ bởi C, C ++, Java, Scala.

Mặt khác, đối với nhiều nhà phát triển bị ràng buộc với một nhà cung cấp cụ thể không phải là vấn đề: Microsoft có vị trí thống lĩnh trong thị trường hệ điều hành và C # mang lại rất nhiều cơ hội việc làm. Do đó, IMO nhiều nhà phát triển chấp nhận C # bởi vì, ngoài việc là một ngôn ngữ giàu tính năng, nó còn là một khoản đầu tư tốt.


"Tôi không thể chạy hoàn toàn C # trên Linux" - Bạn có thể nói rõ hơn về điều này? Bạn có nghĩa là khung .Net đầy đủ không khả dụng vì tôi không gặp phải bất kỳ vấn đề nào với chính ngôn ngữ C # (hoặc F # cho vấn đề đó) trên Linux?
Wesley Wiser

@wawa: Theo hiểu biết của tôi, khung .Net tương ứng với JDK và khung .Net chỉ có sẵn cho Windows trong khi JDK có sẵn cho một số hệ điều hành. Nếu điều này không đúng, tôi có thể chỉnh sửa câu trả lời của mình (và cũng thay đổi ý kiến ​​của mình).
Giorgio

1
Tôi nghĩ rằng một sự tương tự gần hơn sẽ là Thư viện lớp cơ sở với JDK. BCL có các bộ phận tiêu chuẩn hóa và không chuẩn. Dự án mono thực hiện các tiêu chuẩn cũng như nhiều phần không chuẩn.
Wesley Wiser

@wawa: Cảm ơn bạn đã thông tin. Tôi đang xem xét cho C # dùng thử Mono. Tuy nhiên, tôi vẫn có một cảm giác khá mạnh mẽ rằng C # gắn chặt với Microsoft hơn Java so với Oracle (hoặc với Sun trong quá khứ).
Giorgio

3

Thế còn "Khung phát triển phần mềm nào, bao gồm ngôn ngữ lập trình" thì tốt hơn?

Bạn đã quên bao gồm những thứ khác, như "môi trường" bạn sẽ làm việc cùng.

  1. Bạn sẽ chỉ làm việc cho HĐH Windows, nhưng, không phải ở mức độ thấp, và có nhiều bộ nhớ và các tài nguyên khác?

    Chọn .NET làm khung trên Windows và sử dụng C #.

  2. Bạn sẽ chỉ làm việc cho Windows, nhưng, không phải ở mức độ thấp, NHƯNG, không có nhiều tài nguyên?

    Chọn Khung Delphi (và ngôn ngữ lập trình Object Pascal Delphi hoặc ngôn ngữ lập trình Lazarus Object Pascal)

  3. Là ứng dụng của bạn. cần thiết để hỗ trợ một số nền tảng, như trò chơi, trong các điện thoại di động khác nhau?

    Chọn Khung công tác Java và ngôn ngữ lập trình Java.

  4. Có phải Linux với KDE là giao diện đồ họa?

    Chọn khung QT, với C ++

  5. Có phải Linux với Gnome là giao diện đồ họa?

    Chọn khung GObject / GLib, với C ++

  6. Bạn sẽ làm việc với rất nhiều hoạt động cấp thấp, như phát triển trình điều khiển?

    Plain C hoặc C ++ được sử dụng cho một số Hệ điều hành, với các thư viện chuẩn, làm khung.

Chỉ 2 xu của tôi.


1
Tôi không chắc chắn về 3. Điện thoại thông minh rất phổ biến hiện nay và AFAIK, tất cả chúng đều hỗ trợ C # dưới một số hình thức, nhưng chỉ Android hỗ trợ Java.
Svick

Delphi không chết à? :)
šljaker

@ šljaker Không, nhưng, không phải là những ngày rất phổ biến.
umlcat

1
@svick: Đó là một lời nói dối. Ngoài Android, Java cũng tồn tại ở một số dạng trên iOS, Symbian, WinMo, Blackberry, Maemo và WebOS (tức là mọi thứ quan trọng hoặc vẫn còn quan trọng; đừng bắt đầu với những nền tảng nhỏ hơn nữa). Android, Blackberry và Symbian chính thức hỗ trợ Java làm tùy chọn phát triển; Sun đã từng hỗ trợ Java trên iOS ngay cả khi Apple không ưa thích nó. Java là ngôn ngữ phát triển chính trong điện thoại Android và Blackberry. Tôi không thể nói tương tự với C #, AFAICT nó chỉ được hỗ trợ chính thức trên WinMo.
Lie Ryan

1

Nếu bạn thực hiện tìm kiếm, bạn có thể sẽ vấp ngã khi thảo luận về các ngôn ngữ lập trình hàng đầu. Đây là một trong những kết quả tìm kiếm - http://www.tiobe.com/index.php/content/apersinfo/tpci/index.html - Java dường như vẫn là ngôn ngữ phổ biến nhất.

Java đã cố gắng loại bỏ một số thiếu sót của C ++ (và làm cho cuộc sống của các lập trình viên trở nên đơn giản hơn đối với các ứng dụng không theo thời gian thực và không quan trọng). C # là người đến muộn trong bữa tiệc, đã tránh được một số thiếu sót của ngôn ngữ Java. C # đã đạt được nhiều tiến bộ (vì Microsoft có nhiều quyền kiểm soát đối với nó) trong khi những tiến bộ trong Java đã bị chặn trong một khoảng thời gian đáng kể do xung đột giữa các bên liên quan.


1

Một vài điều chưa được đề cập:

C # tốt hơn C ++ vì:

Nó không đi với các tập tin tiêu đề, mà chuyển thành rất đơn giản.

C # tốt hơn Java vì:

Nó hỗ trợ cả các loại do người dùng xác định loại tham chiếu (lớp) và loại giá trị (struct), nếu bạn biết bạn đang làm gì, có thể mang lại lợi ích hiệu suất đáng kể.

Nó hỗ trợ các đại biểu, giống như các giao diện phương thức đơn, do đó đơn giản hóa rất nhiều việc mã hóa các cấu trúc xảy ra thường xuyên liên quan đến các đối tượng phương thức đơn.


Bạn có thể giải thích theo cách nào có cả loại loại tham chiếu và loại giá trị có thể mang lại lợi ích hiệu suất trong C # không?
Giorgio

Ví dụ, nếu bạn muốn có một mảng các bản ghi, trong Java bạn không có tùy chọn nào ngoài việc mô tả bản ghi của bạn bằng một lớp, vì vậy mảng của bạn sẽ là một mảng các tham chiếu đến vô số các đối tượng được phân bổ riêng biệt. Trong C #, bạn có thể mô tả bản ghi của mình bằng cấu trúc, vì vậy mảng của bạn sẽ chỉ là một vùng bộ nhớ liên tục chứa các cấu trúc của bạn lần lượt, giống như trong C.
Mike Nakis

Một ví dụ khác, nếu bạn muốn xác định một loại mới nhỏ, (một loại sẽ phù hợp với một từ máy,) bạn không phải xác định một lớp mới cho loại đó; bạn chỉ có thể làm cho nó một cấu trúc, vì vậy nó sẽ tuân theo ngữ nghĩa giá trị. Truyền các cấu trúc như vậy xung quanh sẽ không tốn kém hơn so với chuyển các tham chiếu đến các đối tượng, nhưng bạn sẽ có lợi ích là không phân bổ, xây dựng và thu gom rác bất kỳ đối tượng nào.
Mike Nakis

Tôi hiểu. Vì vậy, các lớp được khởi tạo trên heap và được truy cập thông qua các tham chiếu trong khi các cấu trúc được khởi tạo trên stack (?)
Giorgio

Gần đúng. Sự không chính xác duy nhất trong tuyên bố này là một cấu trúc sẽ được tìm thấy trên heap nếu nó được nhúng bên trong một đối tượng khác, hoặc nếu nó nằm trong một chuỗi các cấu trúc. Và nó cũng sẽ được tìm thấy trên heap nếu nó được đóng hộp, theo cách chính xác giống như các loại giá trị được đóng hộp trong Java.
Mike Nakis

1

Bạn nên chọn ngôn ngữ tốt nhất cho môi trường mong đợi và chuyên môn của bạn.

Chọn C # nếu bạn đang làm việc trong môi trường duy nhất của Microsoft. Mặc dù C # được tiêu chuẩn hóa theo ISO / IEC 23270: 2003, phiên bản của Microsoft vẫn là bản triển khai hoàn chỉnh duy nhất. Một số phần chính của ngôn ngữ không được bao gồm trong tiêu chuẩn và do đó phải tuân theo bằng sáng chế của Microsoft. Không ai khác sẽ triển khai phiên bản ngôn ngữ hoàn toàn tương thích cho các hệ thống khác, do đó, trên thực tế, bạn là nhà cung cấp bị khóa với Microsoft Windows và .Net miễn là bạn sử dụng ngôn ngữ này. Nếu bạn đang tìm kiếm các kỹ năng để sử dụng trong thị trường di động, tốt nhất nên tìm đến một ngôn ngữ khác.

Java hoạt động, nhưng có nhiều chi phí hoạt động, một phần do các tính năng như bộ sưu tập rác. Java cũng không được tiêu chuẩn hóa bởi ISO / IEC, vì vậy bạn không có gì đảm bảo nếu bạn chuyển đổi các nền tảng và phiên bản Java, chỉ có ý định tốt nhất của Sun / Oracle. Nếu cuối cùng bạn có kế hoạch làm việc với Android, đây chắc chắn là con đường để đi. Lập trình của Android về cơ bản là Java, với một vài thay đổi.

C ++ được chuẩn hóa và hầu hết tất cả các trình biên dịch đều tuân theo tiêu chuẩn quốc tế, vì vậy bạn đã đảm bảo hành vi NHƯNG ngôn ngữ không bảo vệ bạn khỏi chính bạn. Bạn phải tự mình thực hiện dọn dẹp và kiểm tra tràn. Điều này không khó. Các lập trình viên C / C ++ đã làm những việc này trong nhiều năm. Apple sử dụng Objective C cho mọi thứ, vì vậy nếu bạn muốn nhắm đến Apple, tôi khuyên bạn nên thử điều này thay thế.

Nếu bạn thấy mình rời khỏi Windows vào một lúc nào đó, tôi khuyên bạn nên học cả C / C ++ và Java - cả hai đều có thể bán được tại thời điểm này.


0

Liên quan đến C ++ so với C # (vì tôi không đủ thành thạo Java), điều tôi thiếu ở đây là khả năng truy cập các công cụ lowlevel trên Windows. Ví dụ: bạn không thể phát triển trình điều khiển hiển thị gốc trong C # (chưa), nhưng bạn có thể với C ++. Điều này không làm cho C ++ tốt hơn. Tôi thấy C ++ so với C # là hội so với C.

C # theo quan điểm của tôi hiệu quả hơn nhiều nếu bạn nhìn vào thời gian cần thiết để thực sự thực hiện một tính năng. Hình phạt hiệu năng của thời gian chạy .Net không đáng kể đối với 99% các ứng dụng được phát triển. Nó có thể có ý nghĩa nếu bạn đang chạy một vòng lặp chặt chẽ, vâng, bằng mọi cách, nhưng hầu hết thời gian một ứng dụng không hoạt động, chờ đợi bất kỳ loại đầu vào, tín hiệu hoặc ngắt (đĩa IO, nhấp vào nút, mạng, hoàn thành hoạt hình) .

Thư viện CLR với tất cả các chức năng của mình có một lợi ích lớn khác. Khi tôi đang đào tạo C # cho các nhà phát triển cơ sở, hầu hết trong số họ nói rằng họ thích quy ước đặt tên logic của các lớp, thành viên và không gian tên. Tìm một tính năng của phương thức là hợp lý trên SDK, một điều mà Visual Basic 5 đã bị thiếu sót nghiêm trọng. Điều này đã giúp họ rất nhiều trong việc áp dụng thư viện. Sau khi học cú pháp của một ngôn ngữ, việc học một thư viện mới có ý nghĩa quan trọng trong việc nắm bắt tốt bất kỳ SDK nào. Nó tiết kiệm cho bạn khỏi phát minh lại bánh xe.

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.