อะไรคือความแตกต่างที่สำคัญระหว่าง C # และ Java


209

ฉันแค่ต้องการชี้แจงสิ่งหนึ่ง นี่ไม่ใช่คำถามที่ดีกว่าส่วนที่ฉันปล่อยให้คนอื่นเพื่อหารือ ฉันไม่สนใจมัน ฉันถูกถามคำถามนี้ในการสัมภาษณ์งานของฉันและฉันคิดว่ามันอาจจะมีประโยชน์ในการเรียนรู้อีกเล็กน้อย

นี่คือสิ่งที่ฉันจะได้มาด้วย:

  • Java เป็น "แพลตฟอร์มอิสระ" ทุกวันนี้คุณสามารถพูดได้ว่ามีโครงการโมโนดังนั้น C # ก็สามารถนำมาพิจารณาด้วยเช่นกัน แต่ฉันเชื่อว่ามันเกินความจริงเล็กน้อย ทำไม? เมื่อ Java รุ่นใหม่เสร็จสิ้นพร้อมใช้งานบนแพลตฟอร์มทั้งหมดที่รองรับในทางกลับกันคุณสมบัติของ C # 3.0 จำนวนเท่าไหร่ที่ยังคงหายไปในการใช้งาน Mono? หรือเป็นCLRกับJREจริงๆที่เราควรเปรียบเทียบที่นี่
  • Java ไม่สนับสนุนกิจกรรมและผู้รับมอบสิทธิ์ เท่าที่ฉันรู้.
  • ใน Java วิธีการทั้งหมดเป็นเสมือน
  • เครื่องมือในการพัฒนา: ฉันเชื่อว่ายังไม่มีเครื่องมือดังกล่าวในฐานะ Visual Studio โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับรุ่นทีมคุณจะรู้ว่าฉันหมายถึงอะไร

โปรดเพิ่มคนอื่นที่คุณคิดว่ามีความเกี่ยวข้อง

อัปเดต: เพิ่งโผล่ขึ้นมาในใจของฉัน Java ไม่ได้มีสิ่งที่ชอบคุณสมบัติที่กำหนดเองในชั้นเรียนวิธีการอื่น ๆ หรือมันได้หรือไม่


1
ภาษาแตกต่างจากการใช้ภาษาซึ่งแตกต่างจากห้องสมุด คุณพยายามเปรียบเทียบอะไร
Miguel Ping


2
ฉันพบmsdn.microsoft.com/en-us/library/ms836794.aspx อันนี้ครอบคลุมทั้งความคล้ายคลึงและความแตกต่างระหว่าง C # และ java
Bipul

1
คุณสามารถรับหลายสิ่งที่กล่าวถึงด้านล่างเกี่ยวกับ Java ด้วยไลบรารีที่ถูกต้อง ตรวจสอบตัวอย่างรหัส Java ที่ถูกต้อง: สตริงใหม่ [] {"james", "john", "john", "eddie"} .where (startsWith ("j")). ชัด (); ใช้ไลบรารีที่เรียกว่า lombok-pg สามารถดูได้ที่ github.com/nicholas22/jpropel
NT_

คำตอบ:


329

เปรียบเทียบ Java 7 และ C # 3

