เหตุใด C # จึงมีคุณสมบัติมากกว่า Java [ปิด]


14

โปรดทราบว่านี่ไม่ได้หมายถึงอาร์กิวเมนต์ของ Java vs. C # ฉันเป็นโปรแกรมเมอร์ Java ที่ไม่มีประสบการณ์แบบ C # ขอเพียงแค่ความอยากรู้อยากเห็น

ฉันได้อ่านบน C # และดูเหมือนว่ามันมีคุณสมบัติมากกว่า Java ตัวอย่างจำนวนมาก:

  • การอนุมานประเภท
  • dynamic คำสำคัญ.
  • ผู้ได้รับมอบหมาย
  • พารามิเตอร์ทางเลือก
  • แลมบ์ดาและ LINQ (ฉันไม่รู้จริงๆว่ามันคืออะไร)
  • คุณสมบัติ.

อย่างไรก็ตาม Java ไม่ได้มีคุณสมบัติอะไรที่ C # ไม่มี

คำถามของฉันคือ: ทำไม C # ถึงมีฟีเจอร์เนทีฟมากกว่า Java? และทำไม Java ไม่ได้เพิ่มสิ่งเหล่านี้ตลอดทั้งปีเช่นคุณสมบัติหรือการอนุมานประเภท? นักออกแบบภาษาจาวาใช้แนวทางที่เรียบง่ายกว่านี้หรือไม่? อะไรคือสาเหตุของสิ่งนี้?


2
@Patrick - นั่นคือคุณสมบัติ - หรือรายละเอียดการใช้งานหรือไม่?
Pete

14
คำตอบที่เอนเอียง: เนื่องจากทีมออกแบบ C # รู้ว่าพวกเขากำลังทำอะไร คำตอบที่สมเหตุสมผลมากขึ้น: C # ได้รับการออกแบบโดยมีความรู้เกี่ยวกับความล้มเหลวของ Java และไม่มีหลักการ "OO ที่บริสุทธิ์เท่านั้น" ครึ่งหนึ่งของฟีเจอร์เหล่านั้นมีการนำเข้าจำนวนมากจาก Lisp และ Haskell ซึ่งเป็นสองภาษา Java ที่ปฏิเสธไม่ได้รับแรงบันดาลใจจากจวบจนกระทั่งจาวา 8 และอีกอย่างหนึ่งคือการปรับปรุงด้านสติ
Phoshi

4
เพราะ C # มาในภายหลังและเริ่มถูกฉีกออกอย่างชัดเจนของ Java และจากนั้นมีโอกาสที่จะเพิ่มทุกอย่างที่กลายเป็นสิ่งที่คุ้มค่านอกจากนี้ในขณะที่ Java ถูกขัดขวางโดยเป้าหมายความเข้ากันได้แบบย้อนหลังที่เข้มงวดมาก
Kilian Foth

2
@ Clockwork-Muse แต่ C # มีการใช้งานรันไทม์สองรายการ - CLR และ Mono นอกจากนี้ยังมี Xamarin ฉันไม่เคยได้ยินคำตอบเดียวสำหรับการสร้าง cross iOS / Android / WinPhone project โดยใช้ Java
Den

4
@KilianFoth: ที่จริงแล้ว C # เดิมทีเป็นแบตเตอรีของDelphiซึ่งเขียนขึ้นใหม่ให้ดูเหมือน Java ไมโครซอฟท์ตุ๋นสถาปนิกโครงการ Delphi ห่างจาก Borland เพื่อสร้าง
Mason Wheeler

คำตอบ:


22

