سي شارب
النحو > المزايا الفارقة

تتفرد لغة سي# عن غيرها من لغات برمجة إطار عمل دوت نت في كونها مرتبطة بشكل وثيق بمزايا البنية التحتية المشتركة للغات البرمجة (CLI)، فعلى سبيل المثال تنسب معظم الأنماط الحقيقية إلى قرائنها من أنماط القيمة (بالإنجليزية: value-types)‏ الموجودة في CLI. على الرغم من ذلك فإن توصيف اللغة لا يتطرق إلى متطلبات توليد الكود الخاصة بالمصرّف، بمعنى أن التوصيف لا يرغم مصرف سي# على توليد كود متوافق مع وقت التنفيذ المشترك للغات (CLR) أو توليد تعليمات متوافقة مع اللغة المشتركة الوسيطة (بالإنجليزية: Common Intermediate Language)‏ أو أي تنسيق آخر. وهكذا يمكّن (نظرياً على الأقل) مصرّف سي# من توليد كود لغة الآلة مباشرة على غرار باقي المصرفات كمصرّف سي++ ومصرّف فورتران. فيما يلي بعض من المزايا الجديرة بالاهتمام كونها تميز لغة سي# عن لغتي سي وسي++ (بالإضافة إلى جافا لدى ذكر ذلك صراحة):
تدعم سي# التصريح الضمني عن المتحولات قوية التنميط عن طريق الكلمة المفتاحية var بالإضافة إلى التصريح الضمني عن المصفوفات المنمطة عن طريق الكلمة المفتاحية متبوعة بمهيئ المجموعة.
إن إمكانية الميتا-برمجة (بالإنجليزية: Meta Programming)‏ من خلال استخدام السمات (بالإنجليزية: Attributes)‏ هي جزءً من توصيف اللغة. توفر العديد من هذه السمات وظيفية مطابقة لتلك التي توفرها موجهات قبل التصريف المعتمدة على المنصة المدعومة من قبل جي.سي.سي وفيجوال سي++.
يجب على مبرمجي سي# استخدام الكلمة المفتاحية virtual من أجل إتاحة تجاوز الطرق في الصفوف المشتقة على غرار لغة سي++ (وخلافاً للغة جافا).
تتيح الدوال الملحقة (بالإنجليزية: Extension Methods)‏ لمبرمجي سي# إمكانية استخدام الطرق الاستاتيكية كما لو أنها طرق خاصة بالصف، وهذا ما يمكن المبرمج من إضافة طرق جديدة إلى الصفوف عن الإحساس بضرورة وجودها في الصف نفسه وكافة الصفوف المشتقة منه.
يتيح النمط dynamic إمكانية الربط مع الطرق أثناء التنفيذ بما يمكن من استدعاء الطرق وتركيب الكائنات وقت التنفيذ مثلما تفعل لغة جافا سكربت.
لدى سي# الكلمة المفتاحية delegate التي تتيح تعريف مؤشرات قوية التنميط إلى توابع.
لدى سي# وظيفية الإعلان عن الأحداث والتسجيل عليها من خلال استخدام delegate وغيرها بشكل يشابه وظيفية الإشارات والمقابس (بالإنجليزية: signals and slots)‏ التي تضيفها بيئة تطوير كيوت إلى لغة سي++.
توفر سي# استدعاءات الطرق المتزامنة بما يشابه لغة جافا عن طريق استخدام السمة [(MethodImpl(MethodImplOptions.Synchronized]، كما أنها تدعم أقفال استبعاد التشارك عبر الكلمة المفتاحية lock.
لا تسمح لغة سي# باستخدام المتحولات العامة ولا التوابع الشاملة إذ يجب التصريح عن كافة الطرق والأعضاء ضمن الصفوف. تعد الطرق الاستاتيكية الخاصة بالصفوف العامة بديلاً للتوابع والمتحولات الشاملة.
خلافاً للغتي سي وسي++ لا تستطيع المتحولات المحلية إخفاء المتحولات الموجودة في الكتلة البرمجية المحيطة.
يوفر فضاء التسمية namespace في لغة سي# نفس المستوى من العزل الذي توفره رزمة package جافا وفضاء التسمية namespace سي++، كما أنه يتمتع بالعديد من القواعد والميزات الشبيهة برزمة جافا.
تدعم سي# نمط المعطيات البولياني bool بشكل صارم. إذ تتطلب كافة العبارات البرمجية التي تتضمن شروطاً (مثل عبارة while وعبارة if) تعابيراً من نمط يحقق المعامل true كالنمط البولياني مثلاً. بالمقارنة مع لغة سي++ التي تحوي أيضاً النمط البولياني نجد أن سي++ تتيح تحويل هذا النمط من وإلى أرقام صحيحة، نتيجةً لذلك يمكن تتطلب بعض التعابير مثل (if(a فقط أن يكون a قابل للتحويل إلى bool مفسحة المجال بذلك لأن يكون a من النمط int أو حتى أو يكون مؤشراً. لا تتيح سي# مقاربة «الأعداد الصحيحة تعني صحيح أو خطأ» على اعتبار أن إجبار المبرمج على استخدام تعابير تعيد النمط bool تماماً قد يمنع حدوث عددٍ من الأخطاء البرمجية الشائعة في لغتي سي وسي++ (مثل العبارة (if(a = b حيث استًبدل معامل المقارنة == بمعامل الإسناد =).
تتيح سي# إمكانية استخدام المؤشرات إلى عناوين الذاكرة فقط ضمن كتل مشار إليها بالكلمة المفتاحية unsafe (غير آمن)، وتتطلب البرامج التي تحتوي كوداً غير آمنٍ سماحيات ملائمة كي تعمل. غالباً ما تستخدم الدلائل (بالإنجليزية: References)‏ الآمنة من أجل الولوج إلى الكائنات، حيث تشير هذه الدلائل دائماً لى كائنات فعالة في الذاكرة كما أن لديها قيمة فارغة null معرفة بشكل ملائم؛ من المستحيل الحصول على دليل إن كائن تم تدميره (من خلال جامع القمامة) أو الولوج إلى كتلة عشوائية في الذاكرة. يمكن للمؤشر غير الآمن الإشارة إلى متحول من نمط-قيمة أو مصفوفة أو سلسلة محرفية أو كتلة من الذاكرة محجوزة على المكدس. يمكن للكود غير الآمن أن يخزن ويتلاعب بالمؤشرات من خلال النمط System.IntPtr ولكن لا يمكنه الاطلاع على محتوياتها.
لا يمكن تحرير الذاكرة المُدارة بشكل مباشر إذ يتم تحريرها بشكل أوتوماتيكي من قبل جامع القمامة. إن جمع القمامة يعالج معضلة تسرب الذاكرة من خلال إعفاء المبرمج من مسؤولية تحرير الذاكرة.
توفر لغة سي# بالإضافة إلى بنية try...catch الخاصة بمعالجة الاستثناءات البنية try...finally التي تضمن تنفيذ الكود الموجود في كتلة finally سواءً حصل استثناء أم لم يحصل.
لا تدعم سي# الوراثة المتعددة على الرغم من أنه من الممكن لصف أن يحقق عدداً من الواجهات. يعود السبب في ذلك إلى قرار اتخذه المعماري الرائد في تصميم اللغة بهدف الابتعاد عن التعقيد وتبسيط المتطلبات المعمارية الخاصة بالبنية التحتية المشتركة للغات البرمجة (CLI). في حال تحقيق عدة واجهات تحتوي الطريقة ذاتها تتيح سي# للمبرمج إمكانية تحقيق الطريقة عدة مرات بشكل يتناسب مع الواجهة التي سيتم استدعاؤها من خلالها، أو (كما في لغة جافا) يمكن للمبرمج أن يحقق الطريقة مرة واحدة فقط بحيث يتم استدعاء هذا التحقيق من قبل كافة الواجهات التي تحتوي تلك الطريقة.
خلافاً للغة جافا تدعم لغة سي# التحميل الزائد للمعاملات، إلا أنها تدعم تحميل المعاملات الأكثر شيوعاً فقط بالمقارنة مع لغة سي++.
تتمتع سي# بكونها ذات تنميط أكثر أمناً من لغة سي++. إن التحويلات الضمنية المتاحة بشكل افتراضي في اللغة هي تلك المعدة الآمنة بشكل حصري. مثل توسيع الأعداد الصحيحة (من Int16 إلى Int32 مثلاً). يتم تطبيق هذه السياسة أثناء التصريف وخلال الترجمة في الوقت المناسب (JIT) وفي بعض الأحيان أثناء التنفيذ. لا يوجد تحويل ضمني بين النمط البولياني والنمط الصحيح ولا بين أعضاء الأنماط التعدادية والنمط الصحيح (باستثناء المحرف 0 والذي يمكن تحويله ضمنياً إلى أي نمط تعدادي). يجب الإشارة إلى أي تحويل معرف من قبل المستخدم بشكل صريح أو ضمني بشكل يخالف البواني الناسخة ومعاملات التحويل في لغة سي++ التي تعمل بشكل ضمني افتراضياً.
تدعم سي# بشكل كامل التباين والتباين المعاكس للأنماط العامة على خلاف لغة سي++ التي توفر دعماً محدوداً للتباين المعاكس من خلال التحكم بمعاني الأنماط المعادة في الطرق الافتراضية.
لأعضاء التعدادات ضمن مجال الرؤية الخاص بها.
توفر لغة سي# الخصائص (بالإنجليزية: Properties)‏ كتجميل لغوي لنمط برمجي شائع يتم فيه تعريف زوج من الطرق: طريقة للحصول على القيمة (بالإنجليزية: getter)‏ وأخرى لتعديل القيمة (بالإنجليزية: setter)‏ بهدف تغليف عمليات الوصول إلى عضو من أعضاء الصف. نتيجة لذلك لم تعد هنالك حاجة لكتابة العديد من هذه الطرق بشكل تكراري، بالإضافة إلى ذلك يمكن الولوج إلى الخصائص بشكل موجز بنفس طريقة الولوج إلى الأعضاء ولا حاجة لاستخدام استدعاء الطريقة المعتاد للقيام بذلك.
خلافاً للغة جافا لا تدعم لغة سي# الاستثناءات المفحوصة (الاستثناءات التي يمكن أن تحصل ضمن طريقة ما، يمكن للطريقة أن تصرح عن هذه الاستثناءات كجزء من توقيعها). وقد اتخذ قرار بالإحجام عن هذه الميزة نظراً لأنها قد تسبب معضلات فيما يتعلق بقابلية التوسع والتعامل مع الإصدارات المختلفة.
ابتداءً من الإصدار 3.0 تدعم لغة سي# تقنيات البرمجة الوظيفية من خلال الصفوف التابعية وتعابير لامبدا على الرغم من كونها لغة أمرية أصلاً.