Friday, March 03, 2006

ما الجديد في C# 3.0

بسم الله الرحمن الرحيم

أعتقد أن أغلبنا قد استخدم C# 2.0 بطريقة أو بأخرى و بالتأكيد أن أغلبنا لم يتطرق الى كل ماهو جديد في C# 2.0 و مع هذا فان Microsoft بدأت تُعلن عن C# 3.0 و قد صدرت بالفعل ال Language Specifications على موقع المستقبل الخاص بالMSDN
http://www.msdn.microsoft.com/netframework/future
و هذا يدل أن قطار ال
DotNet يكاد يسير بسرعة الضوء و علينا اللحاق به...

الأن ماهو الجديد في الC# 3.0

للاجابة على هذه السؤال سنتطرق أولاً للمشاكل الموجودة في ال#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= "Egypt", Company = "Whatever");


و هذا يقلل سطور الكود الخاصة بال
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= "Egypt", Company = "Whatever");



كما أن ال#
C كما دعمت الAnonymous Methods في C# 2.0 فأيضاً الان تدعم الAnonymous Classes
و أيضاً توجد بعض الخصائص الجديدة مثل ال
Sequence و غيرها
و يمكنك تحميل ال
C# 3.0 من نفس الموقع الذي ذكرته في أو المشاركة و هو يعمل مع أي نسخة من نسخ VS 2005 مثل الProfessional أو الExpress و يأتي معه الكثير من الأمثلة...

أرجو أن تكونوا قد استفدتم من الموضوع
شكراً

2 comments:

Anonymous said...

أحسن شي سويته إنك كتبت المقال بالعربي

من ضمن العقبات اللي تصعب على المبرمج العربي تعلم مفاهيم جديدة عليه هي اللغة


مشكوور مقال رائع ومهم وما قريت زيه لا بالعربي ولا بالإنجليزي


بارجع أقراه مرة ثانية

مقال مفيد شكراً لك

Anonymous said...

جزاك الله الف خير