Hangi nedenlerden dolayı Java ve C ++ üzerinden C # seçmeliyim? [kapalı]


46

C # bugünlerde popüler görünüyor. Sözdizimsel olarak neredeyse Java ile aynı olduğunu duydum. Java ve C ++ daha uzun süredir var. Hangi nedenlerden dolayı Java ve C ++ üzerinden C # seçmeliyim?


16
Yazılan soru, yapıcı olmayan bir ders kitabı örneğiydi "hangi dil daha iyi?" burada konu dışı sorular. Aslında iyi ve iyi düşünülmüş cevaplar aldığından, düzenleme ile daha yapıcı olmaya çalıştım. Yine de, lütfen SSS ve bu blog gönderisini bu tür sorular sorurken aklınızda bulundurun.
Adam Lear

Biraz daha keskin öğeler ekleyeyim. .NET, dili için iyi tanımlanmış bir DOM'ye ( örn. CodeDOM ) sahiptir ve dolayısıyla çalışma zamanında dinamik olarak bir şeyler üretmek çok daha basit ve daha verimlidir. Bu, altyapı yeteneği olarak da faydalı olabilir. Ayrıca, tür sistemi, tüm yerel W3 türleriyle 1'e 1 eşleşir. Özünde, W3 ve diğer birlikte çalışma başlıkları dilden başlayarak dile getirildi. Diğer diller için bu endişeler daha da arttı ve onlar için birçok zorluk ortaya çıkardı. Sonra dil ve / veya protokoller dolu interoping olacak Ayrıca, .NET de çok güçlüdür
JoeGeeky

5
Hey, JoeGeeky, sorunuzu cevap olarak yorumunuzu ekleyin .
Anthony Mastrean

1
Asıl soru şudur: Hangi sebeplerden dolayı C # üzerinden Nemerle, F * ve F # seçmeliyim? (yani, her üç dil de MS'ten ve üçü de daha iyi)
mrsteve

"Dil / platform X'in Y diline / Y'ye göre HER ZAMAN daha iyidir" türünden hiçbir ifadesinin geçerli olmadığını ve ayrıca herhangi bir X ve Y için belirli bağlamlarda kolayca geçersiz kılınabileceğini düşünüyorum. Bu sorunun amacı ne?
Shivan Dragon

Yanıtlar:


76

Soru, "Modern, tipik uygulama geliştirme için hangi dil daha uygun?" Olmalı.

Düzenleme: Aşağıdaki yorumlardan bazılarını ele aldım. Küçük bir not: doğal olarak birçok şeyiniz olduğunda, deyimler olarak, bunun her zaman kendiniz uygulamaktan veya indirmekten ve kullanmaktan daha büyük bir fark olduğunu düşünün. Hemen hemen her şey bu dillerin herhangi birinde uygulanabilir. Sorun şu ki - dillerin size doğal olarak sağladığı şey.

Bu yüzden başımın üstünden (her iki dilde bazı argümanlar geçerli)

C # bu konuda C ++ 'dan daha iyidir:

  • It has yerli çöp toplama.
  • Sınıf metotlarının imzalarını boş fonksiyonlar gibi ele almanıza izin verir (yani, statik olarak yazılan thisişaretçi argümanını dikkate almaz ) ve böylece sınıflar arasında daha dinamik ve esnek ilişkiler yaratır. Bunun ne anlama geldiğini bilmiyorsanız düzenleyin , sonra void döndüren ve bir void (*ptr)()değişkeni geçersiz kılan bir üye yöntemi atamayı deneyin . C # delegeleri thisişaretçiyi yanlarında taşırlar , ancak kullanıcının her zaman bununla ilgilenmesi gerekmez. void()Başka herhangi bir void()delegeye herhangi bir sınıfın yöntemini atayabilirler .
  • İyi uygulanmış ve kullanımı kolay, çok faydalı şeyler içeren büyük bir standart kütüphaneye sahiptir.
  • Hem yönetilen hem de yerel kod blokları için izin verir.
  • Montaj sürümleri kolayca DLL cehennem sorunlarını giderir.
  • Sınıfları, yöntemleri ve alanları montajın içsel olarak ayarlayabilirsiniz (başka bir deyişle, içinde bulundukları DLL içindeki herhangi bir yerden erişilebilir olduklarını, ancak diğer derlemelerden erişilemediklerini).

