Tại sao C # có nhiều tính năng hơn Java? [đóng cửa]


14

Xin lưu ý rằng điều này không có nghĩa là một đối số Java so với C #. Tôi là một lập trình viên Java không có kinh nghiệm về C #, chỉ tò mò thôi.

Tôi đã đọc một số thứ trên C # và có vẻ như nó có nhiều tính năng hơn Java. Một số ví dụ:

  • Kiểu suy luận.
  • dynamic từ khóa.
  • Đại biểu.
  • Thông số tùy chọn.
  • Lambda và LINQ (Tôi thực sự không biết những thứ này là gì).
  • Tính chất.

Tuy nhiên, Java không thực sự có bất cứ thứ gì mà C # không có.

Câu hỏi của tôi là: tại sao C # có nhiều tính năng bản địa hơn Java? Và tại sao Java không thêm một số trong số này trong suốt những năm qua, ví dụ như Thuộc tính hoặc kiểu suy luận? Các nhà thiết kế ngôn ngữ Java có cách tiếp cận đơn giản hơn không? Lý do cho điều này là gì?


2
@Patrick - Đó là một tính năng - hay một chi tiết triển khai?
Pete

14
Câu trả lời thiên vị: Bởi vì nhóm thiết kế C # biết họ đang làm gì. Câu trả lời hợp lý hơn: C # được thiết kế với kiến ​​thức về các thất bại của Java và không có giáo điều "chỉ OO thuần túy" (mà chúng thậm chí còn không hoàn toàn bị ảnh hưởng). Một nửa trong số các tính năng này được nhập khẩu số lượng lớn từ Lisp và Haskell, hai ngôn ngữ Java kiên quyết từ chối lấy cảm hứng cho đến khi java 8 và các ngôn ngữ khác là những cải tiến rõ ràng do thiếu Java rõ ràng.
Phoshi

4
Bởi vì C # xuất hiện muộn hơn và ban đầu là sự lột xác trắng trợn của Java và sau đó có cơ hội bổ sung mọi thứ có vẻ đáng giá, trong khi Java bị cản trở bởi các mục tiêu tương thích ngược rất nghiêm ngặt.
Kilian Foth

2
@ Clockwork-Muse nhưng C # có hai triển khai thời gian chạy - CLR và Mono. Ngoài ra còn có Xamarin. Tôi chưa nghe nói về một giải pháp duy nhất để xây dựng các dự án iOS / Android / WinPhone chéo bằng Java.
Den

4
@KilianFoth: Trên thực tế, C # ban đầu là một sự lột xác của Delphi , được viết lại để trông giống như Java. Microsoft thậm chí đã câu trộm kiến ​​trúc sư dự án Delphi khỏi Borland để tạo ra nó.
Mason Wheeler

Câu trả lời:


22

Nhiều lý do:

  1. C # đến muộn hơn Java; phiên bản 1 là sự lột xác trắng trợn của Java 1.4, vì vậy nó có khá nhiều thứ mà Java có tại thời điểm đó.
  2. Nhưng sau đó, C # đã phát triển nhanh hơn nhiều so với Java, bởi vì đây là một nền tảng mới thú vị (và có một trình điều khiển cực kỳ xuất sắc trong Anders Hejlsberg, cha đẻ của Turbo Pascal). Điều đó cho phép họ tránh tất cả các lỗi trong Java đã trở nên rõ ràng, đồng thời bổ sung mọi thứ mà các học viên Java mong muốn.
  3. Trong khi đó, Java bị cản trở bởi các mục tiêu tương thích ngược rất nghiêm ngặt và tốc độ phát triển chậm hơn một phần, một phần vì nó đã cố gắng để có được danh tiếng là giải pháp tiêu chuẩn, đáng tin cậy, không đáng ngạc nhiên cho 95% người không thiên tài lập trình viên. Lúc này họ đã thành công, có lẽ hơi quá.

Kết quả là Java bây giờ có một chút lỗ hổng về tính năng. Nó có những kế hoạch lớn cho tương lai, nhưng như thường lệ với những thứ này, mọi thứ sẽ mất nhiều thời gian hơn so với kế hoạch.


7
Tôi không chắc là tôi đồng ý với điều này. Ý tôi là tất cả đều đúng, nhưng tôi nghi ngờ rằng lý do có liên quan nhiều hơn đến chính trị xung quanh sự sụp đổ của Mặt trời. Java về cơ bản đã có hơn 5 năm hoặc lâu hơn khi không có tổ chức / lãnh đạo - vì vậy không có tính năng mới.
Telastyn

7
C # 1 có các loại giá trị. Một cái gì đó mà Java sẽ không bao giờ có. Vì vậy, không chỉ là một "rip-off trắng trợn".
Den

1
@Telastyn - Tôi nghĩ đó là lý do quan trọng nhất ở đây. Đặc biệt là khi bạn thêm "và sau đó bạn có được lời sấm truyền" đến cuối sự sụp đổ của Mặt trời.
Wyatt Barnett

