Java ve C# Arasındaki Farklar

Bu yazı, Java programlama dili ile Microsoft’un C# (C Sharp) programlama dili arasındaki farklılıkları ele alan bir derlemedir.

Maddeler, bu iki dilin platformlar arasındaki farklılıkları ele almaz. Yalnızca dil seviyesinde bulunan birtakım farklıları listelemek için hazırlanmıştır.

Bu derleme, herhangi bir üstünlük ya da bir dilin diğerinden daha iyi olduğunu göstermek için hazırlanmamıştır.

Tamamen kişisel ihtiyaçlar doğrultusunda, C# programlama dili ile uygulama geliştirme durumunda, yararlanılmak için çeşitli kaynaklardan ve kişisel deneyimlerden yola çıkarak hazırlanmıştır.

Son olarak bu liste, Java programcılarını hedef alan ve daha çok C# cephesinde bulunan özellikleri öne çıkarmaktadır. Bu yüzden birebir karşılaştırma yazısı olarak da ele alınmayabilir.

Java ve C# Dilleri Arasındaki Farklar

1) Java’da pointer (işaretçi) ve pointer aritmetiği işlemleri yoktur. Buna karşın C#, unsafe block yapıları ile pointer işlemlerine izin verir, her ne kadar bazı kısıtlamalar olsa da.

2) Java, switch yapılarında sadece integer ve char tiplerinde işlem yapar. Her ne kadar enumaration yapısının Java’ya eklenmesi ile bu kısıtlama bir nevi aşılsa da, doğrudan String tipi ile switch komutu kullanılamamaktadır. Ancak C# ile, string tipleri ile de işlem yapılabiliyor. Java 7 ile, bu eksikliğin kapatılması planlanıyor.

3) Partial class yapısı, sınıfların, interfacelerin ve Java’da bulunmayan struct yapısının biden fazla kaynak dosyaya bölünebilmesini sağlar. Partial class özelliği C# da mevcut iken, Java’da bu tür bir özellik bulunmamaktadır.

4) C++ da bulunan virtual method özelliği C# ile de karşımıza çıkıyor. Java’da tüm sınıf methodları otomatik olarak virtual olarak tanımlıdır. Bu sayede, herhangi bir sınıfı genişlettiğinizde (extends) super sınıfın methodlarını herhangi bir ekleme gerektirmeden, doğrudan override edebiliyoruz. Ancak C# da bu böyle değil aynen C++ da olduğu gibidir. C# ile, herhangi bir sınıfın methodunu override etmek için super classda bu method virtual olarak deklare edilmelidir. Java’da final methodlar tanımlayarak, methodların override edilmesini önleyebiliyoruz.

5) Preprocessor (Önişlemci) direktifleri C# ile kullanılabiliyor. Bu sayede, kodun belirli bölgelerini belirli durumlar için derlenmesini sağlayabiliyoruz. Ancak Java’da preprocessor özelliği bulunmuyor.

6) Generic tipler Java ve C# dillerinde mevcut. Ancak Java’da, generic tipler primitive tiplerle kullanılamazken, C# ile kullanılabiliyor.

7) C# da goto komutu varken, Java’da yoktur.

8 ) C# bazı kısıtlamalar dahilinde operator overloading işlemine izin verirken Java, izin vermez.

9) 4. maddedeki özellike doğrultusunda C# da method override işlemini yapabilmek için, override anahtar sözcüğünü kullanmak gerekiyor. Override anahtar sözcüğü kullanılmadan yapılan işlemler C# da, yeni bir method olarak ele alınır. Ancak Java ile herhangi bir anahtar sözcük gerektirmeden doğrudan super class methodlarını override edebiliyoruz.

10) Java daki her primitive data type ın C# da bir karşılığı vardır. Ancak C#, Java’ya oranla çok daha fazla primitive data type sunar. Java’daki tüm primitive typeların aynı isimle karşılığı C# da da bulunmaktadır. Ancak Java’daki byte ın karşılığı C# da sbyte dır. C# byte veri tipi unsigned dır. Bunun haricinde C# Java’da olmayan işaretsiz tamsayı değerleri de sunar. ulong, ushort, uint ve decimal tipler Java’da yoktur.

11) C#, Java’da olmayan method pointerlar sunar. Delegate adı verilen bu yapı ile C# da, methodlar parametre olarak başka methodlara geçirilebiliyor. Delegateler, C# da event handling (olay yönetimi) ve callbackler için kullanılıyor.

12) Olay yönetimi Java’da Observer tasarım şablonu ile gerçekleştirilirken, C# da olay yönetimi, dil seviyesinde delegate ler yardımı ile yapılmaktadır.