C # bu konuda Java'dan daha iyidir:

  • Çok fazla gürültü yerine (EJB, özel statik sınıf uygulamaları vb.), Özellikler ve Olaylar gibi zarif ve arkadaşça doğal yapılar elde edersiniz.
  • Gerçek bir jenerik ürününüz var (Java'nın jenerik olarak adlandırdığı kötü oyuncu şakası değil) ve bunlar üzerinde düşünmenizi sağlayabilirsiniz.
  • Yerel kaynak yönetimi deyimlerini ( usingifade) destekler. Java 7 de bunu destekleyecek, fakat C # daha uzun zamandır kullanıyor.
  • İstisnaları kontrol etmedi :) (bunun iyi ya da kötü olup olmadığı tartışılabilir)
  • İstediğin buysa, Windows ile derinlemesine bütünleşmiş.
  • Lambdas ve LINQ'ye sahiptir, bu nedenle az miktarda işlevsel programlamayı destekler.
  • Hem genel kovaryans hem de açıkça kontravaryans sağlar.
  • İsterseniz dinamik değişkenleri vardır.
  • Açıklama ile daha iyi numaralandırma desteği yield.
  • Yeni değer (veya referans olmayan) türlerini tanımlamanıza olanak tanır.

Düzenle - Yorumların adreslenmesi

  • C ++ 'nın yerel RAII'yi desteklemediğini söylemedim. Java’da olmadığını söyledim (açıkça denemek / sonunda yapmak zorundasınız). C ++, RAII için mükemmel olan otomatik işaretçilere sahiptir ve (ne yaptığınızı biliyorsanız) çöp toplamanın yerini alabilir.
  • Özgür fonksiyonları taklit etmek hakkında hiçbir şey söylemedim . Ancak, örneğin bir alana bir thisişaretçi ile erişmeniz ve bunu genel bir işlev işaretleyicisine (yani aynı sınıfta değil) yapan yöntemi bağlamanız gerekiyorsa, bunu yapmanın hiçbir doğal yolu yoktur. C # 'da bedavaya alabilirsiniz. Nasıl çalıştığını bile bilmek zorunda değilsin.
  • "Üye yöntemlerini serbest işlevler olarak ele alma" derken, örneğin, üye yöntemini bir serbest işlev imzasına doğal olarak bağlayamazsınız, çünkü "gizlice" üye yönteminin thisişaretçiye ihtiyacı vardır .
  • usingAçıkçası ıdisposable mahfazalar ile birlikte ifadesi, RAII büyük bir örnektir. Bu bağlantıya bakınız . GC'ye sahip olduğunuz için C ++ 'ta C ++' da olduğu kadar RAII'ye ihtiyacınız olmadığını düşünün. İhtiyacınız olan belirli zamanlar için, açıkça usingifadeyi kullanabilirsiniz . Bir diğer küçük hatırlatma: hafızayı boşaltmak pahalı bir işlemdir. GC birçok durumda performans avantajına sahiptir (özellikle de çok fazla belleğiniz varsa). Hafıza sızdırılmayacak ve yeniden dağıtma için çok fazla zaman harcamayacaksınız. Dahası, tahsis de daha hızlıdır, çünkü her seferinde yalnızca bir defa hafıza ayırmazsınız. Arama newsadece son nesne göstergesini arttırmaktır.
  • "Çöp toplama olduğu için C # daha kötü". Bu gerçekten özneldir, ancak en üstte belirttiğim gibi, en modern, tipik uygulama gelişimi için, çöp toplama bir avantajdır.
    C ++ 'da, seçimleriniz hafızanızı manuel olarak yönetmek içindir, newve deletebunlar ampirik olarak her zaman burada ve orada hatalara yol açar, ya da (C ++ 11 ile) otomatik işaretleyicileri doğal olarak kullanabilirsiniz, ancak çok ve çok ekleyebileceklerini unutmayın. Kodun gürültüsü . Yani GC hala orada bir kenarı var.
  • "Jenerikler şablonlardan çok daha zayıf" - Bunu nereden aldığını bilmiyorum. Şablonların avantajları olabilir, ancak deneyimlerimdeki kısıtlamalara göre, genel parametre tipi kontrolü, kontravaryans ve kovaryans çok daha güçlü ve zarif araçlardır. Şablonlardaki güç, biraz dille oynamanıza izin vermesidir, bu harika olabilir, ama aynı zamanda bir şeyi ayıklamak istediğinizde de birçok baş ağrısına neden olur. Sonuç olarak, şablonların iyi özellikleri var, ancak jenerik ilaçları daha pratik ve temiz buluyorum.

5
Ve hala C ++ için bir Çöp Toplayıcı istiyorsanız, bir tane indirebilirsiniz .
fredoverflow


6
Java ile karşılaştırıldığında C # 'daki diğer bir önemli özellik, performans nedenlerinden ötürü, yığında (veya özel durumlarda CPU kayıtlarında, saklanabilen) veya diğer yığın nesnelerine gömülebilen bir nesne türü olan "struct" dır. Genellikle, X, Y koordinat çiftleri gibi 1-4 alanlı küçük nesneler için kullanılır.
Qwertie

