مرجع
آخر الزيارات

سي شارب

3٬745 كلمة•0 مشاهدة•🗒️ منذ 17 يوماً
باختصار: سي# (تلفظ سي شارب/see sharp) هي لغة برمجة متعددة الأنماط تتمتع بكونها سكونية التنميط وأمرية وتعريفية ووظيفية وتعتبر كائنية التوجُّه أو البرمجة الشيئية (بالإنجليزية: (Object-oriented programming - OOP) وعمومية وشيئية المنحى (غرضية التوجه)…. في هذه المقالة 29 قسماً: «الأنماط العامة»، «التسمية» و«class Program» وغيرها.
المحتويات
  1. الأنماط العامة
  2. التسمية
  3. class Program
  4. }
  5. بحاجة إلى إضافة
  6. نظام الأنماط المشترك
  7. المكتبات وأُطُر العمل
  8. فئات أنماط المعطيات
  9. إطار عمل دوت نت كور 2.1
  10. النحو
  11. أنماط القيمة
  12. الإصدارات
  13. GenericList list2 = new GenericList;
  14. الأنماط القابلة للعدم
  15. إطار عمل دوت نت كور 1.0
  16. استنباط نمط الباني
  17. مشروع مونو
  18. }
  19. صفات قابلة للقراءة فقط
  20. التعليب وفك التعليب
  21. 17.4
  22. سمات معلومة المستدعي
  23. أهداف التصميم
  24. int foo = 42; // نمط القيمة
  25. تاريخ اللغة
  26. مايكروسوفت فيجوال ستوديو
  27. using System;
  28. استخدام التعابير كطرق
  29. المزايا الفارقة
سي شارب

في البداية، سي# (تلفظ سي شارب/see sharp) هي لغة برمجة متعددة الأنماط تتمتع بكونها سكونية التنميط وأمرية وتعريفية ووظيفية وتعتبر كائنية التوجُّه أو البرمجة الشيئية (بالإنجليزية: (Object-oriented programming - OOP) وعمومية وشيئية المنحى (غرضية التوجه) (باستخدام الفئات) كما تخضع لمبادئ البرمجة التركيبية المنحى. وفيما يلي تفاصيل أوسع عن ذلك.

الإصدار الأحدث من اللغة هو C# 13 وطرح في 2024.

وفي السياق ذاته، قامت مايكروسوفت بتطوير هذه اللغة في إطار عملها على تطوير دوت نِت وتمت الموافقة على تعييرها من منظمة Ecma (المعيار Ecma-334) والمنظمة الدولية للمعايير (المعيار ISO/IEC 23270:2006). إن سي شارب إحدى لغات البرمجة المصممة للعمل على البنية التحتية المشتركة للغات البرمجة (CLI). صُممت لغة سي شارب لتكون لغة بسيطة وحديثة وعامة الأغراض وشيئية المنحى. وقد قاد أندرس هيلسبرغ فريق تطويرها.