13) C# da Java’da bulunan checked exception sistemi yoktur. C# sadece, çalışma zamanında yönetilen unchecked exception sistemini destekler.

14) C#, Java’da setter ve getter methodlar ile yapılabilen instance field işlemlerini Properties adı verilen bir mekanizma ile yapılmasını sağlar. Bu sayede ekstra getter setter methodlar yazılmasına gerek kalmıyor. //TODO

15) C#, Java’da bulunmayan ve indexer adı verilen bir yapı ile [] operatörünü overload ederek, sınıf örnekleri üzerinde array tarzı işlemler yapılabilmesini sağlar. //TODO

16) C# da, C/C++ da bulunan struct yapısı mevcut ve veri tipi olarak kullanılırken Java’da bu yapı bulunmuyor.

17) C# Exception tanımlamak ve yakalamak gibi bir zorunluluk yok. Java, ortaya çıkış felsefesi gereği (robust application) buna izin vermez.

18) Java’da C# da bulunan static class yapısı yoktur. Static sınıflar, instance field, instance constructor gibi yapılara izin vermez. Başka bir sınıf tarafından genişletilemez.

19) C# da iterasyon işlemini kolaylaştırmak için, Java’da bulunmayan yield adında bir anahtar sözcük bulunmaktadır. Ancak tam olarak ne işe yaradığını bilmiyorum. //TODO

20) C# da tam olarak ne işe yaradığını bilmediğim ref ve out  gibi anahtar sözcükler ile methodlara parametre geçirilebiliyor. Java’da böyle bir yapı yok.

Şimdilik aklıma gelen ve kaynaklardan araştırdığım kadarı ile üzerinde durulması gereken farklar bunlar. Ancak, bu listeyi zamanla genişleterek C# ve Java arasındaki programlama dili seviyesindeki farklılıkları, daha geniş olarak ele almaya devam etmek istiyorum.

Sizinde aklınıza gelen veya listede dikkatinizi çeken herhangi bir eksik ya da ekleme varsa, yorumlarınızla katkıda bulunabilirsiniz.

Yorum bırakmak için buraya, Sitenizden trackback vermek için buraya tıklayabilirsiniz.

5 Responses to “Java ve C# Arasındaki Farklar”

  1. Volkan diyor ki:

    Merhabalar
    18. madde de yanlış anlamadıysam javada static class yapısı olmadığını söylüyorsunuz.Burada bir yanlışlık olmuş javada static sınıf yapısı vardır.
    Saygılar

  2. dale diyor ki:

    yield değişkeni javada da var ve o anda calisan threadin, diger threadlerin calismasina izin vermek uzere bir sure durmasini saglar

  3. fatih diyor ki:

    Arkadaşlar teşekkür ederim ilginiz için ama sanırım bi yanlış anlama var.
    Yazı, verilen özelliklerin C# dilindeki işlevselliği ile kıyaslanmıştır.

    volkan,
    Javada static class tanımlayabilirsin, doğru fakat bir başka classın elemanı olarak static bir eleman olarak tanımlayabilirsin. Ancak burda benim bahsettiğim, doğrudan static bir class oluşturamamkla ilgiliydi. Yani C# da bulunan Singleton design pattern benzeri bir yapıdan bahsediyorum.

    dale,
    Hayır Java’da yield adında bir değişken(?), keyword yok. Thread sınıfına ait yield adında bir fonksiyon var evet. Fakat yazıda benim bahsettiğim yield, C# da bulunan ve iterasyon işlemlerinde kullanılan bir keyword. Böyle bir yapı Java’da yok.

  4. barış diyor ki:

    bir sorum olacaktı? kütüphane sayısı hangi dilde(java ,.net) daha fazla. cevaplarsanız sevinirim..

  5. fatih diyor ki:

    Ben .NET ile büyük çaplı bi proje geliştirmedim. Bu nedenle .NET e yeterince hakim değilim. Muhtemelen .NET in kütüphaneleri de çok büyüktür.

    Fakat işin Java tarafına bakarsak, Java’nın inanılmaz büyük bir topluluğu var. IBM, Google gibi firmalarında ürettiği kütüphaneler(Spring, GWT, Hibernate vs..) frameworkler var. Yani bi konuda bir API ye yada kütüphaneye ihtiyaç duyarsanız ve bu standart Java kütüphanelerinde mevcut değilse, bu işi gören kütüphaneler büyük bir olasılıkla birileri tarafından yazılıp kullanıma sunulmuştur (Örn Apache Commons)

    Java’da böyle bir esneklik var. Bir kütüphaneye ihtiyaç duyarsan, Google’da küçük bir arama yapman yeterli oluyor.

Leave a Reply