Java mı? C# C Sharp mı? Karşılaştırma
Yazılıma merak salan herkes nereden başlamalıyım sorusunu kendine sorar ve sonra ise çevrelerine. Genellikle bu soru dönüp dolaşıp Java’da mı yoksa C# da mı kendimi geliştirmeliyim diye sorulur. Bu sorunun cevabını bulmak çok zor aslında. Objektif olmakta baya bir zor. Yapacağımız projenin ihtiyacına göre yazılım dili seçmek, kendini geliştirmek başlamak için en mantıklı olanı.
Aşağıda ki tablolar C Sharp ve Java’nın detaylı olarak karşılaştırılması var. Tercih sizin.
Data types | Java | C# |
---|---|---|
Single-root (unified) type system | No | Yes |
Signed integers | Yes; 8, 16, 32, 64 bits | Yes; 8, 16, 32, 64 bits |
Unsigned integers | No | Yes; 8, 16, 32, 64 bits |
Character | Yes | Yes |
Date/time | Yes; reference type | Yes; value type |
IEEE 754 binary32 floating point number | Yes | Yes |
IEEE 754 binary64 floating point number | Yes | Yes |
High precision decimal number | No | 128-bit (28 digits) Decimal type |
Boolean type | Yes | Yes |
Strings | Immutable reference type, Unicode | Immutable reference type, Unicode |
Arbitrary size integers | Reference type; no operators | Yes |
Arbitrary size decimals | Reference type; no operators | No |
Complex numbers | No | Yes |
Reference types | Yes | Yes |
Arrays | Yes | Yes |
Value types | No; only primitive types | Yes |
Enumerated types | Yes; reference type | Yes; scalar |
Lifted (nullable) types | No; but wrapper types | Yes |
Tuples | No | Yes |
Pointers | No | Yes |
Reference types | Java | C# |
---|---|---|
Garbage collection | Yes | Yes |
Weak references | Yes | Yes |
Soft and Phantom references | Yes | No |
Proxy support | Yes; proxy generation | Yes; object contexts |
Object orientation | Java | C# |
---|---|---|
Classes | Yes | Yes |
Interfaces | Yes | Yes |
Abstract classes | Yes | Yes |
Member accessibility levels | Public, package, protected, private | Public, internal, protected, private, protected internal |
Class-level inner classes | Yes | Yes |
Instance-level inner classes | Yes | No |
Partial classes | No | Yes |
Statement-level anonymous classes | Yes | No |
Implicit (inferred) anonymous classes | No | Yes |
Deprecation/obsolescence | Yes | Yes |
Overload versioning | Some | Yes |
Properties | No, but see JavaBeans spec | Yes |
Events | No; but the base class library does feature an event mechanism | Yes |
Operator overloading | No | Yes |
Indexers | No | Yes |
Implicit conversions | No | Yes |
Explicit conversions | No | Yes |
Fields and initialization | Java | C# |
---|---|---|
Fields | Yes | Yes |
Constants | Yes | Yes |
Static (class) constructors | Yes | Yes |
Instance constructors | Yes | Yes |
Finalizers/destructors | Yes | Yes |
Instance initializers | Yes | No |
Object initialization | Bottom-up (fields and constructors) | Top-down (fields); bottom-up (constructors) |
Object initializers | No | Yes |
Collection initializers | No; can be modelled | Yes |
Array initializers | Yes | Yes |
Methods and properties | Java | C# |
---|---|---|
Static imports | Yes | No |
Virtual | Virtual by default | Non-virtual by default |
Abstract | Yes | Yes |
Sealing | Yes | Yes |
Explicit interface implementation | No | Yes |
Value (input) parameters | Yes | Yes |
Reference (input/output) parameters | No | Yes |
Output (output) parameters | No | Yes |
Variadic methods | Yes | Yes |
Optional arguments | No | Yes |
Named arguments | No | Yes |
Generator methods | No | Yes |
Extension methods | No | Yes |
Conditional methods | No | Yes |
Partial methods | No | Yes |
Generics | Java | C# |
---|---|---|
Implementation | Type erasure | Reification |
Runtime realization | No | Yes |
Covariance | Yes | Yes |
Contravariance | Yes | Yes |
Reference type constraint | Yes; implicit | Yes |
Value/primitive type constraint | No | Yes |
Constructor constraint | No | Yes |
Relation constraint | Yes | Yes |
Primitive/value type support | No | Yes |
Migration compatibility | Yes | No |
Functional programming | Java | C# |
---|---|---|
Method references | No; but see Delegates / method references | Yes |
Closures/lambdas | No; but see Delegates / method references | Yes |
Expression trees | No | Yes |
Generic query language | No | Yes |
Runtime (dynamic) binding | Java | C# |
---|---|---|
Late-bound (dynamic) type | No | Yes |
Runtime type information and manipulation | Java | C# |
---|---|---|
Runtime type information | Yes; but with type erasure | Yes |
Runtime generics realization | No | Yes |
Runtime type construction | No; third party tools exist | Yes |
Statements | Java | C# |
---|---|---|
Loops | Yes | Yes |
Conditionals | Yes | Yes |
Flow control | Yes | Yes |
Assignment | Yes | Yes |
Exception control | Yes | Yes |
Variable declaration | Yes | Yes |
Variable type inference | No | Yes |
Deterministic disposal (ARM-blocks) | Yes (starting with Java 7) | Yes |
Expressions and operators | Java | C# |
---|---|---|
Arithmetic operators | Yes | Yes |
Logical operators | Yes | Yes |
Bitwise logic operators | Yes | Yes |
Conditional | Yes | Yes |
String concatenation | Yes | Yes |
Casts | Yes | Yes |
Boxing | Yes; implicit | Yes; implicit |
Unboxing | Yes; implicit | Yes; explicit |
Lifted operators | No | Yes |
Overflow control | No | Yes |
Strict floating point evaluation | Yes; opt-in/out | No |
Verbatim (here-)strings | No | Yes |
Exceptions | Java | C# |
---|---|---|
Checked exceptions | Yes | No |
Try-catch-finally | Yes | Yes |
Arrays and Collections | Java | C# |
---|---|---|
Abstract data types | Yes | Partial |
One-dimensional, zero-based index arrays | Yes | Yes |
Rectangular (multidimensional) arrays | No | Yes |
Jagged (arrays of arrays) arrays | Yes | Yes |
Non-zero based arrays | No | Some |
Unified arrays and collections | No | Yes |
Maps/dictionaries | Yes | Yes |
Sorted dictionaries | Yes | Yes[2] |
Sets | Yes | Yes |
Sorted sets | Yes | Yes[3] |
Lists/vectors | Yes | Yes |
Queues/stacks | Yes | Yes |
Priority queue | Yes | No |
Bags/multisets | Yes | Yes |
Metadata | Java | C# |
---|---|---|
Metadata annotations/attributes | Interface based | Class based |
Positional arguments | No; unless a single argument | Yes |
Named arguments | Yes | Yes |
Default values | At definition | Through initialization |
Nested types | Yes | Yes |
Specialization | No | Yes |
Conditional metadata | No | Yes |
Preprocessing, Compilation and Packaging | Java | C# |
---|---|---|
Namespaces | Packages | Namespaces |
Packaging | Package | Assembly |
Classes/assembly search path | Yes; ClassPath | No; /lib |
File contents |
Restricted |
Free |
Conditional compilation | No | Yes |
Custom errors/warnings | No | Yes |
Explicit regions | No | Yes |
*
Threading and Synchronization | Java | C# |
---|---|---|
Threads | Yes | Yes |
Thread pool | Yes | Yes |
Task-based parallelism | No[4] | Yes[5] |
Semaphores | Yes | Yes |
Monitors | Yes | Yes |
Thread local variables | Yes | Yes; ThreadStaticAttribute |
Native interoperability | Java | C# |
---|---|---|
External/native methods | Yes | Yes |
Marshalling | External glue code required | Yes; metadata controlled |
Pointers and arithmetics | No | Yes |
Native types | No | Yes |
Fixed-size buffers | No | Yes |
Explicit stack allocation | No | Yes |
Address-of | No | Yes |
Object pinning (fix variable to address) | No | Yes |
Platform support | Java | C# |
---|---|---|
Linux | Yes | Yes |
Mac OS X | Yes | Yes |
Solaris | Yes | Yes |
FreeBSD | Yes | Yes |
AIX | Yes | Partial? |
iOS | Yes | Yes |
Windows | Yes | Yes |
Windows Mobile | Yes | Yes |
Windows Phone | Yes | Yes |
Android | Yes | Yes |
Feature phones | Yes | No |
Symbian | Yes | No |
Blackberry | Yes | No |
Karşılaştırma tabloları Vikipedia’dan alınmıştır. Daha detaylı bilgi için tıklayın
sonuçlar bana c# ın daha çok yes verisine sahip olduğunu gösteriyor peki neden java nın hakimiyeti giderek güçleniyor.
Bunun en büyük nedeni Java ile geliştirilen projelerde maliyetin C Sharp’a göre az olmasından kaynaklı.
Java ile geliştirilen projelerin maliyeti nasıl daha az oluyor? Diyelim ki ben finans şirketi için uygulama geliştireceğim. DB olarak oracle seçtim. App.server weblogic. Bu teknolojiler üzerine ister C# ile yazarım ister java ile? Arada ne gibi (ciddi derecede) maliyet farkı olur?C# kullansam VS almak zorundayım, java ile geliştirsem mesela Rational App Developer almalıyım. Nedir çok büyük fark? Öğrenmek için soruyorum..
Java için IDE almana gerek yok, Eclipse IDE’yi her yönden genişletebilirsin. Zaten bahsettiğiniz IDE de Eclipse üzerine geliştirilmiştir.
Bazı kriterleri aynı tuttuğunuzda maliyette fazla bir fark görülmeyebilir. Oracle yerine PostgreSQL veya MySQL kullanırsan maliyet değşir. Fakat C# için genelde SQL Server kullanılıyor. Bu da maliyet demek.
C#’ı Visual Studio haricinde hangi IDE’de aynı kalitede ve rahatlıkta kullanabilirsiniz. Bu da Windows’a bağlı kalmanız demek, Windows satın alacaksınız, bir ek maliyet daha. Java için geliştirilen ve şu an en çok kullanılan her IDE’yi ufak tefek ayarlarla diğer işletim sistemlerinde de aynen kullanabiliyorsunuz, maliyet yok. Ayrıca bahsettiğiniz türden IDE bile alsanız, o IDE de platform bağımsız olduğundan, işletim sistemi maliyeti yine olmayacak. Tabi Windows’a bağlı kalmak isterseniz o başka.
IDE, Componentler ve diğer araç-gereçler C# için çoğunlukla ücretlidir. Fakat Java’da böyle bir şeye ihtiyaç duyduğunuzda istemediğiniz kadar çok açık kaynak yazılım bulursunuz. C# için bir maliyette burdan.
Son yıllarda yavaş yavaş hosting alanında hareketlenme var Java için. C# bu yönden üstündü, bu da Java için bir maliyetti. Bu da değişirse Java daha da çok cazip gelmeye başlar.
Ayrıca C# ve Java temelde çok benzer olduklarından birini iyi derecede bilen diğerini çok kısa sürede öğrenir. Programcı esnek olmalı, gerektiğinde ideolojik açıdan karşıt ama temelde aynı teknolojiyi de kullanabilmeli.
C# ile geliştirme yapmanın Java’dan pahalı olduğunu söylersen bende sana acemi derim. C# geliştiricileri ele ayağa düşmüşken asgari ücrete C# bilen çalıştırılabilirken bak bir piyasaya Java’cıların maaşlarına ?
Oracle, WebLogic, IBM RAD, falan filan bayağı masraflı teknolojilerdir. Tersine .Net iyi olduğu için değil Oracle’a göre nispeten daha ucuz çözüm ve daha az maaş alan elaman sunduğu için tercih ediliyor.
Bence de teknolojiler düşünüldüğünde eğer java tarafı bir miktar daha ucuz olabileceği gibi daha (açık kaynak ve bedava olan toollar) profesyonel çözümler düşünülürse (web logic, IBM rad, websphere, oracle db vs..) java daha pahalıya gelebilir. Programcı maliyeti açısından bakılırsa yazılım evleri kafadan .net’çi seçer genelde tabi.. Daha ucuza adam bulabilirler çünkü.
Ancak şöyle bir gerçek var. Java’da daha özgürsünüz. IDE’de seçenek çok, app server’da seçenek çok. DB.de diğer tool ve framework.lerde seçenek çok. Bilgi alabileceğiniz kaynak da daha çok. Ve iyi bir javacı iseniz hiç para ödemeden ve legal olarak tabi çok ciddi yazılım projeleri geliştirebilir ve satabilirsiniz de…