C # ve Java arasındaki büyük farklar nelerdir?


209

Sadece bir şeyi açıklığa kavuşturmak istiyorum. Bu hangisinin daha iyi olduğu sorusu değil, bu kısmı tartışmak için başka birine bırakıyorum. Umrumda değil. İş görüşmemde bu soru soruldu ve biraz daha fazla bilgi edinmenin faydalı olabileceğini düşündüm.

Bunlar benim gelebileceğim şeyler:

  • Java "platformdan bağımsız" dır. Peki bugünlerde Mono projesi olduğunu söyleyebiliriz, bu yüzden C # da düşünülebilir ama biraz abartılı olduğuna inanıyorum. Neden? Java'nın yeni bir sürümü yapıldığında, desteklediği tüm platformlarda aynı anda kullanılabilir, diğer yandan Mono uygulamasında kaç tane C # 3.0 özelliği eksik? Yoksa burada karşılaştırmamız gereken gerçekten CLR ve JRE mi?
  • Java olayları ve delegeleri desteklemez. Bildiğim kadarıyla.
  • Java'da tüm yöntemler sanaldır
  • Geliştirme araçları: Sanırım henüz Visual Studio gibi bir araç yok. Özellikle takım sürümleriyle çalıştıysanız ne demek istediğimi anlayacaksınız.

Lütfen alakalı olduğunu düşündüğünüz diğer kullanıcıları ekleyin.

Güncelleme: Sadece aklıma geldi, Java sınıflar, yöntemler vb. Gibi özel niteliklere sahip değil mi?


1
Diller, kütüphanelerden de farklı olan dil uygulamalarından farklıdır. Neyi karşılaştırmaya çalışıyorsunuz?
Miguel Ping


2
Bunu buldum msdn.microsoft.com/en-us/library/ms836794.aspx C # ve java arasındaki benzerlik ve farkı kapsıyor.
Bipul

1
Java ile ilgili olarak aşağıda belirtilenlerin çoğunu doğru kütüphanelerle edinebilirsiniz. Örneğin şu geçerli Java kodunu kontrol edin: new String [] {"james", "john", "john", "eddie"} .where (startsWith ("j")). Differentt (); Lombok-pg adlı bir kütüphane kullanır. Github.com/nicholas22/jpropel adresinde bulunabilir
NT_

Yanıtlar:


329

Java 7 ve C # 3'ü karşılaştırma

(Burada Java 7'nin bazı özelliklerinden bahsedilmemiştir, ancak usingJava 1-6'ya göre tüm C # sürümlerinin deyim avantajı kaldırılmıştır.)

Özetinizin tamamı doğru değil:

  • Java'da yöntemler varsayılan olarak sanaldır ancak bunları son haline getirebilirsiniz. (C # 'da varsayılan olarak mühürlenmiştir, ancak sanal hale getirebilirsiniz.)
  • Java için hem ücretsiz (ör. Eclipse, Netbeans) hem de ticari (ör. IntelliJ IDEA) çok sayıda IDE vardır.

Bunun ötesinde (ve zaten özetinizde neler var):

  • Jenerikler ikisi arasında tamamen farklıdır; Java jenerikleri sadece derleme zamanı bir "numara" dır (ancak bu konuda faydalıdır). C # ve .NET'te jenerikler yürütme zamanında da korunur ve uygun verimliliği koruyarak değer türlerinin yanı sıra referans türleri için de çalışır (örn. Bir kutu bayt dizisi yerine List<byte>bir byte[]destek olarak ).
  • C #, istisnaları kontrol etmedi
  • Java, kullanıcı tanımlı değer türlerinin oluşturulmasına izin vermez
  • Java'nın operatör ve dönüşüm aşırı yüklemesi yok
  • Java, yineleyicilerin basit uygulanması için yineleyici bloklarına sahip değildir
  • Java'nın LINQ gibi bir şeyi yoktur
  • Kısmen delegelere sahip olmamaları nedeniyle Java'nın anonim yöntemler ve lambda ifadeleri gibi bir şeyi yoktur. İsimsiz iç sınıflar genellikle bu rolleri doldurur, ama beceriksizce.
  • Java'nın ifade ağaçları yoktur
  • C #, anonim iç sınıflara sahip değil
  • C #, Java'nın iç sınıflarına sahip değildir, aslında - C # içindeki tüm iç içe sınıflar, Java'nın statik iç içe sınıflarına benzer
  • Java statik sınıfları yok (yok herhangi örneği Kurucular ve değişkenler için kullanılamaz, vb parametreler)
  • Java'nın C # 3.0 anonim türleriyle eşdeğeri yoktur
  • Java, örtük olarak yazılan yerel değişkenlere sahip değil
  • Java'nın uzantı yöntemleri yok
  • Java'nın nesne ve koleksiyon başlatıcı ifadeleri yok
  • Erişim değiştiriciler biraz farklıdır - Java'da bir derlemenin (şu anda) doğrudan bir eşdeğeri yoktur, bu nedenle "dahili" görünürlük fikri yoktur; C # 'da Java'da ad alanını (ve miras) dikkate alan "varsayılan" görünürlükle eşdeğer değildir
  • Java ve C # 'da başlatma sırası oldukça farklıdır (C #, temel türün yapıcısına zincirleme çağrıdan önce değişken başlatıcıları çalıştırır)
  • Java, dilin bir parçası olarak özelliklere sahip değildir; onlar get / set / is yöntemlerinin bir sözleşmesidir
  • Java'nın "güvensiz" kod eşdeğeri yok
  • Birlikte çalışma C # (ve genel olarak .NET) için Java'nın JNI'sinden daha kolaydır
  • Java ve C #, numaralandırmaların biraz farklı fikirlerine sahiptir. Java'lar çok daha nesne yönelimlidir.
  • Java'nın önişlemci yönergeleri yoktur (C # 'da #define, #if vb.).
  • Java'nın C # 'lere eşdeğerliği yoktur refve outparametreleri referans ile iletmek için
  • Java'nın kısmi türlerle eşdeğeri yoktur
  • C # arabirimleri alanları bildiremez
  • Java'nın imzasız tam sayı türü yok
  • Java'nın ondalık tür için dil desteği yoktur . (java.math.BigDecimal, System.Decimal gibi - farklılıklarla - bir şey sağlar, ancak dil desteği yoktur)
  • Java'nın eşdeğer değer türlerine eşdeğeri yok
  • Java'da boks, üzerinde belirli işlemlerle önceden tanımlanmış (ancak "normal") referans türlerini kullanır. C # ve .NET'te boks, daha şeffaf bir meseledir, herhangi bir değer türü için CLR tarafından boks için bir referans türü oluşturulur.