2
@LokiAstari Açıklayan Mind? Olay işleyicilerinin kaydını kaldırmayı hatırladığınız ve yerel sarmalayıcı içeren sınıflarda Dispose desenini kullandığınız sürece, iyi olacaksınız. C ++ 'da hafıza yönetiminden daha az bilmek ve hatırlamak çok daha az.
Yam Marcovic

2
-1 "C ++ 'ın C #' dan iyidir ..." ve "Java C # 'dan iyidir." C # 'nin her alanda üstün olduğunu sanmıyorum, bu yüzden bu iki bölüm olmadan bir cevap muhtemelen bazı önemli bilgilerden yoksundur.
Giorgio

30

Çevre

.NET Framework ve Windows istemcileri

Windows, istemci bilgisayarlarda hakim olan İşletim Sistemidir. Windows uygulamaları için en iyi GUI çerçeveleri, .NET Framework ile birlikte Winforms ve WPF'dir . .NET Framework ve API'leri ile çalışmak için en iyi programlama dili C # ' dır . Java bunun için bir alternatif değildir. C ++ ise otomatik bellek yönetimi olmadan daha eski bir dil C #, C ++ 'a benzemektedir ancak otomatik bellek yönetimine sahiptir ve sizi daha üretken kılan işaretçilerle çalışmak zorunda değilsiniz. C ++ hala bazı durumlarda en iyi seçenek olabilir, ancak iş dünyasında yaygın olan yoğun veri tabanı uygulamaları için değil.

IIS ve Windows Sunucusu

Windows ortamında ve C # ile çalışmaya alışkınsanız, sunucu programlaması için IIS'yi ve temel yönetim için Windows Server'ı öğrenmek için en az yatırım yapmanız gerekir.

Active Directory ve Windows Sunucusu

Şirket ağlarında konuşlandırılacak bir yazılım geliştiriyorsanız, Active Directory içeren bir Windows Server kullanarak Windows merkezli bir ortam kullanıyor olmaları muhtemeldir. Böyle bir ortamda, C # ve .NET Framework ile yapılmış bir çözümü entegre etmek ve uygulamak kolaydır .

Şahsen ben bir Java geliştiricisiyim, bir C # geliştiricisi değilim, ama web ile çalışıyorum. Windows ağı için ağ uygulamaları geliştiriyor olsaydım C # 'ya geçerdim. Ancak Java'yı Linux tabanlı web sunucuları için tercih ediyorum. Gömülü sistemler için C ++ 'ı seçecektim, çok fazla bağımlılık yapmam.

Evet, C # , C ++ ve Java'dan daha modern özelliklere sahip daha iyi bir dildir, ancak C # seçiminde en önemli şey değildir .

özet

Yazılımınızın ortamı C # seçimi için çok önemlidir . Eğer bir ortamda çalışıyorsanız , Windows istemcileri, Windows sunucuları, Active Directory, IIS ve belki SQL Server sonra C # ile çok iyi bir dildir .NET Framework .

Örneğin, web servisleri olan bir Unix ortamında çalışıyorsanız, Java benim seçimim olacaktır. Gömülü sistemler ile çalışıyorsanız veya donanım cihazlarıyla bütünleşmek zorundaysanız C ++ iyi bir seçim olacaktır.


3
Kesinlikle - bu yüzden C # kullanmıyorum gerçekten başka bir sebep değil
Murph