เหตุผลหลายประการ:

  1. C # มาช้ากว่า Java; version 1 นั้นเป็นการฉีกขาดของ Java 1.4 ดังนั้นมันจึงมีทุกสิ่งที่ Java มีอยู่ในตอนนั้น
  2. แต่ C # นั้นพัฒนาเร็วกว่า Java มากเพราะมันเป็นแพลตฟอร์มใหม่ที่น่าตื่นเต้น (และมีไดรเวอร์ที่ยอดเยี่ยมที่สุดใน Anders Hejlsberg พ่อของ Turbo Pascal) สิ่งนี้อนุญาตให้พวกเขาหลีกเลี่ยงข้อผิดพลาดทั้งหมดใน Java ที่เห็นได้ชัดในขณะที่เพิ่มทุกสิ่งที่ผู้ปฏิบัติงาน Java ต้องการ
  3. ในขณะเดียวกัน Java ถูกขัดขวางด้วยเป้าหมายด้านความเข้ากันได้แบบย้อนหลังที่เข้มงวดมากและมีการพัฒนาที่ช้าลงส่วนหนึ่งเป็นเพราะพยายามอย่างยิ่งยวดที่จะได้รับชื่อเสียงในการเป็นมาตรฐานกล้าได้กล้าเสียเชื่อถือได้และไม่น่าแปลกใจสำหรับ 95% ของอัจฉริยะ โปรแกรมเมอร์ ที่นี่พวกเขาประสบความสำเร็จอาจจะดีเกินไป

ผลที่ได้คือตอนนี้ Java มีช่องว่างเล็กน้อย มันมีแผนขนาดใหญ่สำหรับอนาคต แต่ตามปกติกับสิ่งต่าง ๆ ทุกอย่างใช้เวลานานกว่าที่วางแผนไว้เล็กน้อย


7
ฉันไม่แน่ใจว่าฉันเห็นด้วยกับเรื่องนี้ ฉันหมายความว่ามันเป็นเรื่องจริง แต่ฉันสงสัยว่าเหตุผลนั้นเกี่ยวข้องกับการเมืองรอบการล่มสลายของดวงอาทิตย์มากขึ้น Java นั้นมีอายุ 5+ ปีขึ้นไปโดยที่ไม่มีองค์กร / ผู้นำ - ดังนั้นจึงไม่มีคุณสมบัติใหม่
Telastyn

7
C # 1 มีประเภทค่า สิ่งที่ Java จะไม่มี ดังนั้นไม่ใช่แค่ "การฉีกออกที่เห็นได้ชัด"
Den

1
@Telastyn - ฉันคิดว่านั่นเป็นเหตุผลเดียวที่สำคัญที่สุดที่นี่ โดยเฉพาะอย่างยิ่งเมื่อคุณเพิ่ม "แล้วคุณจะได้รับโดย oracle" ในตอนท้ายของการล่มสลายของดวงอาทิตย์
ไวแอตต์บาร์เน็ตต์

7
เห็นด้วยกับ @Den ฉันคิดว่าเหตุผลที่ดีที่สุดสำหรับการพัฒนา C # เร็วขึ้น (และในทิศทางที่ถูกต้อง) คือความเป็นผู้นำของ Anders Hejlsberg เขาและทีมของเขาได้เพิ่มคุณสมบัติที่ดีที่สุดจากภาษาอื่น ๆ และจัดการเพื่อรวมเข้ากับ C # ได้อย่างราบรื่น ผลลัพธ์ก็คือ C # มีคุณสมบัติทางภาษาที่เรียบร้อยมากโดยไม่รู้สึกรกหรือยุ่งเหยิง
David Kirkland

1
@WesleyWiser - อัปเกรดเป็น "อาจมีในอนาคต"
Den

4

ฉันจะเพิ่มคำตอบของ Kilian ว่าหนึ่งความแตกต่างใหญ่ระหว่าง Java และ C # คือนักออกแบบ C # ไม่เพียงควบคุมภาษา แต่ยัง IDE มาตรฐาน

การเพิ่มบางอย่างเช่นวิธีการขยายและคลาสบางส่วนอาจเป็นฝันร้ายในการพัฒนา / ควบคุมเวอร์ชันหาก IDE ไม่สนับสนุนอย่างถูกต้อง

เนื่องจากคุณคาดว่าจะสามารถรวบรวม Java ด้วยแพลตฟอร์มที่คุณเลือก (Eclipse, Netbeans, vi + Ant) การเพิ่มคุณสมบัติที่ทำลายรหัส (และใช้สิ่งเหล่านี้เพื่อพัฒนาส่วนขยายเพิ่มเติมเช่น LINQ) มีความซับซ้อนมากกว่าแค่พูดว่า " เนื่องจาก IntelliSense จะจัดการกับกรณีเหล่านี้เราจึงไม่ต้องกังวล "

