كثر الحديث عن أوجه الشبه و الإختلاف بين جافا و سي شارب ... فمبرمجو جافا يرون أن سي شارب هي إحدى نسخ جافا و أن Microsoft قامت بسرقة جافا و تسميتها بمسمى جديد، بينما يرى مبرمجو سي شارب أن هذا الكلام غير صحيح، فكلٌ من Java, C# مشتق من لغة C++ و لا فضل لـ Java على C#.

برأيي الشخصي أن كلا الطرفين صحيح معاً، فكما نعلم جميعاً أن Microsoft أجبرت على التخلي عن منتجها الرائع Visual Java الموجود مع Visual Studio 6 سابقاً، بسبب الدعوى القضائية التي أقيمت عليها، و المشكلة كانت أن هناك جيشاً من المبرمجين الذين كانوا قد إعتمدوا Visual Java كبيئة عمل لهم نظراً لما تقدمه من خدمات تسهم في تخفيض المصاعب و زيادة الإنتاجية.
وجدت Microsoft الحل في تصميم لغة برمجية جديدة بحيث تكون قريبة جداً من لغة java بحيث تستطيع من خلالها الإبقاء على أكبر قدر ممكن من المبرمجين الذين إستخدموا Visual Java و التي إضطرت إلى إلغائها من مشاريعها التطويرية، و بالفعل نجحت Microsoft إلى حد كبير في بناء لغة مشابهة من حيث البنية للغة جافا و هي لغة C#، حيث ألقت Microsoft بكل ثقلها لتطوير هذه اللغة و نشرها و عمل الدعاية الإعلامية لها بغية جذب أنظار المبرمجين حول العالم إليها، و بالفعل نجحت بذلك حيث أصبحت C# الآن إحدى أكثر اللغات إنتشاراً حول العالم، بل أنها حطمت جميع الأرقام القياسية في سرعة إنتشارها، فهذه اللغة التي لا يتجاوز عمرها الخمس سنوات أصبحت معتمدة في كثير من الجامعات و المعاهد كلغة لشرح و تطبيق الخوارزميات.

ما الجديد في C# :
لم تكتف Microsoft بمزايا لغة Java فقط، بل أضافت الكثير إليها، و أهم شيء هو المرونة و السرعة في العمل، بالإضافة إلى إطار عمل .Net القوي و الذي إستمدت Microsoft فكرته أيضاً من JVM.

أين Java من هذا ؟ :
يخطئ كثيراً من يعتقد أن Microsoft تجاوزت Sun في صراع C#, Java، فما زالت Java إلى الآن تملك الكثير من نقاط القوة التي تتجاوز فيها لغة C# و من أهمها كم المكتبات الهائل المكتوبة بلغة Java، فلغة Java لاقت إنتشاراً واسعاً و ليس فقط لدى مبرمجي Windows، بل لدى جميع العالم على إختلاف أنظمة التشغيل التي يعملون عليها.
بالإضافة إلى ذلك فإن خاصية الـ Portability في جافا تجعلها دائماً في الطابق العلوي، فصحيح أن هناك مترجمات لـ C# لتشغيل برامجها على Linux مثلاً، إلا أنها لم تصل و لا حتى إلى 25% من توافقية Java مع أنظمة التشغيل.

سنقوم على مدار عدة محاضرات بذكر أوجه التشابه و الإختلاف بين اللغتين.

1- كل من اللغتين غرضي التوجه :
إن كلاً من لغتي Java و C# هو غرضي التوجه بشكل كامل، حيث أن جميع الأصناف في Java مشتقة من بعضها و تصل بمستوى وراثتها إلى أب أوحد هو java.lang.Object و نفس الشيء تماماً بالنسبة لـ C# حيث أن جميع الأصناف مشتقة من الصنف الأب System.Object
يحتوي كل من الصنفين System.Object و java.lang.Object على مجموعة من الطرائق التي ترثها جميع الأصناف بدون إستثناء، حتى تلك التي نقوم نحن ببنائها، فجميع الأصناف في Java و C# مجبرة على الوراثة من هؤلاء الآباء.
يحتوي الصنف Object في Java على طرائق أكثر من تلك الموجودة في الصنف Object في C#، فكلٌ منهما يحتوي على الطريقة toString() في Java و ToString() في C#، بينما تحوي جافا كزيادة عن C# على الطرائق التالية : wait(), notify(), notifyAll().

2- الكلمات المحجوزة :
نعلم أن لكل لغة مجموعة من الكلمات المحجوزة الخاصة بها، و إن زيادة عدد هذه الكلمات يدل على زيادة عدد الوظائف الجاهزة التي يمكنك القيام بها في هذه اللغة.
من خلال النظر إلى الجدول التالي سنجد أن C# تتفوق على Java في عدد الكلمات المحجوزة و التي تشير إلى وظائف إضافية تتميز فيها C#.



C# keyword Java keyword
abstract abstract
explicit N/A
as N/A
extern native
base super
finally finally
bool boolean
fixed N/A
break break
float float
byte N/A
for for
case case
foreach N/A
catch catch
get N/A
char char
goto goto
checked N/A
if if
class class
implicit N/A
const const
in N/A
continue continue
int int
decimal N/A
interface interface
default default
internal protected
delegate N/A
is instanceof
do do
lock synchronized
double double
long long
else else
namespace package
enum N/A
new new
event N/A
null null
object N/A
this this
operator N/A
throw throw
out N/A
true true
override N/A
try try
params N/A
typeof N/A
private private
uint N/A
protected N/A
ulong N/A
public public
unchecked N/A
readonly N/A
unsafe N/A
ref N/A
ushort N/A
return return
using import
sbyte byte
value N/A
sealed final
virtual N/A
set N/A
void void
short short
volatile volatile
sizeof N/A
while while
stackalloc N/A
static static
extends :
implements :
string String
N/A strictfp
struct N/A
throws throws
switch switch
N/A transient




و بالرغم من أن الكلمتين المفتاحيتين const, goto موجودتان في لغة java إلا أنهما غير مستخدمتين حالياً.