Neden C #, Java'dan daha fazla özelliğe sahiptir? [kapalı]


14

Lütfen bunun Java ile C # bağımsız değişkeni anlamına gelmediğini unutmayın. C # deneyimi olmayan bir Java programcısıyım ve meraktan soruyorum.

C # üzerinde bazı okumalar yaptım ve Java'dan çok daha fazla özelliği var gibi görünüyor. Birkaç örnek:

  • Çıkarım yazın.
  • dynamic Anahtar kelime.
  • Delegeler.
  • İsteğe bağlı parametreler.
  • Lambda ve LINQ (Aslında bunların ne olduğu hakkında hiçbir fikrim yok).
  • Özellikleri.

Ancak Java, C # 'ın sahip olmadığı hiçbir şeye sahip değildir.

Benim sorum: C # neden Java'dan çok daha fazla yerel özelliğe sahip? Java neden yıllar boyunca bunlardan bazılarını eklemedi, örneğin Özellikler veya tür çıkarımı? Java dili tasarımcıları daha basit bir yaklaşım benimsiyor mu? Bunun nedeni nedir?


2
@Patrick - Bu bir özellik - veya bir uygulama detayı mı?
Pete

14
Taraflı cevap: Çünkü C # tasarım ekibi ne yaptıklarını biliyor. Daha mantıklı cevap: C #, Java'nın başarısızlıklarının bilgisi ve dogmatik "sadece saf OO" (tamamen vurmadıkları bile) olmadan tasarlanmıştır. Bu özelliklerin yarısı Lisp ve Haskell'den toplu olarak içe aktarıldı, iki dil Java'nın java 8'e kadar ilham almayı reddetti ve diğerleri Java'nın eksikliğinden körü körüne açıkça görülen akıl sağlığı geliştirmeleridir.
Phoshi

4
Çünkü C # daha sonra geldi ve başlangıçta Java'nın açık bir soygunuydu ve daha sonra değerli olduğu ortaya çıkan her şeyi ekleme fırsatına sahipken, Java çok sıkı geriye dönük uyumluluk hedefleri tarafından engellendi.
Kilian Foth

2
@ Clockwork-Muse ama C # iki çalışma zamanı uygulamasına sahiptir - CLR ve Mono. Bir de Xamarin var. Java kullanarak çapraz iOS / Android / WinPhone projeleri oluşturmak için tek bir çözüm duymadım.
Den

4
@KilianFoth: Aslında, C # başlangıçta Delphi'nin Java gibi görünmesi için yeniden yazılmış bir soygunuydu . Microsoft, Delphi proje mimarı Borland'dan uzak tutarak bile yarattı.
Mason Wheeler

Yanıtlar:


22

Birkaç neden:

  1. C #, Java'dan daha sonra geldi; sürüm 1, Java 1.4'ün açık bir soygunuydu, bu yüzden Java'nın o noktada sahip olduğu her şeye sahipti.
  2. Ama sonra C # Java'dan çok daha hızlı gelişti, çünkü heyecan verici yeni bir platformdu (ve Turbo Pascal'ın babası Anders Hejlsberg'de tamamen parlak bir sürücüye sahipti). Bu, Java uygulayıcılarının sahip olmak istedikleri her şeyi eklerken, Java'daki belirgin hale gelen tüm hatalardan kaçınmalarını sağladı.
  3. Bu arada, Java, çok sıkı geri uyumluluk hedefleri ve biraz daha yavaş bir gelişme hızı ile engellendi, çünkü kısmen dehasının% 95'i için standart, girişimci, güvenilir, şaşırtıcı olmayan bir çözüm olarak ün kazanmaya çalıştı. programcılar. Bunu başardılar, belki biraz fazla başarılı oldular.

Sonuç olarak Java artık biraz özellik boşluğuna sahip. Gelecek için büyük planları var, ama her zamanki gibi bu tür şeylerle her şey planlanandan biraz daha uzun sürüyor.


7
Buna katıldığımdan emin değilim. Demek istediğim hepsi doğru, ama bunun nedeninin Güneş'in çöküşü ile ilgili siyasetle daha fazla ilgisi olduğundan şüpheleniyorum. Java temelde organizasyon / liderliğin olmadığı 5 yıldan fazla bir süreye sahipti - bu yüzden yeni özellikler yoktu.
Telastyn

7
C # 1'in değer türleri vardı. Java'nın asla sahip olmayacağı bir şey. Yani sadece bir "açık soygun" değil.
Den