นอกจากนี้บางครั้งมันก็คุ้มค่าที่จะสังเกตเห็นคุณค่าของคุณสมบัติแทนที่จะเป็นจำนวนของมัน ตัวอย่างเช่นคุณสมบัติอัตโนมัตินั้นดีและฉันก็หวังว่า Java จะรองรับสิ่งนี้ แต่ท้ายที่สุดหมายความว่าคุณต้องเขียนโค้ดอีกสองสามบรรทัดใน Java ในทำนองเดียวกันฉันพบว่าการเรียกคุณลักษณะ "เหตุการณ์" นั้นค่อนข้างผิดเพราะพวกเขามีเพียงเล็กน้อยมากกว่าผู้ได้รับมอบหมายพิเศษและมีเพียงสำเนาของรูปแบบการสังเกตการณ์ที่ใช้แล้วโดย Java (จากนั้นอีกครั้งใน Java การเข้ารหัส)

อย่าเข้าใจฉันผิดฉันคิดว่า C # ได้แนะนำนวัตกรรมที่น่าสังเกตหลายอย่างและฉันหวังว่าสักวันหนึ่งเจ้านายใหญ่ของออราเคิลจะตื่นขึ้นมาและเปิดตัว "Java 2" จริง ๆ เพื่อรวมบางส่วน แต่ช่องว่างไม่ชัดเจน คะแนนคำถาม


2
เก้าบรรทัดที่จำเป็นสำหรับการนิยามคุณสมบัติแบบง่าย (การประกาศ + รับ / ชุด + ช่องว่างสีขาว) เพิ่มขึ้นอย่างรวดเร็วมากกว่า "ไม่กี่"
วินไคลน์

@kevincline และฉันยังทำเอกสารอย่างถูกต้องทั้ง setters และ getters แต่ในที่สุดแม้ว่าฉันจะไม่ได้ใช้การสร้างรหัสอัตโนมัติ IDE ของฉันสำหรับการเข้าถึงฉันไม่ได้ใช้จำนวนเวลาที่เห็นได้ชัดเจนเหล่านี้เมื่อคุณปัจจัยในเวลาที่ใช้ในตรรกะทางธุรกิจการทดสอบการออกแบบรหัส (ในความเป็นจริง ฉันมักจะคิดเกี่ยวกับสิ่งเหล่านี้แม้ในขณะที่พิมพ์ accessors) ดังนั้นในขณะที่ดีมันไม่ใช่สิ่งที่สร้างความแตกต่างอย่างมากในตอนท้าย ...
SJuan76

3
ไม่ใช่เวลาที่จะเขียน ถึงเวลาที่จะอ่านและเพิกเฉยพวกเขาซ้ำแล้วซ้ำอีกในขณะที่คุณกำลังเดินทางไปยังส่วนที่น่าสนใจ
วินไคลน์

@ kevincline ฉันเห็นด้วยมันเป็นสิ่งที่อ่านได้ง่ายและรหัสก็สะอาดดี นี่คือเหตุผลที่ฉันให้ความสำคัญกับสิ่งต่างๆเช่นกิจกรรมซึ่งเป็นเพียงรูปแบบการสังเกตการณ์ในตัว แต่ทำสิ่งที่สะอาดกว่านี้ถ้าคุณต้องเขียนสิ่งเหล่านี้ด้วยตัวเอง
Aviv Cohn

@AvivCohn สิ่งที่เป็น "ในตัว" เป็นส่วนสำคัญ คุณสามารถมีการจัดส่งแบบไดนามิกในการประกอบคุณสามารถมีฟังก์ชั่นการสั่งซื้อที่สูงขึ้นในซีทุกคุณลักษณะภาษาเดียวที่คุณสามารถมีเป็นไปได้ในการชุมนุม - เห็นได้ชัดเนื่องจากในบางจุดก็ยังคงทำงานบน x86 CPU ของคุณ คุณไม่ค่อยจำเป็นต้องใช้รูปแบบคำสั่งใน C # เนื่องจากคุณมีผู้รับมอบสิทธิ์ เช่นเดียวกับผู้สังเกตการณ์และกิจกรรมและอื่น ๆ อีกมากมาย Java มีวิธีการที่ไม่ระบุชื่อสำหรับบางเวลา แต่คุณต้องสร้างที่ไม่ระบุชื่อทั้งประเภท ทุกสิ่งเหล่านั้นมีขนาดเล็ก แต่พวกเขารวมกัน
Luaan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.