7
Đồng ý với @Den. Tôi nghĩ lý do lớn nhất để C # phát triển nhanh hơn (và đi đúng hướng) là sự lãnh đạo của Anders Hejlsberg. Anh và nhóm của mình đã thêm các tính năng tốt nhất từ ​​các ngôn ngữ khác và quản lý để tích hợp chúng một cách liền mạch vào C #. Kết quả là C # có các tính năng ngôn ngữ rất gọn gàng mà không cảm thấy lộn xộn hoặc lộn xộn.
David Kirkland

1
@WesleyWiser - được nâng cấp thành "có thể có trong tương lai".
Den

4

Tôi sẽ thêm vào câu trả lời của Kilian rằng một điểm khác biệt lớn giữa Java và C # là các nhà thiết kế C # không chỉ kiểm soát ngôn ngữ mà còn cả IDE tiêu chuẩn.

Thêm một cái gì đó như phương thức mở rộng và các lớp một phần có thể là một cơn ác mộng trong phiên bản phát triển / kiểm soát nếu các IDE không hỗ trợ đúng cách.

Vì bạn dự kiến ​​có thể biên dịch Java với nền tảng lựa chọn của bạn (Eclipse, Netbeans, vi + Ant), việc thêm các tính năng phá mã (và sử dụng các tính năng này để phát triển các tiện ích mở rộng bổ sung như LINQ) phức tạp hơn nhiều so với chỉ nói " vì IntelliSense sẽ giải quyết các trường hợp này, chúng tôi không cần phải lo lắng ".

Ngoài ra, đôi khi đáng chú ý giá trị của các tính năng thay vì số lượng của nó. Ví dụ, các thuộc tính tự động là tốt và tôi chắc chắn muốn Java hỗ trợ điều này, nhưng cuối cùng, điều đó chỉ có nghĩa là bạn phải viết thêm một vài dòng mã trong Java. Tương tự, tôi thấy rằng việc gọi "Sự kiện" là một tính năng có phần sai, vì chúng ít hơn các đại biểu được gắn nhãn đặc biệt và chỉ là một bản sao tinh chỉnh của mẫu Observer đã được Java sử dụng (sau đó, trong Java, nó cần rõ ràng hơn mã hóa)

Đừng hiểu sai ý tôi, tôi nghĩ rằng C # đã giới thiệu một số cải tiến đáng chú ý và tôi ước rằng một ngày nào đó, các ông chủ lớn của Oracle sẽ thức dậy và tung ra một "Java 2" thực sự để bao gồm một số trong số đó, nhưng khoảng cách không rõ ràng như của bạn điểm câu hỏi.


2
Chín dòng cần thiết cho một định nghĩa thuộc tính đơn giản (khai báo + get / set + khoảng trắng) nhanh chóng tăng lên nhiều hơn "một vài".
kevin cline

@kevincline và tôi cũng tài liệu đúng cả setters và getters. Nhưng cuối cùng, ngay cả khi tôi không sử dụng việc tạo mã tự động IDE cho người truy cập, tôi cũng không sử dụng bất kỳ khoảng thời gian đáng chú ý nào với những điều này, khi bạn dành thời gian cho logic kinh doanh, thử nghiệm, thiết kế mã (thực tế Tôi chủ yếu nghĩ về những điều này ngay cả khi gõ các phụ kiện). Vì vậy, trong khi tốt đẹp, nó không phải là thứ tạo ra sự khác biệt lớn cuối cùng ...
SJuan76

3
Đây không phải là lúc để viết chúng. Đây là thời gian để đọc và bỏ qua chúng, lặp đi lặp lại nhiều lần, trong khi bạn đang trên đường đến những phần thú vị.
kevin cline

@kevincline Tôi đồng ý, đó là khả năng dễ đọc và mã được rõ ràng. Đây là lý do tại sao tôi đánh giá cao những thứ như Sự kiện, vốn chỉ là một mẫu Người quan sát tích hợp, nhưng làm cho mọi thứ trở nên gọn gàng hơn nếu bạn phải tự viết những thứ này
Cohn

@AvivCohn Điều này là, "tích hợp" là phần quan trọng. Bạn có thể có động văn trong lắp ráp, bạn có thể có chức năng bậc cao trong C, mọi tính năng ngôn ngữ duy nhất bạn có thể có có thể trong lắp ráp - rõ ràng, vì tại một số điểm, nó vẫn chạy trên CPU x86 của bạn. Bạn hiếm khi cần triển khai mẫu Lệnh trong C #, vì bạn có đại biểu. Tương tự với Observer và các sự kiện, và nhiều người khác. Java đã có các phương thức ẩn danh trong một thời gian, nhưng bạn phải tạo ra một kiểu ẩn danh hoàn toàn . Tất cả những thứ đó là nhỏ bé, nhưng chúng cộng lại.
Luaan
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.