الأنماط العامة

  • // التعريف عن الصف العام
  • public class GenericList
  • {
  • void Add(T input) { }
  • }
  • class TestGenericList
  • {
  • private class ExampleClass { }
  • static void Main
  • {
  • // تعريف قائمة من النمط الصحيح
  • GenericList list1 = new GenericList;
  • // تعريف قائمة من نمط السلسلة المحرفية

إضافةً إلى ذلك، أضيفت الأنماط العامة إلى سي# بدءاً من الإصدار 2.0. تستعمل الأنماط العامة بارامترات الأنماط والتي تمكن المطور من تصميم صفوف وطرق دون الحاجة إلى تحديد الأنماط المستعملة، حيث يتم تحديد هذه الأنماط فقط لدى استخدامها. تكمن الفائدة من ذلك بأن القدرة على استخدام بارامترات الأنماط العامة لإنشاء الصفوف والطرق يمكن من استخدامها بشكل فعال كونه يجنب تكاليف التنفيذ الإضافية التي تسببها عمليات التعليب وفك التعليب كما يوضح المثال التالي:

التسمية

كذلك، تم اختيار رمز الشباك (رمز اليونيكود U+0023) لتمثيل رمز شارب في كتابة اسم اللغة عوضاً عن الرمز ♯ (رمز اليونيكود U+266F) بسبب قيود تقنية تمنع من إظهاره (كافتقار دعم الخطوط القياسية وبعض المتصفحات للرمز ♯) كذلك عدم وجوده على لوحة المفاتيح القياسية.اتبع هذا التقليد كذلك في معيار توصيف اللغة ECMA 334. على كل الأحوال تستعمل مايكروسوفت الرمز الموسيقي الصحيح عندما يمكنها عملياً القيام بذلك (مثلًا في الحملات الدعائية أو على غلاف المنتج). استُخدمت اللاحقة «شارب» في عدد من لغات دوت نت المبنية على لغات أخرى بما فيها لغة جي شارب (لغة دوت نت صممتها مايكروسوفت بالاشتقاق من لغة جافا 1.1) ولغة إيه شارب (مشتقة من لغة أيدا) ولغة البرمجة الوظيفية إف شارب. أطلق على التحقيق الأصلي من لغة آيفل الخاص بدوت نت اسم آيفل شارب إلا أنه تم التخلي عن هذا الاسم بعد دعم آيفل بشكل كامل. استُخدمت هذه اللاحقة كذلك في تسمية بعض المكتبات مثل Gtk شارب (تغليف دوت نت لمكتبة +Gtk ومكتبات جنوم أخرى) ومكتبة كوكوا شارب (تغليف مكتبة كوكوا).

علاوةً على ذلك، إن الاسم "C sharp" مستوحى من الرمز الموسيقي حيث يشير الرمز ♯ إلى أن النوتة المكتوبة مرتفعة أكثر بمقدار نصف درجة موسيقية. تتشابه هذه التسمية مع اسم لغة ++C حيث تشير "++" إلى وجوب زيادة المتحول بمقدار 1. يشبه الرمز ♯ شكلاً من أربع إشارات "+" (في شبكة 2x2) بما يعني ضمناً أن هذه اللغة هي زيادة بمقدار 1 على لغة ++C.

class Program

انظر كذلك

من جانب آخر، يقوم هذا السطر بكتابة خرج (ناتج التنفيذ للبرنامج) البرنامج. إن Console هو صف (كلاس) استاتيكي موجود في فضاء التسمية (Namespace) System ويقوم بدور واجهة برمجية إلى المجاري الأساسية (مجرى الدخل ومجرى الخرج ومجرى الخطأ) خاصة بتطبيقات الكونسول. يستدعي البرنامج الطريقة WriteLine الخاصة بالصف (كلاس) Console والتي تقوم بإظهار محتوى البارامتر الخاص بها (في هذه الحالة !Hello World) إلى الكونسول في سطر مستقل.

ومن جهة أخرى، static void Mainيعرّف هذا السطر طريقة استاتيكية (خاصة بالصف) يتم استدعاؤها عندما يبدأ البرنامج بالتنفيذ. يستدعي وقت تنفيذ دوت نت (CLR) الطريقة Main. (ملاحظة: يمكن استدعاء الطريقة Main كغيرها من الطرق، مثلًا يمكن لطريقة أخرى من الصف Program استدعاء الطريقة Main). الكلمة المفتاحية static تجعل الولوج إلى الطريقة مباشرة دون الحاجة إلى إنشاء كائن من الصف Program ممكناً. في تطبيقات الكونسول يجب أن تكون الطريقة Main استاتيكية. لأنه في حال لم تكن استاتيكية عندها سيحتاج البرنامج إلى كائن من الصف Program، إلا أن إنشاء الكائن سيحتاج برنامجاً يقوم بإنشائه. لحل مشكلة الاعتمادية التبادلية هذه تقوم مصرفات سي# لدى تصريفها تطبيقات الكونسول بإصدار خطأ عند الفشل في إيجاد طريقة Main استاتيكية. الكلمة المفتاحية void تعني أن الطريقة Main لن تقوم بإعادة قيمة.Console.WriteLine("Hello world!");

من جانب آخر، يعرّف السطر السابق الصنف Program. كل ما يوجد ضمن زوج القوسيين التاليين يتبع تعريف Program.

}

وفي هذا السياق، سيقوم هذا البرنامج بطباعة العبارة !Hello World إلى الكونسول. لكل سطر في هذا البرنامج وظيفة معينة:

بحاجة إلى إضافة

في هذا الإطار، يقصد بذلك إمكانية التعامل مع المصرف كمكتبة برمجية، بحيث يمكن مثلًا للمطور أن يطلب من المصرف أن يقوم بترجمة مجموعة من التعليمات (على شكل شجرة تعابير) وإعادة حقنها في البرنامج وقت التنفيذ دون الحاجة لإعادة تصريف الكود.

نظام الأنماط المشترك

كذلك، لدى سي# نظام أنماط موحد يدعى نظام الأنماط المشترك أو اختصاراً CTS. إن نظام الأنماط الموحد يقوم على مبدأ أن كافة الأنماط بما فيها الأنماط البسيطة كالأعداد الصحيحة هي صفوف مشتقة من الصف . مثلًا يرث كل نمط الطريقة .

المكتبات وأُطُر العمل

  • دعمت لغة سي# بعدد من المكتبات مثل:
  • مكتبات النظام (دوت نت)
  • مكتبات النظام (دوت نت كور)، نسخة مشابهة لـ«مكتبات النظام (دوت نت)»
  • مكتبة الرسوميات المفتوحة (OpenGL) في سي#، من هنا
  • ودعمت بالكثير من أُطُر العمل مثل:
  • إطار عمل دوت نت (.NET Framework)
  • نواة دوت نت (.NET Core)
  • منصة ويندوز العالمية (UWP)
  • إطار عمل زامرين (Xamarin.Forms / Xamarin)
  • أي إس بي دوت نت (ASP.NET)

فئات أنماط المعطيات

يصنف نظام الأنماط المشترك أنماط المعطيات ضمن فئتين:

أنماط المرجع

إطار عمل دوت نت كور 2.1

  • إطار عمل دوت نت كور 2.2فيجوال ستوديو 2017
  • 15.7سي# 8.0سبتمبر 2019إطار عمل دوت نت كور 3.0
  • إطار عمل دوت نت كور 3.1فيجوال ستوديو 2019
  • 16.3سي# 9.0نوفمبر 2020دوت نت 5فيجوال ستوديو 2019
  • 16.8سي# 10.0نوفمبر 2021دوت نت 6فيجوال ستوديو 2022
  • 17.0سي# 11.0نوفمبر 2022دوت نت 7فيجوال ستوديو 2022
  • 17.4سي# 12.0ديسمبر 2023دوت نت 8فيجوال ستوديو 2022

النحو

من جهة ثانية، تُسند المتغيرات باستخدام علامة التساوي = كما تُقارن باستخدام علامتي تساوي ==.

وفي السياق ذاته، تستعمل الأقواس المعقوفة [ ] مع المصفوفات لدى التصريح عن المصفوفة كذلك من أجل الولوج إلى عنصر ما عن طريق استخدام الدليل الموافق.

وفي هذا السياق، تستعمل الأقواس الحاصرة { } لتجميع عدة عبارات برمجية، غالباً ما تجمع العبارات البرمجية ضمن طرق (أو وظائف)، كما تجمع الوظائف ضمن صفوف، والصفوف ضمن فضاءات تسمية.

ومن جهة أخرى، تستعمل الفاصلة المنقوطة للدلالة على انتهاء العبارة البرمجية.

لدى لغة سي# النحو التالي:

أنماط القيمة

ومن جهة أخرى، كلا الفئتين قابلتان للتوسيع بأنماط جديدة معرّفة من قبل المستعمل.

من جانب آخر، تتصف الكائنات من نمط القيمة بأنها لا تملك محدداً مرجعياً ولا تمتلك خصائص المقارنة المرجعية - فمعاملات المساواة وانعدام المساواة بين أنماط القيمة تقوم بمقارنة القيمة الحقيقية للبيانات الموجودة ضمن الكائنات ما لم تكن معاملات المقارنة هذه محملةً بشكل زائد. تُشتق أنماط القيمة من النمط ولديها دائماً قيمة افتراضية كما يمكن إنشاؤها ونسخها في أي وقت. من أهم القيود المفروضة على أنماط القيمة هو عدم المقدرة على الاشتقاق من بعضها البعض (إلا أنها تستطيع تحقيق الواجهات) كما أنها لا يمكن أن تحوي بانياً افتراضياً (بدون بارامترات). إن الأنماط البسيطة مثل النمط (عدد صحيح ذو إشارة بطول 32 بتاً) والنمط (عدد فاصلة عائمة بطول 32 بت معرف من آي تربل إي) والنمط (وحدة كود من نظام يونيكود بطول 16 بت) والنمط (يعرف لحظة زمنية ما بدقة نانوثانية) هي أمثلة على أنماط القيمة. كذلك النمط (نمط تعدادي) والنمط (بنى معرفة من قبل المستعمل).

وفي هذا السياق، بمقابل ذلك تمتلك أنماط المرجع مفهوم المحدد المرجعي - أي أن كل كائن من النمط المرجعي يمتلك محدداً متميزاً عن محددات بقية الكائنات حتى وإن كان البيانات الموجودة ضمن كائنين هي ذاتها. ينعكس هذا المفهوم على عمليات مساواة أو عدم مساواة أنماط المرجع حيث تقوم باختبار المساواة المرجعية ولا تختبر مساواة القيم بينها إلا في حال تحميل المعاملات المقابلة بشكل زائد (كما هو الحال بالنسبة للنمط . بشكل عام لا يمكن إنشاء كائنات من النمط المرجعي ولا نسخ كائن موجود ولا إجراء مقارنات بين قيم كائنين مرجعيين، على الرغم من ذلك توفر بين أنماط المرجع خدمات كهذه عبر التصريح عن بانٍ عام أو عبر تحقيق الواجهة الموافقة (مثل و). بعض الأمثلة على أنماط المرجع النمط (الصف الأساسي الذي تشتق منه كافة الصفوف الأخرى) والنمط (سلسلة محرفية من النمط يونيكود) والنمط (الصف الأساسي الذي تشتق منه كافة المصفوفات).

الإصدارات

إطار عمل دوت نت 3.0 (بدون امتداد لينك)

من جهة ثانية، الإصدار سي إل آر توصيف اللغة التاريخأُطُر العمل فيجوال ستوديو ECMA ISO / IEC مايكروسوفت سي# 1.0 1.0يناير 2002ابريل 2003 يناير 2002 يناير 2002إطار عمل دوت نت 1.0فيجوال ستوديو.نت 2002 سي# 1.2 1.1 أكتوبر 2003 ابريل 2003إطار عمل دوت نت 1.1فيجوال ستوديو.نت 2003 سي# 2.0 2.0 يونيو 2006 سبتمبر 2006 سبتمبر 2005 نوفمبر 2005إطار عمل دوت نت 2.0فيجوال ستوديو 2005 سي# 3.0 2.02.0 SP1 colspan="2" rowspan="3" اغسطس 2007 نوفمبر 2007إطار عمل دوت نت 2.0 (بدون امتداد لينك)

كذلك، إطار عمل دوت نت 3.5فيجوال ستوديو 2008فيجوال ستوديو 2010 سي# 4.0 4.0 ابريل 2010 ابريل 2010إطار عمل دوت نت 4.0فيجوال ستوديو 2010 سي# 5.0 4.5 يونيو 2013 اغسطس 2012إطار عمل دوت نت 4.5فيجوال ستوديو 2012 سي# 6.0 لا يوجد يوليو 2015 يوليو 2015إطار عمل دوت نت 4.6

هذه قائمة بالإصدارات المختلفة للسي#:

GenericList list2 = new GenericList;

  • // ExampleClass تعريف قائمة من النمط المعرف من قبل المستعمل
  • GenericList list3 = new GenericList;
  • }

الأنماط القابلة للعدم

  • المسندات الخاصة (للصفات )
  • تحويل مجموعة الطرق
  • التباين والتباين المعاكس
  • الصفوف الاستاتيكية
  • المتحولات المحلية المنمطة ضمناً
  • مهيئات الكائنات والمجموعات
  • الصفات المحققة بشكل أوتوماتيكي
  • الأنماط غير المسماة
  • الطرق الملحقة
  • تعابير الاستعلام
  • تعابير لامبدا
  • أشجار التعابير
  • الطرق الجزئية
  • الربط الديناميكي
  • الوسطاء الاختيارية والمسماة
  • التباين والتباين العكسي للأنماط العامة
  • تضمين أنماط إنترأوب
  • الطرق اللامتزامنة

إطار عمل دوت نت كور 1.0

  • 15.0سي# 7.1أغسطس 2017إطار عمل دوت نت كور 2.0فيجوال ستوديو 2017
  • 15.3سي# 7.2نوفمبر 2017لا يوجد إطار عملفيجوال ستوديو 2017
  • 15.5سي# 7.3مايو 2018إطار عمل دوت نت 4.8

وفي السياق ذاته، إطار عمل دوت نت كور 1.1فيجوال ستوديو 2015سي# 7.0مارس 2017إطار عمل دوت نت 4.7فيجوال ستوديو 2017

استنباط نمط الباني

نحوٌ موجز للبواني الرئيسية

مرحلة تقييم المجتمع للتكنولوجيا (أيلول 2012)

مشروع مونو

من جهة ثانية، تحميل بيئة التطوير مونو ديفيلوب لتطوير تطبيقات سي شارب باستخدام مونو (مجاني)

}

  • مثال «أهلاً بالعالم»
  • فيما يلي برنامج بسيط بلغة سي#، وهو إصدار من برنامج أهلاً بالعالم التقليدي:
  • using System;
  • class Program
  • {
  • static void Main
  • {
  • Console.WriteLine("Hello world!");
  • }

في هذا الإطار، بالمقارنة مع قوالب سي++ يلاحظ أن أنماط سي# العمومية توفر أماناً أفضل إلا أنها في الوقت ذاته محدودة القدرة، فمثلًا ليس من الممكن استخدام الأنماط العمومية كحدود للمعاملات الحسابية.

صفات قابلة للقراءة فقط

بحاجة إلى تعديل

استخدام التعابير كصفات (صفات لامبدا)

التعليب وفك التعليب

كذلك، فك التعليب هو عملية تحويل قيمة كائن من نوع نمط مرجعي (معلّب مسبقاً) إلى القيمة الموافقة كنمط القيمة. يتطلب فك التعليب قسراً صريحاً للنمط. إذا كان الكائن المعلب من النمط يمكن عندها فك تعليب هذا الكائن فقط إلى النمط (أو إلى النمط ).

وفي هذا الصدد، التعليب هو عملية تحويل كائن من نوع نمط القيمة إلى القيمة الموافقة كنمط مرجعي وهو أحد العمليات الضمنية في لغة سي#.

17.4

من جانب آخر، يتضمن مستند توصيف C# 2.0 الخاص بمايكروسوفت مزايا الإصدار 2.0 الجديدة فقط. استعمل التوصيف 1.2 للاطلاع على المزايا القديمة. لا يوجد معيار Ecma ولا ISO/IEC للإصدارات #C التالية: 3.0 و 4.0 و 6.0 و 7.0 و 7.1 و 7.2 و 7.3 و 8.0 لا يوجد إصدار 3.0 من سي إل آر رقم الإصدار حسب توثيق سي إل آر هو 4.5 إلاأن قيمة الثابت Environment.Version هي 4.0

وفي هذا الصدد، + ملخص عن الإصدارات سي# 2.0 سي# 3.0 سي# 4.0 سي# 5.0 سي# 6.0 سي# 7.0سي# 8.0المزايا المضافة الأنماط العامة

  • الأنماط الجزئية
  • الطرق غير المسماة
  • المكرارات

سمات معلومة المستدعي

  • المصرف كخدمة (روسلين)
  • استيراد أعضاء النمط إلى فضاء التسمية
  • مرشحات استثنائية
  • تحقق من انعدام القيمة (null) بشكل موجز
  • إعادة أكثر من قيمة

أهداف التصميم

وفي السياق ذاته، يجب أن يتيح التصميم إمكانية استخدام اللغة لتطوير مكونات برمجية قابلة للاستخدام في البيئات الموزعة.

كذلك، على الرغم من أنه ينبغي على التطبيقات المكتوبة بلغة #C أن تقتصد في استخدام الذاكرة وقوة المعالجة إلا أن اللغة لا تهدف إلى منافسة مباشرة مع أداء وحجم التطبيقات المكتوبة بلغة C أو لغة التجميع.

يدرج المعيار ECMA الأهداف التصميمية التالية للغة #C:

كذلك، ينبغي أن توفر اللغة والتحقيق كذلك دعماً لمبادئ هندسة البرمجيات مثل التحقق القوي من الأنماط (أو التحقق الاستاتيكي) والتحقق من حدود المصفوفات واكتشاف محاولات استخدام المتحولات غير المهيئة وجمع القمامة الأوتوماتيكي. كذلك التأكيد على أهمية متانة وديمومة البرمجيات وإنتاجية المبرمج.

وفي هذا السياق، ينبغي أن تكون لغة #C بسيطة وحديثة وعامة الاستخدام وشيئية المنحى.

في هذا الإطار، إن محمولية الكود المصدري هدف ذو أهمية عالية، كذلك محمولية المبرمج، خاصة بالنسبة لؤلائك ذوي الخبرة بلغة سي++ ولغة C.

وعلى صعيد آخر، ينبغي أن تكون لغة #C ملائمة لبرمجة تطبيقات خاصة بالنظم المضمنة والأنظمة المضيفة سواءً أكانت تطبيقات ضخمة تستعمل أنظمة تشغيل معقدة أو تطبيقات بسيطة لديها وظيفية محددة.

إن دعم التوطين والعولمة هدف ذو أهمية عالية.

int foo = 42; // نمط القيمة

object bar = foo; // bar ضمن المتحول foo تعليب المتحول

int baz = (int)bar; // فك التعليب إلى نمط القيمة الأصلي

تاريخ اللغة

ومن جهة أخرى، إضافة إلى ذلك فقد أضيفت إلى سي# مجموعة من الميزات الهامة بهدف تمكين استخدام البرمجة الوظيفية فيها كُللت بإضافة لينك في الإصدار 3.0 والإطار البرمجي الداعم لتعابير لامبدا والطرق الملحقة والأنماط غير المسماة. تمكن هذه الميزات المطور من استخدام تقنيات البرمجة الوظيفية عندما يكون من المستحسن القيام بذلك. إن إضافات لينك وغيرها من الميزات الوظيفية تساعد المطور على كتابة أسطر أقل عند القيام بمهام روتينية كالاستعلام من قاعدة بيانات أو إعراب ملف إكس إم إل أو البحث ضمن بنية معطيات بما يمكن من التركيز على هدف البرنامج المنطقي وتحسين مقروئيته وصيانته.

وفي السياق ذاته، في تشرين الثاني 2005 أعلن عن الإصدار 2.0 من سي# ومن هنا بدأت سي# وجافا بالتطور في اتجاهات متزايدة الاختلاف. إن أول وأهم هذه الاختلافات كان في إضافة الأنماط العمومية إلى كلتا اللغتين حيث كان تحقيقهما لهذه الأنماط شديد الاختلاف حيث تقوم سي# بالتعامل مع الأنماط العمومية كصفوف حقيقية وتولد الكود الخاص بها وقت التنفيذ بينما تتعامل جافا مع هذه الأنماط كميزة مضافة إلى نحو اللغة تمكن المطور من كتابة كود عمومي كما تمكن المترجم من التأكد من صحة الأنماط فقط بينما لا تحول هذه الأنماط إلى أنماط حقيقية وقت التنفيذ ولا يتم توليد كود خاص بها على غرار سي#.

وفي السياق ذاته، اعتبر مصمم لغة جافا جيمس غوسلينغ وبيل جوي وهو أحد مؤسسي شركة صن مايكروسيستمز التي أتت بلغة جافا أن لغة سي# ليست سوى «تقليداً» للغة جافا؛ وقد قال غوسلينغ معقباً «إنها [المقصود سي#] كجافا نوعاً ما ولكن بعد التخلي عن الاعتمادية والإنتاجية والأمان». كتب كل من كلاوس كرفت وأنجلكا لانجر في مقال لهما في مدونة «إن جافا وسي# لغتا برمجة متطابقتان على وجه التقريب. وهذا تكرار مضجر يفتقر الإبداع»، «من الصعب جداً الادعاء أن جافا أو سي# لغة برمجة ثورية غيرت الأسلوب الذي نكتب فيه البرامج»، «لقد استعارت سي# الكثير من جافا -والعكس صحيح. حيث تدعم سي# ميزة التعليب وفك التعليب الآن وقريباً سوف نجد ميزةً شبيهة في جافا». قال أندرس هيلسبرغ في تموز عام 2000 أن سي# ليست «نسخة من جافا» بل أنها «أكثر قرباً إلى لغة سي++» من ناحية التصميم.

من جهة ثانية، بدأ تطوير منصة دوت نت بكتابة مجموعة من مكتبات الصفوف، وقد استعمل نظام تصريف مدار اسمه Simple Managed C أو اختصاراً SMC للقيام بذلك. لاحقاً وبالتحديد في كانون الثاني 1999 شكل أندرس هيلسبرغ فريقاً من المطورين بهدف بناء لغة جديدة اسمها كول ، يشكل الاسم اختصاراً لعبارة «لغة غرضية التوجه شبيهة بلغة C» . قررت مايكروسوفت الإبقاء على هذا الاسم إلا أنها تخلت عن ذلك لاحقاً لأسباب قانونية لها علاقة بحقوق العلامات المسجلة. على التوازي مع ذلك أُعلن مشروع دوت نت رسمياً في مؤتمر للمطورين المحترفين (PDC) في تموز عام 2000 وأعيد تسمية اللغة إلى سي# كما تم تصدير وقت التنفيذ الخاص بلغة إيه إس بي دوت نت إلى جانب مكتبات الصفوف إلى هذه اللغة.

وفي السياق ذاته، عُرضت سي# على لجنة آيزو الفرعية JTC 1/SC 22 للمراجعة والتعيير، كان اسم المعيار ISO/IEC 23270:2003 وهو ملغى اليوم. تمت الموافقة فيما بعد على تعيير سي# وفق المعيار ISO/IEC 23270:2006.

في هذا الإطار، كان لدى سي# جالب للحظ اسمه آندي (سمي باسم أندرس هيلسبرغ) وقد أحيل إلى التقاعد في 29 كانون الثاني عام 2004.

مايكروسوفت فيجوال ستوديو

  • مايكروسوفت فيجوال ستوديو إكسبرس (بيئة تطوير متكاملة مجانية)
  • مونو ديفيلوب (بيئة تطوير متكاملة مفتوحة المصدر)
  • شارب ديفيلوب (بيئة تطوير متكاملة مفتوحة المصدر)
  • C# topics
  • C# syntax
  • مكتبة الصفوف الأساسية
  • IDEs
  • مايكروسوفت فيجوال ستوديو
  • مايكرسوفت فيجوال ستوديو إكسبريس
  • فيجوال ستوديو كود
  • مونو ديفيلوب
  • Morfik
  • شارب ديفيلوب
  • جيت براينز
  • زامارين
  • LINQPad
  • المراجع

using System;

في هذا الإطار، يقوم السطر السابق بإخبار المصرف أن يستعمل System كبادئة مرشحة للاستخدام للأنماط المستعملة في الكود المصدري. في هذه الحالة عندما يصادف المصرف الكلمة Console في الأسطر اللاحقة سوف يبحث عن نمط اسمه Console مبتدئاً عملية البحث في التجميعة الحالية ومن ثم كافة التجميعات الأخرى المشار إليها في البرنامج. سوف يفشل المصرف في هذه الحالة في إيجاد النمط Console وعندها سيحاول البحث عن نمط اسمه System.Console مستعملاً System كبادئة لاسم النمط، وسينجح في إيجاده لأن اسم النمط الكامل هو بالفعل System.Console. إن الكلمة المفتاحية using تتيح للمبرمج أن يسرد كافة البوادئ المرشحة للاستخدام أثناء التصريف كبديل عن استخدام الاسم الكامل للنمط.

استخدام التعابير كطرق

من جانب آخر، تمرير المصفوفات كوسطاء لواجهات IEnumerable• متغيرات للقراءة فقط

المزايا الفارقة

ومن ناحية أخرى، لا تسمح لغة سي# باستخدام المتحولات العامة ولا التوابع الشاملة إذ يجب التصريح عن كافة الطرق والأعضاء ضمن الصفوف. تعد الطرق الاستاتيكية الخاصة بالصفوف العامة بديلاً للتوابع والمتحولات الشاملة.

كذلك، تتمتع سي# بكونها ذات تنميط أكثر أمناً من لغة سي++. إن التحويلات الضمنية المتاحة بشكل افتراضي في اللغة هي تلك المعدة الآمنة بشكل حصري. مثل توسيع الأعداد الصحيحة (من إلى مثلاً). يتم تطبيق هذه السياسة أثناء التصريف وخلال الترجمة في الوقت المناسب (JIT) وفي بعض الأحيان أثناء التنفيذ. لا يوجد تحويل ضمني بين النمط البولياني والنمط الصحيح ولا بين أعضاء الأنماط التعدادية والنمط الصحيح (باستثناء المحرف 0 والذي يمكن تحويله ضمنياً إلى أي نمط تعدادي). يجب الإشارة إلى أي تحويل معرف من قبل المستعمل بشكل صريح أو ضمني بشكل يخالف البواني الناسخة ومعاملات التحويل في لغة سي++ التي تعمل بشكل ضمني افتراضياً.

إضافةً إلى ذلك، يجب على مبرمجي سي# استخدام الكلمة المفتاحية من أجل إتاحة تجاوز الطرق في الصفوف المشتقة على غرار لغة سي++ (وخلافاً للغة جافا).

وعلى صعيد آخر، تتفرد لغة سي# عن غيرها من لغات برمجة إطار عمل دوت نت في كونها مرتبطة بشكل وثيق بمزايا البنية التحتية المشتركة للغات البرمجة (CLI)، فمثلًا تنسب أغلب الأنماط الحقيقية إلى قرائنها من أنماط القيمة الموجودة في CLI. على الرغم من ذلك فإن توصيف اللغة لا يتطرق إلى متطلبات توليد الكود الخاصة بالمصرّف، بمعنى أن التوصيف لا يرغم مصرف سي# على توليد كود متوافق مع وقت التنفيذ المشترك للغات (CLR) أو توليد تعليمات متوافقة مع اللغة المشتركة الوسيطة أو أي تنسيق آخر. وهكذا يمكّن (نظرياً على الأقل) مصرّف سي# من توليد كود لغة الآلة مباشرة على غرار باقي المصرفات كمصرّف سي++ ومصرّف فورتران. فيما يلي بعض من المزايا الجديرة بالاهتمام كونها تميز لغة سي# عن لغتي سي وسي++ (إلى جانب جافا لدى ذكر ذلك صراحة):

في هذا الإطار، إن إمكانية الميتا-برمجة من خلال استخدام السمات هي جزءً من توصيف اللغة. توفر الكثير من هذه السمات وظيفية مطابقة لتلك التي توفرها موجهات قبل التصريف المعتمدة على المنصة المدعومة من قبل جي.سي.سي وفيجوال سي++.

وفي السياق ذاته، تدعم سي# نمط المعطيات البولياني بشكل صارم. إذ تتطلب كافة العبارات البرمجية التي تتضمن شروطاً (مثل عبارة وعبارة ) تعابيراً من نمط يحقق المعامل كالنمط البولياني مثلاً. بالمقارنة مع لغة سي++ التي تحوي كذلك النمط البولياني نجد أن سي++ تتيح تحويل هذا النمط من وإلى أرقام صحيحة، نتيجةً لذلك يمكن تتطلب بعض التعابير مثل فقط أن يكون قابل للتحويل إلى مفسحة المجال بذلك لأن يكون من النمط أو حتى أو يكون مؤشراً. لا تتيح سي# مقاربة «الأعداد الصحيحة تعني صحيح أو خطأ» على اعتبار أن إجبار المبرمج على استخدام تعابير تعيد النمط تماماً قد يمنع حدوث عددٍ من الأخطاء البرمجية الشائعة في لغتي سي وسي++ (مثل العبارة حيث استًبدل معامل المقارنة بمعامل الإسناد ).

وفي هذا السياق، خلافاً للغة جافا لا تدعم لغة سي# الاستثناءات المفحوصة (الاستثناءات التي يمكن أن تحصل ضمن طريقة ما، يمكن للطريقة أن تصرح عن هذه الاستثناءات كجزء من توقيعها). وقد اتخذ قرار بالإحجام عن هذه الميزة نظراً لأنها قد تسبب معضلات فيما يتعلق بقابلية التوسع والتعامل مع الإصدارات المختلفة.

وفي هذا السياق، لدى سي# الكلمة المفتاحية التي تتيح تعريف مؤشرات قوية التنميط إلى توابع.

علاوةً على ذلك، خلافاً للغتي سي وسي++ لا تستطيع المتحولات المحلية إخفاء المتحولات الموجودة في الكتلة البرمجية المحيطة.

ومن ناحية أخرى، يتيح النمط إمكانية الربط مع الطرق أثناء التنفيذ بما يمكن من استدعاء الطرق وتركيب الكائنات وقت التنفيذ مثلما تفعل لغة جافا سكربت.

لأعضاء التعدادات ضمن مجال الرؤية الخاص بها.

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

وفي هذا الصدد، توفر لغة سي# الخصائص كتجميل لغوي لنمط برمجي شائع يتم فيه تعريف زوج من الطرق: طريقة للحصول على القيمة وأخرى لتعديل القيمة بهدف تغليف عمليات الوصول إلى عضو من أعضاء الصف. نتيجة لذلك لم تعد هنالك حاجة لكتابة الكثير من هذه الطرق بشكل تكراري، فضلًا عن ذلك يمكن الولوج إلى الخصائص بشكل موجز بنفس طريقة الولوج إلى الأعضاء ولا حاجة لاستخدام استدعاء الطريقة المعتاد للقيام بذلك.

من جانب آخر، ابتداءً من الإصدار 3.0 تدعم لغة سي# تقنيات البرمجة الوظيفية من خلال الصفوف التابعية وتعابير لامبدا على الرغم من كونها لغة أمرية أصلاً.

من جهة ثانية، خلافاً للغة جافا تدعم لغة سي# التحميل الزائد للمعاملات، إلا أنها تدعم تحميل المعاملات الأكثر شيوعاً فقط بالمقارنة مع لغة سي++.

علاوةً على ذلك، تدعم سي# بشكل كامل التباين والتباين المعاكس للأنماط العامة على خلاف لغة سي++ التي توفر دعماً محدوداً للتباين المعاكس من خلال التحكم بمعاني الأنماط المعادة في الطرق الافتراضية.

وفي هذا الصدد، تدعم سي# التصريح الضمني عن المتحولات قوية التنميط عن طريق الكلمة المفتاحية فضلًا عن التصريح الضمني عن المصفوفات المنمطة عن طريق الكلمة المفتاحية متبوعة بمهيئ المجموعة.

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

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

إضافةً إلى ذلك، توفر لغة سي# فضلًا عن بنية الخاصة بمعالجة الاستثناءات البنية التي تضمن تنفيذ الكود الموجود في كتلة سواءً حصل استثناء أم لم يحصل.

وفي هذا السياق، توفر سي# استدعاءات الطرق المتزامنة بما يشابه لغة جافا عن طريق استخدام السمة ، كما أنها تدعم أقفال استبعاد التشارك عبر الكلمة المفتاحية .

إضافةً إلى ذلك، تتيح سي# إمكانية استخدام المؤشرات إلى عناوين الذاكرة فقط ضمن كتل مشار إليها بالكلمة المفتاحية (غير آمن)، وتتطلب البرامج التي تحتوي كوداً غير آمنٍ سماحيات ملائمة كي تعمل. غالباً ما تستعمل الدلائل الآمنة من أجل الولوج إلى الكائنات، حيث تشير هذه الدلائل دائماً لى كائنات فعالة في الذاكرة كما أن لديها قيمة فارغة معرفة بشكل ملائم؛ من المستحيل الحصول على دليل إن كائن تم تدميره (من خلال جامع القمامة) أو الولوج إلى كتلة عشوائية في الذاكرة. يمكن للمؤشر غير الآمن الإشارة إلى متحول من نمط-قيمة أو مصفوفة أو سلسلة محرفية أو كتلة من الذاكرة محجوزة على المكدس. يمكن للكود غير الآمن أن يخزن ويتلاعب بالمؤشرات من خلال النمط ولكن لا يمكنه الاطلاع على محتوياتها.

وعلى صعيد آخر، لا يمكن تحرير الذاكرة المُدارة بشكل مباشر إذ يتم تحريرها بشكل أوتوماتيكي من قبل جامع القمامة. إن جمع القمامة يعالج معضلة تسرب الذاكرة من خلال إعفاء المبرمج من مسؤولية تحرير الذاكرة.

من جانب آخر، لا تدعم سي# الوراثة المتعددة على الرغم من أنه من الممكن لصف أن يحقق عدداً من الواجهات. يعود السبب في ذلك إلى قرار اتخذه المعماري الرائد في تصميم اللغة بهدف الابتعاد عن التعقيد وتبسيط المتطلبات المعمارية الخاصة بالبنية التحتية المشتركة للغات البرمجة (CLI). في حال تحقيق عدة واجهات تحتوي الطريقة ذاتها تتيح سي# للمبرمج إمكانية تحقيق الطريقة عدة مرات بشكل يتناسب مع الواجهة التي سيتم استدعاؤها من خلالها، أو (كما في لغة جافا) يمكن للمبرمج أن يحقق الطريقة مرة واحدة فقط بحيث يتم استدعاء هذا التحقيق من قبل كافة الواجهات التي تحتوي تلك الطريقة.

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.