Bu kapsamlı değildir, ancak elden düşürebileceğim her şeyi kapsar.


24
@Brian: Bence Java jenerikleri ve iç sınıfların detayları, Java'nın basitlik yoluyla üstünlük elde etme fikrini oldukça hızlı bir şekilde bozuyor;)
Jon Skeet

8
@OrangeDog: Çoğunlukla dalga geçtiklerini iddia eden insanlar, IMO. Açık bir try / nihayet bloğu yazmak zorunda kalmanın, IMO kullanan bir ifadeden daha az hataya açık olduğunu görmek zor. Java ile karşılaştırıldığında C # 'ın "ekstra" özelliklerinin çoğu, daha az kod yazmaktan kurtulabileceğiniz ve bu kodun daha okunabilir olabileceği anlamına gelir.
Jon Skeet

17
@OrangeDog: İlginiz dışında ne kadar tarafsızsınız? Evet, ben bir C # tutkunuyum, ancak oldukça önemli Java deneyimine sahip - sonuçta benim günlük işim. Java'yı etkili bir şekilde nasıl kullanacağımı bilmiyorum gibi değil.
Jon Skeet

8
@OrangeDog: Başlangıç ​​olarak, çoğu geliştirici bildiğim kadarıyla "güvensiz" kullanarak kod yazmıyor, bu yüzden kırmızı bir ringa balığı. Ben de provabın kırmızı bir ringa balığı olduğunu düşünüyorum - resmi provalitenin bir insanın kod hakkında akıl yürütmesinin ne kadar kolay olduğunu düşünmüyorum . Demek istediğim, hem Java hem de C # konusunda oldukça deneyimli biri olarak, C #'ı verimlilik ve okunabilirlik açısından çok daha üstün bir dil olarak görüyorum. Bunun tersini düşünüyorsanız, her iki dilde de deneyim seviyenizi açıklığa kavuşturabilir misiniz? Tartışmayla oldukça alakalı olduğunu düşünüyorum.
Jon Skeet

21
@OrangeDog: Ayrıca, "Daha fazla şey yapabilmek, onları yanlış yapma olasılığını artırır" iddianız da yanlış bir IMO'dur ... çünkü eğer bir özelliği kullanarak bir şey yapamazsanız, kolaylaştıran bir dil, bunu yapmak zorunda kalmayacaksınız. Bu sadece yanlıştır - genellikle Java ve C #'da yapmanız gereken görevler aynıdır, ancak eksik özellikler nedeniyle Java bu görevleri doğru bir şekilde yerine getirmeyi zorlaştırır. Görevi basitleştirerek özellik , yanlış yapma olasılığını azaltır .
Jon Skeet

24

Aşağıdakiler, Dare Obasanjo'nun C # ve Java arasındaki farklar hakkında derinlemesine bir referanstır. İkisi arasında geçiş yaparken kendimi her zaman bu makaleye atıfta buluyorum.

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


2
@Jon Skeet: C # aktif geliştiricisisiniz. Neden C # ve Java farklılıkları sürümünüzü korumazsınız. Eminim insanlar bunu okumak ister.
pençeler