1
@Telastyn - Bence buradaki en önemli neden bu. Özellikle de Güneş çöküşünün sonuna "ve sonra kâhin tarafından edinilince" eklediğinizde.
Wyatt Barnett

7
@Den ile aynı fikirde. C # 'ın daha hızlı gelişmesinin (ve doğru yönde) en büyük sebebinin Anders Hejlsberg'in liderliği olduğunu düşünüyorum. O ve ekibi diğer dillerden en iyi özellikleri ekledi ve C # 'a sorunsuz bir şekilde entegre etmeyi başardı. Sonuç olarak C #, dağınık veya dağınık hissetmeden çok düzgün bir dil özelliğine sahiptir.
David Kirkland

1
@WesleyWiser - "gelecekte olabilir" e yükseltildi.
Den

4

Java ve C # arasındaki büyük bir farkın C # tasarımcılarının sadece dili değil, aynı zamanda standart IDE'yi de kontrol etmesi Kilian'ın cevabına ekleyeceğim.

Genişletme yöntemleri ve kısmi sınıflar gibi bir şey eklemek, IDE'ler düzgün bir şekilde desteklemiyorsa, geliştirme / kontrol sürümlemesinde bir kabus olabilir.

Java'yı seçtiğiniz platformunuzla (Eclipse, Netbeans, vi + Ant) derleyebilmeniz beklendiğinden, kodu kıran özellikler eklemek (ve bunları LINQ gibi ek uzantılar geliştirmek için kullanmak) yalnızca " IntelliSense bu durumlarla ilgileneceğinden endişelenmemize gerek yok ".

Buna ek olarak, bazen özelliklerinin sayısı yerine değerini belirtmeye değer. Örneğin, otomatik özellikler güzel ve kesinlikle Java'nın bunu desteklemesini diliyorum, ama sonunda sadece Java'da birkaç satır daha kod yazmanız gerektiği anlamına geliyor. Benzer şekilde, "Etkinlikler" i bir özellik olarak adlandırmanın bir yanlış adlandırma olduğunu görüyorum, çünkü bunlar özel olarak etiketlenmiş delegelerden biraz daha fazlası ve Java tarafından zaten kullanılan Observer modelinin rafine bir kopyası (daha sonra tekrar Java'da daha açık olması gerekiyor) ) kodlama

Beni yanlış anlamayın, sanırım C # birkaç dikkate değer yenilikler getirdi ve keşke bir gün Oracle büyük patronlarının uyanmasını ve bunlardan bazılarını içermek için gerçek bir "Java 2" başlatmasını diliyorum, ancak boşluk sizin kadar açık değil soru noktaları.


2
Basit bir özellik tanımı (deklarasyon + get / set + beyaz boşluk) için gereken dokuz satır, "birkaç" tan daha hızlı bir şekilde toplanır.
kevin cline

@kevincline ve ben hem ayarlayıcıları hem de alıcıları düzgün bir şekilde belgeliyoruz . Ama sonuçta, IDE otomatik kod üretimimi erişimci için kullanmasam bile, iş mantığı, test, kod tasarımında harcanan zamanı hesaba kattığınızda (aslında) Bunları çoğunlukla erişimcileri yazarken bile düşünüyorum). Yani, güzel olsa da, sonunda büyük bir fark yaratan bir şey değil ...
SJuan76

3
Onları yazmanın zamanı değil. İlginç bölümlere giderken, bunları tekrar tekrar okuma ve görmezden gelme zamanı.
kevin cline

@kevincline Katılıyorum, abiut okunabilirliği ve kod temiz. Bu yüzden, sadece yerleşik bir Gözlemci modeli olan Olaylar gibi şeylere değer veriyorum, ancak bunları kendiniz yazmak zorunda kalırsanız daha temiz bir şey yapın
Aviv Cohn

@AvivCohn Mesele şu ki, "yerleşik" anahtar kısmıdır. Eğer C yüksek mertebeden işlevlere sahip olabilir, montaj dinamik sevkini olabilir, sahip olabilir her tek dil özelliği olan montaj mümkün - Açıkçası, bir noktada, hala x86 CPU üzerinde çalışır beri. Delegeleriniz olduğundan, C # dilinde Command desenini nadiren uygulamanız gerekir. Gözlemci ve olaylar ve diğerleri için de aynı şey geçerlidir. Java'nın bir süre anonim yöntemleri vardı, ancak tamamen anonim bir tür oluşturmanız gerekiyordu . Bütün bunlar küçük ama toplanıyorlar.
Luaan
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.