- آلية تنفيذ البرامج :
نعلم أن لغة Java عندما ترجمتها تتحول إلى لغة وسيطية تدعى ( Byte Code ) و عند تنفيذ البرنامج تقوم آلة جافا الإفتراضية ( Java Virtual Machine ) بتفسير هذا الكود.
الأمر سواء بالنسبة لـ C# حيث يتحول كود C# إلى لغة وسيطية تدعى ( MSIL – Microsoft Intermediate Language ) و من ثم تقوم الـ ( CLR – Common Language Runtime ) بتنفيذ البرنامج إعتماداً على نظام التشغيل المستخدم.
نظرياً الميزة موجودة في كلا اللغتين و لكن هناك إختلافان :
1- أن JVM تدعم عدد أكبر بكثير من أنظمة التشغيل.
2- أن CLR الموجودة في .Net framework تعتبر أقوى و أكثر فاعلية بكثير من JVM، حيث لا تعاني لغات .Net من البطء الذي تعاني منه Java.




4- مجمع النفايات :
تتميز كل من اللغتين بالـ Garbage Collector و هو المسؤولة عن تحريرالذاكرة من الموارد غير المستخدمة، و تعتبر JVM هي المسؤولة عن مجمع النفايات في Java فيما نجد في C# أن الـ CLR هي المسؤولة عنه.

5- المصفوفات غير المنتظمة :
تعتبر المصفوفات غير المنتظمة من أهم مزايا كل من Java و C#، و التي تتميزان بها عن لغات أخرى مثل C++، حيث يجبر المبرمج في C++ على تعريف مصفوفات تكون فيها الأسطر متساوية في أبعادها، بينما في جافا و سي شارب يمكننا تعريف مصفوفة بحيث يكون لكل سطر من أسطرها طول مختلف عن الآخر.
و الكود التالي يوضح ذلك :

كود:
int [][] myArray = new int[2][];
myArray[0] = new int[3];
myArray[1] = new int[9];

1. و هذا الكود صحيح من أجل Java و C# .
6- ليس هناك إجرائيات عامة :
يجب أن تكون جميع الطرائق في Java و C# معرفة ضمن أصناف، و ليس كما في C++ حيث يمكننا تعريف طرائق عامة لا تنتمي إلى أي صنف.

7- نعم للواجهات، لا للوراثة المتعددة :
تتبع كل من java و C# مفهوم الواجهات و التي هي نوع آخر للأصناف المجردة بحيث تستعيض بها عن الوراثة المتعددة الموجودة في C# .

8- السلاسل النصية الثابتة :
تحوي لغةC# الصنف System.String و تحوي Java الصنف java.lang.String، و عند تعريف غرض من أي من هذين الصنفين فإن قيمته ستبقى ثابتة و لن تتغير عند إستدعاء أي طريقة من هذين الصنفين.
لنرى المثال التالي :
كود:


C# Code
String csString = "Test";
csString.ToLower();

Java Code
String jString = "Test";
jString.toLowerCase();

عند إستدعاء الطريقة ToLower() في C# أو الطريقة toLowerCase() في Java فإن ذلك لن يؤثر على القيمة الأساسية للغرض المبني، بل القيمة المعادة هي التي ستتغير فقط.

ملاحظة :
في لغة C# الصنف String هو عبارة عن واجهة للصنف المعياري string في .Net framework

ملاحظة :
لتجنب ذلك يمكن إستخدام الصنفين System.Text.StringBuilder في C# و java.lang.StringBuffer قي java.

9- الصفوف غير القابلة للتوسع :
تؤمن كل من لغتي Java و C# آلية لبناء أصناف غير قابلة للتوسع، بحيث تكون الأصناف هي الأخيرة في الشجرة الوراثية، يتم ذلك في Java بإستخدام الكلمة المفتاحية final و في C# بإستخدام الكلمة المفتاحية sealed، حيث يتم وضع هذه الكلمات المفتاحية في ترويسة تعريف الصنف.

مثال :
كود:
C# Code
sealed class Student {
string fname; string lname; int uid;
void attendClass() {}
}
Java Code
final class Student {
String fname; String lname; int uid;
void attendClass() {}
}