1
@claws: İstediğim her şeyi yapacak vaktim yok.
Jon Skeet

19
@ Winston: "Chuck Norris ve Jon Skeet arasındaki farklar" listesine ihtiyacımız var: 1) Chuck Norris'in her zaman zamanı vardır; Jon TimeDateher zaman vakit geçirmek için sınıfı değiştirmeli ve henüz zamanı olmadı :(
RedFilter

11

C #, son derece kullanışlı otomatik özelliklere sahiptir ve ayrıca en azından alıcılarınızda ve ayarlayıcılarınızda özel mantığınız olmadığında kodunuzu daha temiz tutmanıza yardımcı olur.


10

Java'da C # Yok Özellikleri • C #, daha ilkel türler ve aritmetik istisnaları yakalama işlevselliğini içerir.

• Çoğu operatör aşırı yüklenmesi ve kullanıcı tanımlı yayınlar gibi büyük C ++ programcıları topluluğuna aşina olan Java üzerinde çok sayıda gösterim kolaylığı içerir.

• Etkinlik yönetimi bir “birinci sınıf vatandaştır” - dilin kendisinin bir parçasıdır.

• Sınıflara benzer ancak yığına tahsis edilebilen "yapı" tanımına izin verir (C # ve Java sınıflarının aksine).

• C # özellikleri dil sözdiziminin bir parçası olarak uygular.

• C #, anahtar deyimlerinin dizelerde çalışmasına izin verir.

• C #, kapatma işlevselliği sağlayan anonim yöntemlere izin verir.

• C #, işlevsel bir stil anahtar kelimesi aracılığıyla eş-rutinleri kullanan yineleyiciye izin verir.

• C #, C ++ ve SQL tarafından paylaşılan bir özellik olan çoklu değerlerin geri dönüşüne yardımcı olan çıktı parametreleri için desteğe sahiptir.

• C #, ad alanlarını takma özelliğe sahiptir.

• C #, bir sınıfın kendi sınıf yöntemlerinden ayrı olarak bir arabirimin yöntemlerini özel olarak uygulamasını sağlayan "Açık Üye Uygulaması" na sahiptir. Bu aynı adı taşıyan bir metoda sahip olan iki farklı arayüzün uygulanmasına izin verir. Bir arayüz yöntemlerinin halka açık olması gerekmez; bunlara yalnızca bu arayüz üzerinden erişilebilir olmaları sağlanabilir.

• C #, COM ile entegrasyon sağlar.

• C ve C ++ örneğini izleyen C #, ilkel ve referans türleri için referans olarak çağrı yapılmasına izin verir.

Java # C # yok özellikleri

• Java'nın katı anahtar kelimesi, kayan nokta işlemlerinin sonucunun platformlar arasında aynı kalmasını garanti eder.

• Java, hata yakalama ve işlemenin daha iyi uygulanması için denetlenmiş istisnaları destekler.


9

Başka bir iyi kaynak http://www.javacamp.org/javavscsharp/ Bu site, bu iki programlama dili arasındaki hemen hemen tüm farkları ortadan kaldıran birçok örnek sıralamaktadır.

Öznitelikler hakkında Java'nın hemen hemen aynı şekilde çalışan Ek Açıklamaları vardır.


5

Jenerik:

Java jenerikleri ile, aslında .NET ile elde ettiğiniz yürütme verimliliğinden hiçbirini alamazsınız çünkü Java'da genel bir sınıf derlediğinizde, derleyici type parametresini alır ve Object'i her yerde değiştirir. Örneğin, bir Foo<T>sınıfınız varsa, java derleyicisi sanki Bayt Kodunu üretir Foo<Object>. Bu, döküm ve ayrıca boks / kutudan çıkarmanın "arka planda" yapılması gerektiği anlamına gelir.

Bir süredir Java / C # ile oynuyorum ve bana göre dil seviyesindeki en büyük fark, işaret ettiğiniz gibi delegeler.


Bu yanlıştır, jeneriklerin silinmesi veya yeniden yapılandırılması (sırasıyla Java ve C #) performansı etkilemez.
Miguel Ping

Otomatik boksu dökümle karıştırıyorsunuz.
JesperE

3
Hayır, bruno performans farkı konusunda haklı. Java'da bir <byte> Listesinin (genel olarak) eşdeğerini almanın bir yolu yoktur. Boks cezalarına (zaman ve hafıza) tabi olacak bir <Byte> Listesine sahip olmanız gerekir.
Jon Skeet

(Un) kutusu yalnızca ilkel türler olan kutulu türler için gerçekleşir.
Miguel Ping


0

Lütfen aşağıda verilen bağlantıdan geçin msdn.microsoft.com/en-us/library/ms836794.aspx C # ve java arasındaki benzerliği ve farkı kapsar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.