.NET'i kesinlikle Mono, MonoTouch ve MonoDroid üzerinden diğer platformlarda kullanabilirsiniz, ancak karşılaştırmalarım Mono'nun Windows için .NET'ten önemli ölçüde daha yavaş olduğunu ve Microsoft'un kendi Compact Framework'ünün Windows CE'de oldukça yavaş olduğunu: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... elbette, WPF yalnızca Windows’ta kullanılabilir (ancak yine de
hoşuma gitmiyor

Hangi bağımlılıkların "gömülü sistemler için C ++ 'ı seçmezdim, çok fazla bağımlılık yapmam." Derken ne demek istiyorsun? Java kütüphanelerini mi kastediyorsun?
Puckl

@Puckl evet, ancak çoğunlukla jvm / jre.
Jonas

"Örneğin, web servisleri olan bir Unix ortamında çalışıyorsanız" dikkate alınması gereken başka diller ve çerçeveler var: ruby, Python, node.js vb.
MarkJ

15

C # ve Java

C # eğer çok iyi bir dil:

  • Genel amaçlı nesne yönelimli geliştirme yapmak istiyorsunuz. Klasik, statik olarak yazılmış bir OOP dili.
  • Yalnızca Microsoft platformlarını hedefliyorsunuz (Microsoft'un C # oluşturmak için Java'yı etkili bir şekilde klonladığını hatırlatmakta fayda var, çünkü insanları Windows'a kilitleyecek bir Java benzeri bir dil istiyorlardı. diğer platformlar ....)

Dil olarak C #, Java'dan çeşitli şekillerde daha iyidir (özellikler, değer türleri, birleştirilmiş jenerikler vb. İçin daha iyi sözdizimi). C # ' yı Java dili olarak tercih ettim, ama şüphe uyandıran şeylerin programlarına oldukça benziyorlar ve benzer uygulamalar için uygunlar.

Öte yandan, Java'nın da bazı büyük avantajları vardır:

  • İri açık kaynak ekosistemi - ücretsiz alabilirsiniz Java için kütüphaneler vardır arayla herhangi bir dil en iyisi. Bunun önemini abartmak zor - işlerin yapılması açısından Java çok etkili.
  • Araçlar - Java araçları bence .Net dünyasını elde edebileceğinizden daha iyi. örneğin, Maven (bir kez ustalaşınca!) özellikle etkileyicidir.
  • Sürdürülebilirlik - Java bir süredir var ve büyük firmalarda tam olarak başarılıydı çünkü nispeten istikrarlı ve geriye dönük uyumluluk için çok çaba sarf edildi. Basit ve hafif ayrıntılı sözdizimi de burada Java'ya yardımcı olur - kod çok açık ve netse kodu okumak ve bakım yapmak daha kolaydır.
  • Yeni diller - JVM, Java platformunun geleceği olan bazı şaşırtıcı yeni dillere (Scala, Clojure, Groovy vs.) sahiptir. Dil inovasyonunun çoğunun gerçekleştiği yer burasıdır ve Java ya da C # 'dan çok daha hızlı gerçekleşir.

Java ile C # oldukça yakın bir çağrı ve gerçekten Microsoft kampında mı yoksa Açık Kaynak / platformlar arası kampında mı olmak istediğinize bağlı.

Şahsen ben Java'yı tercih ediyorum çünkü:

  • Kütüphane ekosistemi bence C # 'nın Java' dan daha güzel bir sözdizimine sahip olmasından
  • Uzun vadede, tüm kodumun uygun bir şekilde platformlar arası olmasını ve buluttaki büyük ucuz linux makinelerinde çalışabilmesini istiyorum.
  • Clojure şu anda dünyanın en umut verici dili IMHO ve JVM platformuna sadık kalırsam kodumu ve becerilerimi zaman içinde kolayca Clojure'a geçirebileceğim.

C / C ++

C / C ++, tamamen farklı bir hayvandır. Ben ediyorum değil aşağıdaki nedenlerle günümüzde genel amaçlı uygulama geliştirme için tavsiye:

  • Hafıza yönetimi - günümüzde çoğu genel amaçlı programlama için, kendi hafızanızı yönetmek istemezsiniz. C # veya Java'daki çöp toplama işlemleri, üretkenlik ve akıl sağlığınız için, C / C ++'da kullanmak zorunda olacağınız açık bellek yönetimi tekniklerinden daha iyidir.
  • Karmaşıklık - C ++ özellikle son derece karmaşık bir dildir. Master'ın açılması uzun zaman alıyor ve kodun kendisi de son derece karmaşık olabilir. (Örneğin C ++ şablonları özellikle kıllı ...)
  • Verimlilik - çoğu zaman ve hepsinin eşit olması, C / C ++ 'da yapılması gerekenler için daha uzun sürecektir.

Bununla birlikte, belirli bir sınırlı sayıda özel alanda, özellikle de şüphesiz ki mükemmel bir seçimdir:

  • İşletim sistemleri - işletim sistemi yazıyorsanız, muhtemelen C / C ++ kullanmak istersiniz.
  • Oyun geliştirme - hemen hemen tüm en iyi ticari oyun motorları C / C ++. Zorlu bir AAA başlığı geliştiriyorsanız hala en iyi seçenek (C # ve Java daha az zorlu / gündelik oyunlar için mükemmeldir)
  • Yüksek performanslı bilgi işlem - optimize edilmiş C / C ++ muhtemelen çok yüksek performanslı bir kod yaratmanın en iyi yoludur. Bu optimizasyon seviyesini uygulayan çoğu uygulama için çabaya değmez, ancak bazı alanlarda son derece değerli olabilir (örneğin, yüksek frekanslı işlem)
  • Donanım erişimi - Donanıma doğrudan erişmeniz gerekir (örneğin gömülü bir sistem için)

Bu nedenle, temel olarak, C / C ++, özellikle uygun olduğu etki alanlarından birine odaklanırsanız, mükemmel bir seçimdir.


1
Java'dan java için daha iyi araçlara örnek olarak maven'den bahsediyorsunuz. Ben özellikle onunla değilim, ama belgelere bakıldığında, Maven, yerel .Net yapı aracı MSBuild'e benziyor. Maven'i MSBuild'den daha iyi yapan nedir?
Kevin Cathcart

1
+! (sadece bir oyum olduğu için): Java ekosisteminin neden daha iyi olduğunu ve neden sadece C # ile Java arasındaki sözdizimini karşılaştırmamamız gerektiğini çok iyi açıkladınız. Java daha fazla ve daha iyi kütüphanelere ve araçlara sahiptir. Java dilinin kendisinde pek bir şey olmuyor, ancak JVM için C # 'dan çok daha ilginç olan yeni çok ilginç diller ortaya çıkıyor. Clojure'u tanımıyorum ama Scala'yı çok ilginç buluyorum: en baştan OOP + FP olarak tasarlandı.
Giorgio,

2
Neden herkesin C ++ kodunun elle hafıza yönetimi ile dolu olduğunu düşündüğü? Bildiğiniz C değil, RAII neredeyse hiçbir zaman manuel olarak bellek / boş bellek ayırmak zorunda kalmayacağınız anlamına gelir (yaptığınız zamanlar C # gibi bir dilin sizin için faydasız olacağı zamanlardır).
gbjbaanb

3
@gbjbaanb - muhtemelen RAII genel amaçlı hafıza yönetimi için yetersizdir. Java veya C # 'de gördüğünüz gibi tam bir GC sistemine esneklik açısından hiçbir şekilde eşdeğer değildir. RAII sınırlarının ötesine geçtiğinizde, manuel bellek yönetimi alanına geri dönersiniz.
mikera

3
@mikera Sadece .NET platformunda biraz da dil gelişimi olduğunu belirtmek istiyorum. Örneğin F #, .NET'in geri kalan kısmını sorunsuz bir şekilde bütünleştiren temiz bir işlevsel dildir ve Python yakın zamanda .NET'e Demir Python (ve aynı zamanda hoş bir IDE !) Olarak da aktarılmıştır .
ikh

13
I heard that syntactically they are almost the same.

Sözdizimsel? Kim sözdizimi hakkında uçan maymunlar verir? Sözdizimi yalnızca bir şey için iyidir: sözdizimsel olarak benzer dillerden daha hızlı geçişi sağlamak. Bu kadar.

C #, Java'dan çok daha iyidir. Genel ve fonksiyonel programlama desteğini göz önünde bulundurun - C # Java'nın çok önünde. Operatör aşırı yüklerinden bahsetmiyorum bile ve diğer iyi şeyler - C # çok daha iyi özellikli. Java'nın C # dan daha iyi olduğu düşünülmesinin imkanı yok.

C ++ ve C # daha fazla yarışmada. C ++, inanılmaz derecede sinir bozucu bir arkaik derleme modeline ve C'den bir dizi eski hastalığa sahiptir, ancak şablonları, jeneriklerden çok daha güçlüdür ve kaynak yönetimi yaklaşımları, genel olarak using, tam bir başarısızlık olduğu gibi , çok daha esnek ve güçlüdür. Daha hızlı.


6
Bir dilin hem dil özelliklerini hem de bir dilin kullanılabilirliğini farklı platformlarda karşılaştırması gerektiğini düşünüyorum. C # ile Microsoft arasında kilitli, Java ile değil: en azından UNIX / Linux geliştiricileri için bu büyük bir avantaj. OOP + FP havalı özelliklerdir, ancak JVM'de çalışan ve eski Java koduyla arabirim oluşturabilen Scala'yı kullanabiliyorsanız neden C # ile uğraşırsınız? Zorunlu olmadığım sürece platforma özgü bir dili asla öğrenemem.
Giorgio,

2
@ Giorgio: Mono projesi var. Ancak ikincisi, Microsoft aslında platformlarını önemsiyor - düzenli olarak büyük geliştirmeler yapıyorlar. Java'da yeni bir şey yoktu. Ayrıca, soru C # vs Java hakkında değil, CLR vs JVM hakkında.
DeadMG

4
@DeadMG: Bildiğim kadarıyla Windows'ta geliştirilen hiçbir C # programını alıp Mono ile kuramıyorum. CLR vs JVM değil mi? Soru insanların neden C # veya Java kullandığıyla ilgilidir. İnsanların bir dil kullanması için çalışma zamanına ve işletim sistemine ihtiyaçları vardır. C # 'nin Java' dan daha fazla özelliğe sahip olduğu gerçeğini tartışmıyorum, ancak Java çok daha taşınabilir: bu bir dilin benimsenmesini etkileyebilecek bir faktördür. Aslında, Java hala bazı gelişmiş özelliklerden yoksun olsa bile C # 'dan çok daha sık kullanılıyor.
Giorgio,

3
@Giorgio, sen yapabilirsiniz herhangi bir C # programı alıp Mono ile inşa. Bazı kütüphaneleri kullanamazsınız (C # dilinin bir parçası değildir). Java ise "daha taşınabilir" değil. İOS kodunu C # ile kodlayabilirsiniz, ancak örneğin Java'da değil.
SK-mantığı

2
@Giogio, Mono en azından JVM kadar taşınabilir.
SK-mantığı

7

Eh ve delegeler C#gibi bazı güzel yerleşik özelliklere sahiptir LINQ. Her iki dünyadan da en iyisini alıyor - Javave C++. Karşılaştırma için buraya bakın .

Ama ben Javadünyayı daha çok seviyorum - çok daha açık kaynak kodlu çerçeveler ve her platformda çalışıyor. Ve bana bahsetme Mono- güvenilir bir seçenek değil.


9
+1: "Ama Java dünyasını daha çok seviyorum - çok daha açık kaynak çerçeveleri ve her platformda çalışıyor." Umalım ki, Oracle bunu değiştirmez!
Giorgio

15
Mono'da "güvenilir" olmayanın ne olduğunu açıklamaya dikkat edin.
SK-mantığı

2
@Petar Minchev, Bu senin suçundan başka bir şey değil. Taşınabilirlik kurallarına uymanız ve taşınabilir olmayan kitaplıkları kullanmamanız gerekir - bu şekilde herhangi bir karmaşık uygulama Mono ile güvenilir şekilde çalışır. WPF gibi şeyler asla taşınmaz.
SK-mantık

2
@Petar Minchev, orada pek çok taşınabilir olmayan Java kütüphanesi var. Kullandığınız dil ne olursa olsun, taşınabilirlik konusunda daima dikkatli olmalısınız. Her neyse, soru üçüncü şahıs kütüphaneleri değil, dillerle ilgilidir.
SK-mantığı

3
@Petar Minchev, GTK # taşınabilirdir. Bunun yerine kullanın.
SK-mantığı

3

Bazı kaynaklara göre (bkz. Örneğin http://www.indeed.com/jobtrends ) C # hala Java'dan daha az popüler ve C ++ kadar popüler.

C #, Java'nın sahip olmadığı özellikler sağlar; örneğin, özellikler, işlevsel programlama stili ve benzeri gibi belirli programlama deyimleri için doğrudan destek. C #, C ++ 'dan daha yüksek bir soyutlama seviyesine sahiptir, bu geliştirme zamanının program hızından daha önemli olduğu bir avantajdır.

Şahsen ben hala Java / C ++ dünyalarını tercih ediyorum. Petar Minchev'in dediği gibi, Java daha açık kaynak kodlu çerçevelere ve uygulamalara sahip, her yerde çalışıyor, belirli bir satıcıya ve işletim sistemine daha az bağlı. C ++ 'ın benzer avantajları vardır, ancak kod çoğu zaman bir platformdan diğerine giden uyarlamaları gerektirir. Linux'ta geliştirmeyi tercih ettiğimden ve bildiğim kadarıyla Linux'ta C # ile tam anlamıyla kaçamadığım için C # ile hiç ilgilenmedim çünkü programlama ihtiyaçlarım C, C ++, Java, Scala tarafından karşılanıyor.

Öte yandan, birçok geliştiricinin belirli bir satıcıya bağlı olması bir sorun değildir: Microsoft, işletim sistemi pazarında baskın bir konuma sahiptir ve C # birçok iş fırsatı sunmaktadır. Bu nedenle, IMO'nun birçok geliştiricisi C # 'yı benimsemiştir, çünkü zengin özelliklere sahip bir dil olmasının yanı sıra, aynı zamanda iyi bir yatırımdır.


“Linux'ta C # konusunda tam anlamıyla kaçamazdım” - Bu konuda ayrıntılı bilgi verebilir misiniz? Linux'ta C # diliyle (veya bu konuda F # ile) ilgili herhangi bir sorunla karşılaşmadığım için tam .Net çerçevesinin mevcut olmadığını mı kastediyorsunuz?
Wesley Wiser

@wawa: Bildiğim kadarıyla .Net çerçevesi JDK'ya karşılık geliyor ve .Net çerçevesi sadece Windows için, oysa JDK birkaç işletim sistemi için mevcut. Bu doğru değilse cevabımı düzenleyebilirim (ve fikrimi de değiştirebilirim).
Giorgio

1
Bence daha yakın bir benzetme JDK'nın Temel Sınıf Kütüphanesi olur. BCL standart ve standart olmayan parçalara sahiptir. Mono projesi, standartlaştırılmış parçaların yanı sıra standartlaştırılmış parçaları da uygulamaktadır.
Wesley Wiser

@wawa: Bilgi için teşekkürler. Mono kullanarak C # deneyin deneyin düşünüyorum. Yine de, C # 'nın Microsoft’a Java’dan Oracle’a (veya geçmişte Sun’a göre) göre daha güçlü bir şekilde bağlı olduğunu hala çok kuvvetli hissediyorum.
Giorgio

3

"Bir programlama dili içeren hangi Yazılım Geliştirme Çerçevesi" ne daha iyi?

Çalışacağınız "çevre" gibi başka şeyler eklemeyi unutmuşsunuz.

  1. Yalnızca Windows işletim sistemi için mi çalışacaksınız, ancak düşük seviyede olması ve çok fazla belleği ve başka kaynakları olması gerekmiyor mu?

    .NET'i Windows üzerinden çerçeve olarak seçin ve C # kullanın.

  2. Sadece Windows için mi çalışacaksınız, fakat düşük seviyede olmak zorunda değil, AMA, çok fazla kaynağa sahip değil misiniz?

    Delphi Çerçevesini seçin (ve Object Pascal Delphi programlama dilini veya Lazarus Object Pascal programlama dilini)

  3. Uygulamanız mı? Farklı cep telefonlarında oyun gibi çeşitli platformları desteklemek için gerekli mi?

    Java Framework'ü ve Java programlama dilini seçin.

  4. Grafik arayüzü olarak KDE ile Linux mu?

    C ++ ile QT çerçevesini seçin

  5. Grafik arayüzü olarak Gnome ile Linux mu?

    C ++ ile GObject / GLib çerçevesini seçin

  6. Gelişen sürücüler gibi çok düşük seviyeli işlemlerle mi çalışacaksınız?

    Düz C veya C ++, birkaç kütüphanede standart kütüphanelere sahip İşletim Sistemleri için kullanılır.

Sadece 2 sentim.


1
3 hakkında emin değilim. Akıllı telefonlar bugün çok popüler ve AFAIK, hepsi bir şekilde C # destekliyor, ancak yalnızca Android Java destekliyor.
svick

Delphi ölmedi mi? :)
15'te

@ šljaker Hayır, ancak bu tezler çok popüler değil.
umlcat

1
@svick: Bu bir yalan. Java, Android'in dışında iOS, Symbian, WinMo, Blackberry, Maemo ve WebOS'ta da (yani, önemli ya da hala önemli olan her şey; daha küçük platformlarla başlamama izin vermiyor) bir biçimde var. Android, Blackberry ve Symbian resmen Java'yı geliştirme seçeneği olarak destekliyor; Sun, Apple'ın hoşuna gitmese bile, iOS'ta Java'yı destekliyordu. Java, Android ve Blackberry telefonunda birincil geliştirme dilidir. C #, AFAICT ile aynı şeyi söyleyemem, yalnızca resmi olarak WinMo'da destekleniyor.
Yalan Ryan

1

Bir arama yaparsanız, en iyi programlama dilleri üzerine tartışma üzerine yanılmak olasıdır. İşte arama sonuçlarından biri - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java hala en popüler dil gibi görünüyor.

Java, C ++ 'nın bazı eksikliklerini gidermeye çalıştı (ve programcıların gerçek zamanlı olmayan ve kritik olmayan uygulamalar için hayatı kolaylaştırıyor). Partiye geç gelen C #, Java dilindeki bazı eksikliklerden kaçındı. C # oldukça fazla ilerleme kaydetti (Microsoft üzerinde çok fazla kontrol sahibi olduğu için), Java’daki gelişmeler paydaşları arasındaki çatışmalar nedeniyle önemli bir süre engellendi.


1

Daha önce belirtilmeyen birkaç şey:

C #, C ++ 'dan iyidir, çünkü:

Büyük bir basitliğe çeviren başlık dosyaları ile yok eder.

C # Java'dan daha iyidir çünkü:

Hem referans tipi (sınıf) hem de değer tipi (yapı) kullanıcı tanımlı türlerini destekler; ne yaptığınızı biliyorsanız, önemli performans avantajları sağlayabilir.

Tek yöntemli arayüzler gibi delegeleri destekler, böylece tek yöntemli nesneleri içeren sıkça oluşan yapıların kodlamasını büyük ölçüde basitleştirir.


Hem referans tipi hem de değer tipi tiplerine sahip olmanın hangi yolla C # 'ta performans avantajları sağlayabileceğini açıklayabilir misiniz?
Giorgio

Örneğin, bir kayıt dizisine sahip olmak istiyorsanız, Java'da bir sınıf kullanarak kayıtlarınızı tanımlamaktan başka seçeneğiniz yoktur, bu nedenle diziniz çok sayıda ayrı ayrı nesneye referans dizisi olacaktır. Diziniz birbiri ardına belleğe içeren senin yapılar biri sadece tek bir kesintisiz bölge olacak, böylece C # 'sadece C olduğu gibi, bir yapı kullanarak kayıt tanımlayabilir
Mike Nakış

Başka bir örnek olarak, küçük bir yeni tür tanımlamak istiyorsanız (makine kelimesine uyan bir tür), bunun için yeni bir sınıf tanımlamanız gerekmez; basitçe onu bir yapı haline getirebilirsin, bu yüzden değer semantiğine uyacak. Bu tür yapıların etrafından geçirilmesi, nesnelere yapılan referansların etrafından geçirilmesinden daha pahalı olmayacaktır, ancak herhangi bir nesneyi tahsis etmemek, inşa etmek ve çöp toplamaktan faydalanabilirsiniz.
Mike Nakis

Anlıyorum. Öyleyse, sınıflar yığında somutlaştırılır ve referanslar aracılığıyla erişilirken yapılar yığında somutlanırken (?)
Giorgio

Neredeyse doğru. Bu ifadedeki tek yanlışlık, başka bir nesnenin içine gömülmüşse veya bir yapı dizisinin içindeyse öbek üzerinde bir yapı bulunmasıdır. Ve aynı zamanda, eğer kutuda toplanırsa, Java'daki değer türleri ile aynı şekilde öbek üzerinde de bulunacaktır.
Mike Nakis

1

Beklenen ortamınız ve uzmanlığınız için en iyi dili seçmelisiniz.

Yalnızca Microsoft ortamında çalışıyorsanız C # öğesini seçin. C #, ISO / IEC 23270: 2003 kapsamında standardize edilmiş olsa da, Microsoft'un sürümü, tek uygulama olarak kalmaya devam etmektedir. Dilin birçok önemli kısmı standart tarafından kapsanmamaktadır ve bu nedenle Microsoft'un patentlerine tabidir. Başka hiç kimse, dilin tümüyle uyumlu bir sürümünü diğer sistemler için uygulayamaz, bu nedenle satıcı, dili kullandığınız sürece Microsoft Windows ve. Mobil pazarda kullanmak için beceriler arıyorsanız, başka bir dile bakmak en iyisidir.

Java çalışır, ancak çöp toplama gibi özelliklerden dolayı kısmen çok fazla yükü vardır. Java ayrıca ISO / IEC tarafından standartlaştırılmamıştır, bu nedenle Java platformlarını ve sürümlerini değiştirirseniz, yalnızca Sun / Oracle'ın en iyi niyetlerini değiştireceğinizin garantisi yoktur. Sonunda Android ile çalışmayı planlıyorsanız, bu kesinlikle gitmek yoludur. Android'in programlaması temelde bir kaç değişiklikle Java.

C ++ standardize edilmiştir ve hemen hemen tüm derleyiciler uluslararası standarda uymaktadır, bu nedenle garantili bir davranışınız vardır, ancak dil sizi kendinizden korumaz. Kendi başınıza temizleme ve taşma kontrolü yapmalısınız. Bu zor değil. C / C ++ programcıları bunu uzun yıllardır yapıyor. Apple her şey için Objective C kullanır, bu yüzden Apple'ı hedeflemek istiyorsanız, bunun yerine denemenizi öneririz.

Windows'u bir noktada geride bıraktığınızı görürseniz, her ikisi de şu anda pazarlanabilir olan hem C / C ++ hem de Java öğrenmenizi öneririm.


0

C ++ vs C # ile ilgili olarak (Java'da yeterince uzman olmadığım için), burada eksik olduğum şey, Windows'ta düşük düzeyli şeylere erişme yeteneğidir. Örneğin, C # (henüz) bir yerel ekran sürücüsü geliştiremezsiniz, ancak C ++ ile yapabilirsiniz. Bu C ++ 'ı daha iyi yapmaz. C ++ 'ı C #' ye karşı C # 'yı montaj olarak görüyorum.

Bir özelliği gerçekten uygulamak için gereken zamana bakarsanız C # benim görüşüme göre çok daha verimli. Net çalışma zamanının performans cezası, geliştirilen uygulamaların% 99'u için ihmal edilebilir. Sıkı bir döngü kullanıyorsanız, evet, elbette, ancak bir uygulamanın boşta kalması, herhangi bir giriş, sinyal veya kesilmeyi beklemesi (disk GÇ, düğme tıklaması, ağ, animasyon tamamlama) .

Tüm fonksiyonları ile birlikte CLR kütüphanesinin bir başka büyük yararı var. Küçük geliştiricilere C # eğitimi verdiğim zaman, çoğu sınıfların, üyelerin ve ad alanlarının mantıksal adlandırma kurallarını sevdiklerini söyledi. Bir yöntemin özelliğini bulmak SDK'da mantıklıydı, Visual Basic 5'in ciddi şekilde kusurlu olduğu bir şey. Bu onların kütüphaneyi benimsemelerine müthiş yardımcı oldu. Bir dilin sözdizimini öğrendikten sonra, yeni bir kütüphane öğrenmeye başlamak, herhangi bir SDK'yı iyi kavramak için önemlidir. Tekerleği yeniden icat etmekten kurtarıyor.

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.