مميزات ال سى شارب (#C)
المزايا الفارقة
تتفرد لغة سي# عن غيرها من لغات برمجة إطار عمل دوت نت في كونها مرتبطة بشكل وثيق بمزايا البنية التحتية المشتركة للغات البرمجة (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 تدعم لغة سي# تقنيات البرمجة الوظيفية من خلال الصفوف التابعية وتعابير لامبدا على الرغم من كونها لغة أمرية أصلاً.
0 comments:
Post a Comment