(คุณสมบัติบางอย่างของ Java 7 ไม่ได้กล่าวถึงที่นี่ แต่usingข้อดีของคำสั่งของ C # ทุกเวอร์ชันบน Java 1-6 ถูกลบ)

สรุปทั้งหมดของคุณไม่ถูกต้อง:

  • ในวิธีการ Java เป็นเสมือนโดยค่าเริ่มต้นแต่คุณสามารถทำให้มันสุดท้าย (ใน C # พวกเขาปิดผนึกโดยค่าเริ่มต้น แต่คุณสามารถทำให้พวกเขาเสมือน)
  • มี IDE มากมายสำหรับ Java ทั้งฟรี (เช่น Eclipse, Netbeans) และการค้า (เช่น IntelliJ IDEA)

นอกเหนือจากนั้น (และมีอะไรในข้อมูลสรุปของคุณอยู่แล้ว):

  • ยาสามัญจะแตกต่างกันอย่างสมบูรณ์ระหว่างสอง; Java generics เป็นเพียงคำสั่ง "เวลา" (แต่เป็นประโยชน์สำหรับการคอมไพล์) ใน C # และ. NET generics จะถูกเก็บรักษาไว้ที่เวลาดำเนินการเช่นกันและทำงานสำหรับประเภทของค่าเช่นเดียวกับประเภทการอ้างอิงทำให้ประสิทธิภาพที่เหมาะสม (เช่นList<byte>เป็นการbyte[]สำรองข้อมูลมากกว่าอาร์เรย์ของไบต์ชนิดบรรจุกล่อง)
  • C # ไม่ได้ตรวจสอบข้อยกเว้น
  • Java ไม่อนุญาตให้สร้างประเภทค่าที่ผู้ใช้กำหนด
  • Java ไม่มีโอเปอเรเตอร์และการแปลงที่มากเกินไป
  • จาวาไม่มีบล็อคตัววนซ้ำสำหรับการวนซ้ำอย่างง่าย
  • Java ไม่มีอะไรที่เหมือนกับ LINQ
  • ส่วนหนึ่งเนื่องจากไม่มีผู้รับมอบสิทธิ์ Java ไม่มีอะไรที่เหมือนวิธีนิรนามและการแสดงออกแลมบ์ดา คลาสภายในที่ไม่ระบุชื่อมักเติมบทบาทเหล่านี้ แต่อย่าง clunkily
  • Java ไม่มีต้นไม้แสดงผล
  • C # ไม่มีคลาสภายในที่ไม่ระบุชื่อ
  • C # ไม่มีคลาสภายในของ Java เลยจริง ๆ แล้วคลาสที่ซ้อนทั้งหมดใน C # นั้นเหมือนกับคลาสที่ซ้อนกันแบบคงที่ของ Java
  • Java ไม่มีคลาสแบบสแตติก (ซึ่งไม่มีตัวสร้างอินสแตนซ์ใด ๆและไม่สามารถใช้สำหรับตัวแปรพารามิเตอร์ ฯลฯ )
  • Java ไม่มีประเภทเทียบเท่ากับ C # 3.0 ที่ไม่ระบุชื่อ
  • Java ไม่ได้พิมพ์ตัวแปรโลคัลโดยนัย
  • Java ไม่มีวิธีการขยาย
  • Java ไม่มีนิพจน์การเริ่มต้นวัตถุและการรวบรวม
  • ตัวดัดแปลงการเข้าถึงแตกต่างกันบ้าง - ใน Java ไม่มี (เทียบเท่า) ของแอสเซมบลีโดยตรงดังนั้นจึงไม่มีความคิดในการมองเห็น "ภายใน" ใน C # ไม่เทียบเท่ากับการมองเห็น "เริ่มต้น" ใน Java ซึ่งคำนึงถึง namespace (และการสืบทอด)
  • ลำดับของการเริ่มต้นใน Java และ C # จะแตกต่างกันอย่างละเอียด (C # ดำเนินการ initializers ตัวแปรก่อนที่จะเรียกสายไปยังตัวสร้างของประเภทฐาน)
  • Java ไม่มีคุณสมบัติเป็นส่วนหนึ่งของภาษา พวกเขากำลังประชุมของ get / set / เป็นวิธีการ
  • Java ไม่มีรหัสเทียบเท่า "ไม่ปลอดภัย"
  • การทำงานร่วมกันเป็นเรื่องง่ายใน C # (และ. NET โดยทั่วไป) กว่า JNI ของ Java
  • Java และ C # มีแนวคิดที่แตกต่างกันบ้าง Java เป็นเชิงวัตถุมากขึ้น
  • Java ไม่มีคำสั่ง preprocessor (#define, #if ฯลฯ ใน C #)
  • Java ไม่มีเทียบเท่าของ C # refและoutสำหรับการผ่านพารามิเตอร์โดยการอ้างอิง
  • Java ไม่มีประเภทเทียบเท่าบางส่วน
  • อินเตอร์เฟส C # ไม่สามารถประกาศฟิลด์
  • Java ไม่มีประเภทจำนวนเต็มที่ไม่ได้ลงนาม
  • Java ไม่มีภาษารองรับประเภททศนิยม (java.math.BigDecimal ให้บางสิ่งบางอย่างเช่น System.Decimal - มีความแตกต่าง - แต่ไม่มีภาษารองรับ)
  • Java มีชนิดค่าที่ไม่เป็นโมฆะเทียบเท่า
  • Boxing ใน Java ใช้ประเภทอ้างอิงที่กำหนดไว้ล่วงหน้า (แต่ "ปกติ") ที่มีการดำเนินการเฉพาะกับพวกเขา Boxing ใน C # และ. NET เป็นเรื่องที่โปร่งใสมากขึ้นโดยมีประเภทอ้างอิงที่สร้างขึ้นสำหรับการมวยโดย CLR สำหรับประเภทค่าใด ๆ

มันไม่ได้ละเอียดถี่ถ้วน แต่ครอบคลุมทุกอย่างที่ฉันนึกได้


24
@ Brian: ผมคิดว่า generics Java และรายละเอียดของการเรียนภายในสวยได้อย่างรวดเร็วล้มล้างความคิดของ Java บรรลุเหนือกว่าผ่านความเรียบง่าย;)
จอนสกีต

8
@OrangeDog: คนโต้เถียงที่ส่วนใหญ่หลอกตัวเอง IMO เป็นการยากที่จะเห็นว่าการบังคับให้เขียนบล็อกลอง / สุดท้ายอย่างชัดเจนนั้นเกิดข้อผิดพลาดน้อยกว่าการใช้คำสั่ง IMO ฟีเจอร์ "พิเศษ" ส่วนใหญ่ของ C # เปรียบเทียบกับ Java หมายความว่าคุณสามารถเขียนโค้ดได้น้อยลงและโค้ดนั้นสามารถอ่านได้มากขึ้น
Jon Skeet

17
@OrangeDog: คุณเป็นคนที่เป็นกลางและสนใจได้อย่างไร? ใช่ฉันเป็นผู้ที่ชื่นชอบ C # แต่ด้วยประสบการณ์ Java ที่สำคัญเช่นกัน - มันเป็นงานประจำวันของฉัน ไม่ใช่ว่าฉันไม่รู้วิธีการใช้ Java อย่างมีประสิทธิภาพ
Jon Skeet

8
@OrangeDog: สำหรับการเริ่มต้นนักพัฒนาส่วนใหญ่ไม่ได้เขียนรหัสโดยใช้ "ไม่ปลอดภัย" เท่าที่ฉันทราบดังนั้นจึงเป็นปลาเฮอริ่งแดง ฉันยังคิดว่าการพิสูจน์นั้นเป็นปลาเฮอริ่งแดง - ฉันไม่คิดว่าการพิสูจน์อย่างเป็นทางการนั้นเกี่ยวข้องกับความง่ายในการให้เหตุผลเกี่ยวกับรหัสของมนุษย์ ประเด็นของฉันคือในฐานะคนที่ค่อนข้างมีประสบการณ์ทั้ง Java และ C # ฉันพบว่า C # เป็นภาษาที่เหนือกว่าในแง่ของประสิทธิภาพและความสามารถในการอ่าน หากคุณรู้สึกว่าตรงกันข้ามคุณสามารถอธิบายระดับประสบการณ์ของคุณในทั้งสองภาษาได้หรือไม่? ฉันคิดว่ามันค่อนข้างเกี่ยวข้องกับการอภิปราย
Jon Skeet

21
@OrangeDog: นอกจากนี้การอ้างสิทธิ์ของคุณว่า "ความสามารถในการทำสิ่งต่าง ๆ เพิ่มโอกาสที่คุณทำผิด" ก็เป็นความผิดพลาด IMO ... เพราะมันจะถือว่าถ้าคุณไม่สามารถทำสิ่งใดโดยใช้คุณสมบัติของ ภาษาซึ่งทำให้ง่ายคุณไม่ต้องทำเลย นั่นเป็นเรื่องไม่จริง - บ่อยครั้งที่งานที่คุณต้องทำให้สำเร็จใน Java และ C # เหมือนกัน แต่เนื่องจากคุณสมบัติที่ขาดหายไป Java ทำให้ยากต่อการทำงานเหล่านั้นให้ถูกต้อง เมื่อลดความซับซ้อนของงานคุณลักษณะนี้จะลดโอกาสที่คุณจะทำผิด
Jon Skeet

24

ต่อไปนี้เป็นข้อมูลอ้างอิงเชิงลึกที่ยอดเยี่ยมโดย Dare Obasanjo เกี่ยวกับความแตกต่างระหว่าง C # และ Java ฉันมักจะพบว่าตัวเองอ้างถึงบทความนี้เมื่อสลับไปมาระหว่างสอง

http://www.25hoursaday.com/CsharpVsJava.html


2
@Jon Skeet: คุณเป็นนักพัฒนาที่ใช้งาน C # มากที่สุด ทำไมคุณไม่รักษาความแตกต่างของ C # & Java ไว้ ฉันพนันได้เลยว่าคนที่รักการอ่าน
กรงเล็บ

1
@claws: ฉันไม่มีเวลาทำทุกอย่างที่ฉันต้องการ
Jon Skeet

19
@ Winston: เราต้องการรายการ "ความแตกต่างระหว่าง Chuck Norris และ Jon Skeet": 1) Chuck Norris มีเวลาเสมอ จอนต้องปรับเปลี่ยนTimeDateคลาสเพื่อให้มีเวลาเสมอและยังไม่มีเวลา :(
RedFilter

11

C # มีคุณสมบัติอัตโนมัติซึ่งสะดวกอย่างไม่น่าเชื่อและยังช่วยให้โค้ดของคุณสะอาดยิ่งขึ้นอย่างน้อยเมื่อคุณไม่มีตรรกะที่กำหนดเองใน getters และ setters ของคุณ


10

คุณสมบัติของ C # ขาดใน Java • C # รวมถึงประเภทดั้งเดิมมากขึ้นและฟังก์ชั่นการจับข้อยกเว้นทางคณิตศาสตร์

•รวมการอำนวยความสะดวกด้านสัญกรณ์จำนวนมากบน Java ซึ่งหลาย ๆ อย่างเช่นผู้ให้บริการมากไปและผู้ใช้ที่กำหนดเองได้คุ้นเคยกับชุมชนขนาดใหญ่ของโปรแกรมเมอร์ C ++ แล้ว

•การจัดการเหตุการณ์เป็น "พลเมืองชั้นหนึ่ง" - เป็นส่วนหนึ่งของภาษา

•อนุญาตนิยามของ "structs" ซึ่งคล้ายกับคลาส แต่อาจถูกจัดสรรบนสแต็ก (ซึ่งแตกต่างจากอินสแตนซ์ของคลาสใน C # และ Java)

• C # ใช้คุณสมบัติเป็นส่วนหนึ่งของไวยากรณ์ภาษา

• C # อนุญาตให้สวิตช์สั่งการทำงานกับสตริง

• C # อนุญาตให้ใช้วิธีที่ไม่ระบุชื่อซึ่งให้ฟังก์ชันการปิด

• C # อนุญาตให้ตัววนซ้ำที่ใช้การทำกิจวัตรแบบร่วมผ่านคีย์เวิร์ดผลผลิตสไตล์การทำงาน

• C # มีการรองรับพารามิเตอร์เอาท์พุทช่วยในการคืนค่าหลายค่าคุณลักษณะที่ใช้ร่วมกันโดย C ++ และ SQL

• C # มีความสามารถในการนามแฝง namespaces

• C # มี "การใช้งานสมาชิกอย่างชัดเจน" ซึ่งอนุญาตให้ชั้นเรียนใช้วิธีการเฉพาะของส่วนต่อประสานแยกจากวิธีชั้นเรียนของตัวเอง สิ่งนี้ทำให้มันสามารถใช้อินเตอร์เฟสสองแบบที่ต่างกันซึ่งมีวิธีใช้ชื่อเดียวกัน วิธีการของอินเทอร์เฟซไม่จำเป็นต้องเป็นสาธารณะ พวกเขาสามารถทำให้สามารถเข้าถึงได้ผ่านทางส่วนต่อประสานนั้นเท่านั้น

• C # ให้การรวมกับ COM

•ตามตัวอย่างของ C และ C ++, C # อนุญาตให้เรียกโดยอ้างอิงสำหรับประเภทดั้งเดิมและประเภทอ้างอิง

คุณสมบัติของ Java Absent ใน C #

•คำหลักที่เข้มงวดของ Java รับประกันได้ว่าผลลัพธ์ของการดำเนินการจุดลอยตัวยังคงเหมือนเดิมในทุกแพลตฟอร์ม

• Java รองรับข้อยกเว้นที่ตรวจสอบเพื่อการบังคับใช้การดักจับและการจัดการข้อผิดพลาดที่ดีขึ้น


9

แหล่งข้อมูลที่ดีอีกแหล่งหนึ่งคือhttp://www.javacamp.org/javavscsharp/ ไซต์นี้ระบุตัวอย่างมากมายที่แสดงถึงความแตกต่างเกือบทั้งหมดระหว่างภาษาการเขียนโปรแกรมทั้งสองนี้

เกี่ยวกับคุณสมบัติ Java มีคำอธิบายประกอบที่ทำงานเกือบจะในลักษณะเดียวกัน


5

ข้อมูลทั่วไป:

ด้วย Java generics คุณจะไม่ได้รับประสิทธิภาพการดำเนินการใด ๆ ที่คุณได้รับจาก. NET เพราะเมื่อคุณคอมไพล์คลาสทั่วไปใน Java คอมไพเลอร์จะลบพารามิเตอร์ type และแทนที่วัตถุทุกที่ ตัวอย่างเช่นถ้าคุณมีFoo<T>ระดับคอมไพเลอร์จาวาสร้างรหัส Byte Foo<Object>ราวกับว่ามันเป็น ซึ่งหมายถึงการคัดเลือกนักแสดงและการชกมวย / การตีมวยก็ต้องทำใน "ฉากหลัง"

ฉันเคยเล่นกับ Java / C # มาระยะหนึ่งแล้วและในความเห็นของฉันความแตกต่างที่สำคัญในระดับภาษาคือตามที่คุณชี้ผู้ได้รับมอบหมาย


นี่เป็นสิ่งผิดการลบข้อมูลทั่วไปหรือการทำให้ใหม่ (Java และ C # ตามลำดับ) ไม่จำเป็นต้องส่งผลกระทบต่อประสิทธิภาพการทำงาน
Miguel Ping

คุณกำลังสับสนกับออโต้บ็อกซ์กับการแคสต์
JesperE

3
ไม่บรูโน่ถูกต้องเกี่ยวกับความแตกต่างด้านประสิทธิภาพ ไม่มีวิธีรับเทียบเท่าของ List <byte> (โดยทั่วไป) ใน Java คุณต้องมี List <Byte> ซึ่งจะต้องเสียค่าปรับจากการชกมวย (เวลาและหน่วยความจำ)
Jon Skeet

(un) Boxing เกิดขึ้นเฉพาะกับชนิดบรรจุกล่องซึ่งเป็นประเภทดั้งเดิม
Miguel Ping

1
โปรดดูบทความนี้: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde

0

กรุณาเข้าไปที่ลิงค์ด้านล่างนี้ msdn.microsoft.com/en-us/library/ms836794.aspx ซึ่งครอบคลุมทั้งความคล้ายคลึงและความแตกต่างระหว่าง C # และ java

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.