الناشر
08-28-2008, 02:08 PM
بعض ميزات Framework 3.5:إذا*كنت من محبي التعرف على الجديد في عالم الدوت نيت فإن هذه المقالة*تشكل مفتاح البداية للتعرف على بعض الجديد في هذه البيئة القوية*لقد جاء Framework 3.5 حاملا بين طياته العديد من الميزات التي التي تزيد العمل في بيئة الدوت نيت سهولة أكبر، التي تدفع مبرمج الدوت نيت للتوجه إلى تعلم المزيد والمزيد فالبرمجة يمكن تشبيهها بالبحر الذي يمكن أن نقول عنه أنه له بداية وليس له نهاية، دعنا من خلال هذه المقالة نستعرض بعض الميزات الجديدة التي جائت بها بيئة .NET*دعنا مباشرة نبدأ الحديث عن بعض هذه التقنيات بدون أية مقدمات
1)Automatic Properities:
نعلم انه إذا أردنا إنشاء صف Point يحتوي على خاصيتين هما X و Y فإننا سوف نكتب الكود التالي:
public class Point
{
*** private int _x;
*** private int _y;
*
*** public int X
*** {
******* get { return _x; }
* ******set { _x = value; }
*** }
*
*** public int Y
*** {
****** * get { return _y; }
****** * set { _y = value; }
*** }
*}
إذا فقد احتجنا لإنشاء هاتين الخاصيتن انشاء متحولات لهما من اجل تخزين القيم (خمن مالذي حدث!!!؟)، أصبح الآن بمقدورك كتابة الشيفرة السابقة بالشكل التالي:
public class Point
{
*** public int X{ get; set; }
*** public int Y { get; set; }
}
(أهاكذا يكفي؟ نعم) هو سيتول عنك إنشاء متحولات لهذه الخصائص، للنتقل الآن إلى الميزة التالية.
*2) Local Variable Type Inference (استنباط أنوع المتحولات المحلية):
ماذا يعني استنباط أنواع المتحولات المحلية، دعني أوضح لك ذلك من خلال المثال التالي، إذا أردت إنشاء متحول من نوع عدد صحيح، وآخر من أجل عدد حقيقي وآخر من أجل تخزين سلسلة نصية ماذا تكتب؟ “طلب سخيف!!!
int n = 0;
float f = 10.1F;
string s = “Visual Studio Orcas 2008″;
اما الان فقد اصبح لديك إمكانية كتابة مايلي لتحقيق نفس الشيفرة السابقة كما يلي:*
var n = 0;
var f = 10.1F;
var s = “Visual Studio Orcas 2008″;
يمن اعتباره تصريح عن متحولات بشكل ديناميكي، أي أن المترجم هو الذي سيتولى تحديد أنواع هذه المتحولات وذلك من خلال القيم المسندة إلى هذه الى المتحولات، ربما يقول قائل أن المترجم قد اعتبر هذه المتحولات من نوع object لأنه يمكنك عندها استناد أي شيء، هذا الكلم غير صحيح على الاطلاق فالمترجم هنا في الشيفرة السابقة سوف يعرف المحتول n على* أنه من نوع int، والمتحول f من نوع float، والكائن s من نوع string، (ربما يقول أحدنا أثبت ما تقول) يمكن أن تثبت صحة الكلام السابق بكتابة الشيفرة التالية:
Console.WriteLine(“n is: {0}”, num.GetType());
Console.WriteLine(“f is: {0}”, f.GetType());
Console.WriteLine(“s is: {0}”, s.GetType());
سوف ينتج لديكهل اقنعنا الان؟(”طيب شو هالميزة يلي ما لا طعمة كان بإمكاني أن أصرح عن هذه المتحولات بشكل الاعتيادي ويكفي”) سوف تكتشف فائدة الميزة هذه في الفقرات التالية.
3)التصريح عن الكائنات والمجموعات Object Initializers & Collection Initializers:
إذا أخبرتك يا عزيزي المبرمج أتذكر الصف Point السابق؟ أريد منك أن تنشئ كائنا منه وتضبط قيم خصائصة بقيمة الصفر. -شو هاشغلة ميت طلب مثل هالطلب- فستكتب الشكل التالي إلا إذا كنت قد سبقتني إلى التعرف ما سوف أخبرك عنه.
Point p = new Point();// var p = new Point();
p.X = 0;
p.Y = 0;
ولكن لو أخبرتك أنه هل هناك طريقة تبسط علي إعطاء القيم الابتدائية اهذه الخصائص؟ فسيكون جوابك: بكل تأكيد كل ما عليك هو إنشاء باني لهذا الصف وتمرر من خلاله قيم الخصائص. كلامك سليم ولكن دعني الان أؤريك ماذا يمكن عمله الان بدون بناء هذا الباني، كلما عليك هو تعديل شيفرة التصريح عن هذا الكائن ليصبح بالشكل التالي:
*Point p = new Point() { X = 0, Y = 0 };
ما رايك؟؟ ولا ننسى القول أن هذه الميزة يمكن تطبيقها على المجمعات، على الشكل التالي:
*List<span style="font-size:10pt;font-family:'Courier New';"><span style="color:#2b91af;"Point/span> points = new List() {
*** new Point() { X = 1, Y = 1 },
*** new Point() { X = 2, Y = 3 }
};
4)الأنواع المجهولة Anonymous Types: (هل بقي أكثر من هذا جهل)
تمكنك اللغة الآن من التصريح عن أنواع جديدة -ليكون تمزح- بدون أن تقوم بإنشاء صف جديد -يعني كيف- لو أردنا إنشاء كائن يمثل نقطة بدون أن تقوم بإنشاء الصف السابق Point فستقول لي مستحيل، ولكنني سأقول لك لا شيء مستحيل أبدا، لاحظ الشيفرة التالية التي ستقوم بتأدية نفس الغرض:
*var p = new { X = 1, Y = 2 };
*
Console.WriteLine(“p.X = {0}”, p.X);
Console.WriteLine(“p.Y = {0}”, p.Y);
أنوه مرة أخرى بدون كتابة الشيفرة السابقة للصف Point.*
1)Automatic Properities:
نعلم انه إذا أردنا إنشاء صف Point يحتوي على خاصيتين هما X و Y فإننا سوف نكتب الكود التالي:
public class Point
{
*** private int _x;
*** private int _y;
*
*** public int X
*** {
******* get { return _x; }
* ******set { _x = value; }
*** }
*
*** public int Y
*** {
****** * get { return _y; }
****** * set { _y = value; }
*** }
*}
إذا فقد احتجنا لإنشاء هاتين الخاصيتن انشاء متحولات لهما من اجل تخزين القيم (خمن مالذي حدث!!!؟)، أصبح الآن بمقدورك كتابة الشيفرة السابقة بالشكل التالي:
public class Point
{
*** public int X{ get; set; }
*** public int Y { get; set; }
}
(أهاكذا يكفي؟ نعم) هو سيتول عنك إنشاء متحولات لهذه الخصائص، للنتقل الآن إلى الميزة التالية.
*2) Local Variable Type Inference (استنباط أنوع المتحولات المحلية):
ماذا يعني استنباط أنواع المتحولات المحلية، دعني أوضح لك ذلك من خلال المثال التالي، إذا أردت إنشاء متحول من نوع عدد صحيح، وآخر من أجل عدد حقيقي وآخر من أجل تخزين سلسلة نصية ماذا تكتب؟ “طلب سخيف!!!
int n = 0;
float f = 10.1F;
string s = “Visual Studio Orcas 2008″;
اما الان فقد اصبح لديك إمكانية كتابة مايلي لتحقيق نفس الشيفرة السابقة كما يلي:*
var n = 0;
var f = 10.1F;
var s = “Visual Studio Orcas 2008″;
يمن اعتباره تصريح عن متحولات بشكل ديناميكي، أي أن المترجم هو الذي سيتولى تحديد أنواع هذه المتحولات وذلك من خلال القيم المسندة إلى هذه الى المتحولات، ربما يقول قائل أن المترجم قد اعتبر هذه المتحولات من نوع object لأنه يمكنك عندها استناد أي شيء، هذا الكلم غير صحيح على الاطلاق فالمترجم هنا في الشيفرة السابقة سوف يعرف المحتول n على* أنه من نوع int، والمتحول f من نوع float، والكائن s من نوع string، (ربما يقول أحدنا أثبت ما تقول) يمكن أن تثبت صحة الكلام السابق بكتابة الشيفرة التالية:
Console.WriteLine(“n is: {0}”, num.GetType());
Console.WriteLine(“f is: {0}”, f.GetType());
Console.WriteLine(“s is: {0}”, s.GetType());
سوف ينتج لديكهل اقنعنا الان؟(”طيب شو هالميزة يلي ما لا طعمة كان بإمكاني أن أصرح عن هذه المتحولات بشكل الاعتيادي ويكفي”) سوف تكتشف فائدة الميزة هذه في الفقرات التالية.
3)التصريح عن الكائنات والمجموعات Object Initializers & Collection Initializers:
إذا أخبرتك يا عزيزي المبرمج أتذكر الصف Point السابق؟ أريد منك أن تنشئ كائنا منه وتضبط قيم خصائصة بقيمة الصفر. -شو هاشغلة ميت طلب مثل هالطلب- فستكتب الشكل التالي إلا إذا كنت قد سبقتني إلى التعرف ما سوف أخبرك عنه.
Point p = new Point();// var p = new Point();
p.X = 0;
p.Y = 0;
ولكن لو أخبرتك أنه هل هناك طريقة تبسط علي إعطاء القيم الابتدائية اهذه الخصائص؟ فسيكون جوابك: بكل تأكيد كل ما عليك هو إنشاء باني لهذا الصف وتمرر من خلاله قيم الخصائص. كلامك سليم ولكن دعني الان أؤريك ماذا يمكن عمله الان بدون بناء هذا الباني، كلما عليك هو تعديل شيفرة التصريح عن هذا الكائن ليصبح بالشكل التالي:
*Point p = new Point() { X = 0, Y = 0 };
ما رايك؟؟ ولا ننسى القول أن هذه الميزة يمكن تطبيقها على المجمعات، على الشكل التالي:
*List<span style="font-size:10pt;font-family:'Courier New';"><span style="color:#2b91af;"Point/span> points = new List() {
*** new Point() { X = 1, Y = 1 },
*** new Point() { X = 2, Y = 3 }
};
4)الأنواع المجهولة Anonymous Types: (هل بقي أكثر من هذا جهل)
تمكنك اللغة الآن من التصريح عن أنواع جديدة -ليكون تمزح- بدون أن تقوم بإنشاء صف جديد -يعني كيف- لو أردنا إنشاء كائن يمثل نقطة بدون أن تقوم بإنشاء الصف السابق Point فستقول لي مستحيل، ولكنني سأقول لك لا شيء مستحيل أبدا، لاحظ الشيفرة التالية التي ستقوم بتأدية نفس الغرض:
*var p = new { X = 1, Y = 2 };
*
Console.WriteLine(“p.X = {0}”, p.X);
Console.WriteLine(“p.Y = {0}”, p.Y);
أنوه مرة أخرى بدون كتابة الشيفرة السابقة للصف Point.*