أعتقد أن أغلبنا قد استخدم C# 2.0 بطريقة أو بأخرى و بالتأكيد أن أغلبنا لم يتطرق الى كل ماهو جديد في C# 2.0 و مع هذا فان Microsoft بدأت تُعلن عن C# 3.0 و قد صدرت بالفعل ال Language Specifications على موقع المستقبل الخاص بالMSDN
http://www.msdn.microsoft.com/netframework/future
و هذا يدل أن قطار الDotNet يكاد يسير بسرعة الضوء و علينا اللحاق به...
للاجابة على هذه السؤال سنتطرق أولاً للمشاكل الموجودة في ال#C حتى نستطيع استيعاب الحل...
1- الDatabase و الGeneral Purpose Languages ظلا دائماً عالمين منفصلين و لكلٍ منهم خصائصه و مميازته و عيوبه فمثلاً البرمجة في الDatabase هي Declarative Programming أي أنك تشرح ماذا تريد أن تفعل باستخدام الSQL ثم تترك للDBMS الحرية في التصرف في أفضل طريقة لعمل هذا
مثال عندما نكتب Select * From Customers فاننا نقول للنظام أردي بيانات العملاء و لكن لم أقل له اذهب و افتح الملف على HDD ثم قم بعمل loop على العملاء و ضعهم في array ....الخ و لكن النظام هو من قال بعمل الQuery Map و الExecution لهذا السؤال
أما في الGeneral Purpose Programming Languages مثل ال#C و ال++C/C و غيرها فهي Imperative Programming أي أنك تحدد كيف تقوم بحل المشكلة بالتفصيل الممل...
أيضاً هناك فروق اخرى تم حلها في C# 2.0 مثل أن الDatabase تقبل متغيرات ذات قيمة NULL أما ال#C فلا تقبل و كان حلها هو ابتكار الNullable Types الرائعة
2- طبيعة المشكلة السابقة جعلت التعامل بين العالمين المختلفين يتم عن طريق وسيط مثل الADO/ ADO.net و يتم اعطاء الQueries للADO على شكل Strings و هذا جعل نوع اخر من المشاكل تظهر و هو أن الCompiler الخاص بال #C لا يقوم بالتأكد من صحة الQueries و بالتالي لا يستطيع أن يحسنها فمثلاً لو قمت بكتابة
Selet * From Customers فلن يعترض الCompiler على كلمة Selet أنها مكتوبة خطأ و سيقوم بعمل Build و تظهر هذه المشكلة كRun Time Error و هذا أسوأ ما في المشكلة ....
3- مشكلة أخرى و هي تميز بعض اللغات مثل الPython و التي تتبع الDynamic Languages بأنه يمكنك تعريف متغيرات دون ذكر نوعها و يتم التعرف على نوعها من السياق
فمثلاً var x = 10 هكذا أصبح x من نوع integer دون أن أذكرها و أيضا
var y = new File و هنا أصبح الy عبارة عن object من نوع File دون أن اضطر لذكر كلمة File مرتين قبل المتغير و بعده و هي تصبح مملة أحياناً عندما يكون اسم الClass كبير
أيضأً في الDynamic Languages يمكنك أن تقوم بعمل Initialization للمتغيرات في الConstructor دون أن تقوم بعمل الكثير من الConstructors المختلفة فبفرض أن الClass Customer لها الخصائص Name, Company, Address ففي #C يجب عليك أن تقوم بانشاء Constructor يأخذ 3 Parameters حتى يمكنك عمل Initialization كامل في الConstructor و لكن في الDynamic Language يمكنك عمل هذا ببساطة هكذا
CODE
var c = new Customer(Name= "bashmohandes", Address= "
و هذا يقلل سطور الكود الخاصة بالInitialization و أيضاً الخاصة بكتابة الconstructors ...
ما سبق هو بعض المشاكل التي كانت تواجه المبرمجين و التي سيتم حلها في الC# 3.0 و سنعرض حل هذه المشاكل الموجود في C# 3.0 الان
1- تم حل هذه المشكلة الى حد كبير في مشروع LINQ و الذي يقدم طريقة لكتابة الQueries داخل ال#C
مثال
CODE
public void Linq2() {
List products = GetProductList();
var soldOutProducts =
from p in products
where p.UnitsInStock == 0
select p;
Console.WriteLine("Sold out products:");
foreach (var product in soldOutProducts) {
Console.WriteLine("{0} is sold out!", product.ProductName);
}
}
و هنا نلاحظ استحداث Code Block جديدة و هو From .... In .... Where ..... Select كما أنه يمكنك استخدام بعض العمليات الأعقد مثل الorder by, group by و غيرها من عمليات الDatabase المختلفة
أيضاً ستلاحظ أن From جاءت في أول الQuery بينما جاءت الSelect في النهاية و هذه الطريقة تعتبر أوضح قليلاً و ان كانت غريبة بعض الشئ...
و الأجمل أن هذه الطريقة غير مقصورة على الDatabase Results و لكن يمكن أن تستخدم في أي شئ يمكنك مثلاً أن تقوم باستخدامها مع الFile System للبحث عن ملفات أو مع الReflection للبحث عن عمليات في Dll معينة و أيضأً مع الXML و أيضاً مع الArrays العادية
مثال اخر
CODE
public void Linq1() {
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from n in numbers
where n <>
و هنا استخدم الLINQ في تحديد الأرقام الأقل من 5 مجموعة الأعداد..
2- في المشكلة الثانية الناجمة عن طبيعة المشكلة الأولى فقد أصبح الCompiler مسؤولاً عن تصحيح الاخطاء البرمجية في الQueries و أيضاً عمل الOptimizations اللازمة
3- تم اضافة الكثير من مميزات الDynamic Languages في C# 3.0 فمثلاً يمكن الان الاستفادة من خصائص الDynamic Langauges مع الاستفادة من قوة الStrongly Typed Languages فمثلاً
CODE
var x = 1;
x = "mohammed"; //Error x is Integer
يمكنك الان للCompiler أن يتعرف على نوع المتغير عن طريق نوع القيمة التي توضع فيه و أيضاً اذا تم تغيير نوع هذه القيمة فيما بعد فان الCompiler يعترض لأن هذا يُعتبر تجاوز لقوانين الStrongly Typed Languages
و أيضاً الان يمكنك استعمال الطريقة الجديدة في استخدام الConstructors و التي تشبه تماماً الConstructors في الDynamic Languages
هكذا
CODE
var c = new Customer(Name= "bashmohandes", Address= "
كما أن ال#C كما دعمت الAnonymous Methods في C# 2.0 فأيضاً الان تدعم الAnonymous Classes
و أيضاً توجد بعض الخصائص الجديدة مثل الSequence و غيرها
و يمكنك تحميل الC# 3.0 من نفس الموقع الذي ذكرته في أو المشاركة و هو يعمل مع أي نسخة من نسخ VS 2005 مثل الProfessional أو الExpress و يأتي معه الكثير من الأمثلة...
أرجو أن تكونوا قد استفدتم من الموضوع
شكراً
2 comments:
أحسن شي سويته إنك كتبت المقال بالعربي
من ضمن العقبات اللي تصعب على المبرمج العربي تعلم مفاهيم جديدة عليه هي اللغة
مشكوور مقال رائع ومهم وما قريت زيه لا بالعربي ولا بالإنجليزي
بارجع أقراه مرة ثانية
مقال مفيد شكراً لك
جزاك الله الف خير
Post a Comment