۱۳۸۸ جمعه ۲۱ اسفند Skip Navigation Links
صفحه اصلی
مقالاتExpand مقالات
تازه هاExpand تازه ها
کتاب ها
فروشگاه
اعضا (۱ نفر online)
فروم (سؤال و جواب)
PD on Facebook
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 
 
 C# 4.0، نگاهي به آينده - قسمت اول
.NET C#
تاریخ ثبت:  ۸۷/۹/۲۳
تعداد نمایش:  ۲۰۶۰
  نویسنده: ابوالفضل حسن الدينف
 
   ۱۹  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

حدود يك سال است كه از ارائه شدن نهايي سي شارپ نسخه 3.0 – در قالب ويژوال استوديو 2008 – مي گذرد. زباني كه با نام كد (COOL (C Style Object Oriented Language وارد جهان برنامه نويسي شد با پشت سر گذاشتن سه نسخه و هشت سال از عمر خود، اينك به سمت نسخه اي ديگر گام برداشته است. پس از كنفرانس PDC 2008 كه 30-27 اكتبر سال جاري در لس آنجلس برگزار شد، سخنراني آندرس هلسبرگ معمار و سرپرست اصلي تيم طراح سي شارپ، پرده از ويژگي هاي جديد اين زبان كه تحت عنوان C# 4.0 ارائه خواهد شد، برداشت. در سري مقالات C# 4.0، نگاهي به آينده  سعي بر آن خواهيم داشت تا اين ويژگي ها را معرفي كنيم.

چهارچوب كلي C# 4.0

نسخه جديد كه هنوز تاريخ قطعي انتشار آن مشخص نيست، سال 2010 به همراه ويژوال استوديو 2010 و دات نت فريم ورك 4.0 ارائه خواهد شد. پس از كنفرانس PDC 2008 نخستين (CTP (Community Technology Preview محصول Visual Studio 2010 به عنوان Virtual Image در اختيار عموم قرار گرفت. (لينك دانلود) اگر به مستند منتشر شده New features in CSharp 4.0 مراجعه كنيد، چهارچوب كلي ويژگي هاي جديد به شرح زير معرفي شده اند:

  • Dynamic
  • Named and Optional Arguments
  • Features for COM interop
  • Variance

مهم ترين نوع آوري در سي شارپ 4.0 نوع دايناميك آن خواهد بود. اين ويژگي را در مقاله سوم مورد بحث و بررسي قرار خواهيم داد. اشاره اي داشته باشيم كه هر آنچه كه بيان آن توسط انواع موجود در زبان سي شارپ و نيز نوع static ممكن نباشد، از نوع dynamic است. دايناميك يك نوع مستقل بوده كه در هيچ سلسله اي از اشياء طبقه بندي نمي شود! يعني از هيچ شي ءي ارث بري نمي كند و شي ءي قادر به ارث بري از آن نيست. اين نوع امكان اجراي اسكريپت زبان هايي چون Python و Ruby را به راحتي هر چه تمام تر در بستر سي شارپ و در كل در بستر دات نت فراهم خواهد كرد.

ويژگي COM interop برقراري ارتباط راحت تر و بدون درگيري جانبي با اشياء COM را فراهم خواهد كرد. اگر تاكنون برنامه نويسي COM را تجربه كرده باشيد، حتما با پيچيدگي و درگيري هاي زيادي كه در اين پلتفرم وجود دارد، آشنا هستيد.

بحث Variance را كه تحت عناوين co and contravariance مطرح مي باشد در مقاله بعدي معرفي خواهيم كرد. تنها به يك مثال ساده در اين خصوص اكتفا مي كنيم. سناريويي مانند مثال زير در سي شارپ 4.0 قابل اجرا خواهد بود (حالت covariance) :

IList<string> strings = new List<string>();


IList<object> objects = strings;

 

توجه داشته باشيد كه تمام تكنولوژي فعلي در حال توسعه و تكامل مي باشد و يكي از دلايلي كه مايكروسافت CTP آن را در اختيار عموم قرار داده است، دريافت نظرات و فيدبك هاي بيشتر به منظور ارائه جامع محصول نهايي مي باشد. آنچه كه در سري مقالات C# 4.0، نگاهي به آينده ارائه خواهد شد، بر پايه نسخه اوليه بوده و نام برگزيده شده براي اين سري گوياي اين امر است.

در اين مقاله ويژگي Named Arguments -  Optional Argumentsرا مورد بررسي قرار مي دهيم.

آرگومان هاي اختياري (Optional Arguments) – آرگومان هاي نامي (Named Arguments)

اين مفاهيم ويژگي هاي جديدي در دنياي برنامه نويسي به شمار نمي روند. بسياري از زبان ها از آن ها پشتيباني مي كنند. به عنوان مثال مي توان به Office automation API اشاره كرد كه توابع اين حوزه با در نظر گرفتن آرگومان هاي اختياري و نامي نوشته شده اند. به دليل دشوار بودن فراخواني توابعي از اين نوع در زبان سي شارپ، ويژگي هاي مذكور به نسخه بعدي اضافه خواهند شد.

آرگومان اختياري به برنامه نويس اجازه مي دهد كه هنگام تعريف، مقدار پيش فرضي براي آن در ليست پارامترهاي تابع در نظر بگيرد. در نتيجه هنگام فراخواني تابع چنانچه اين آرگومان در ليست پارامترهاي تابع ذكر نشود، كامپايلر از مقدار پيش فرض استفاده خواهد كرد. در واقع آرگومان را به اين دليل اختياري مي ناميم كه مي توان هنگام فراخواني تابع، آن را از ليست پارامترها حذف كرد. آرگومان (هاي) اختياري بايد پس از ذكر آرگومان هاي اصلي تعريف شود(شوند). به مثال زير توجه كنيد:

چند خط كد بالا خروجي زير را توليد مي كنند:

همانطور كه ذكر شد آرگومان اختياري به راحتي با تعيين مقدار پيش فرض براي آن حاصل مي شود. فرض كنيد كه تابعي به شكل زير با دو آرگومان اختياري تعريف كرده باشيم:

 

با توجه به مطالب بيان شده مي توان فراخواني هاي زير را براي اين تابع در نظر گرفت:

نكته ظريفي در فراخواني خط دوم وجود دارد. با توجه به اينكه آرگومان هاي y و z هر دو اختياري هستند، كامپايلر مقدار 2 را براي كدام يك از آرگومان هاي y يا z در نظر مي گيرد؟ در پاسخ به اين سوال بايد گفت كه قرارداد ساده اي در اين مورد بيان مي كند كه آرگومان هاي اختياري در ليست پارامترهاي تابع به ترتيب از چپ به راست ارزيابي مي شوند. در نتيجه كامپايلر مقدار 2 را براي آرگومان y در نظر گرفته و مقدار پيش فرض 7 را نيز به Z تخصيص خواهد داد. ازين رو فراخواني (M(1, 2 معادل فراخواني             (M(1, 2, 7 مي باشد.

براي اينكه كار با آرگومان هاي اختياري راحت تر باشد، و سناريوهايي مانند مثال قبل ايجاد محدوديت نكنند، مفهوم آرگومان نامي در كنار آرگومان اختياري شكل گرفته است. با استفاده از آرگومان نامي، مي توان نام متغير را در ليست پارامترهاي تابع به هنگام فراخواني آن صريحا ذكر كرد تا كامپايلر در تخصيص مقادير از قانون مذكور استفاده نكند. با در نظر گرفتن مثال قبل و مفهوم پارامتر نامي، فراخواني هاي زير را انجام داده ايم :

قوانين سربارگذاري توابع

اگر دقت كرده باشيد، حتما متوجه اين نكته شده ايد كه آرگومان هاي اختياري و نامي امضاء تابع را تحت تاثير قرار مي دهند. حال اين سوال مطرح مي شود كه با اضافه شدن آرگومان هاي اختياري و نامي به جمع پارامترهاي تابع چه تغييري در قانون امضاء تابع حاصل مي شود؟

با توجه به مستند منتشر شده مي توان به موارد زير اشاره كرد:

  • امضاءي يك تابع در صورتي قابل اجراست كه تمام آرگومان ها از نوع اختياري بوده يا حداقل يك آرگومان اصلي در ليست پارامتر ها وجود داشته باشد كه بتوان هنگام فراخواني تبديل مستقيمي به آن نوع انجام داد.
  • قوانين تبديل نوع تنها براي آرگومان هايي كه صريحا بيان شده اند صورت گرفته و آرگومان هاي اختياري در نظر گرفته نمي شوند.
  • اگر امضاء دو تابع مناسب باشد، تابعي فراخواني مي شود كه آرگومان اختياري نداشته باشد.

براي فهم بهتر قوانين بيان شده تعاريف زير را در نظر بگيريد:

اگر بخواهيم تابع M(5) را فراخواني كنيم، كدام يك از توابع بالا در قوانين مذكور صدق كرده و در نهايت كدام تابع فراخواني خواهد شد؟ با يك بررسي ساده مي توان گفت كه تابع M(string,int) قابل فراخواني نيست چون نوع int به string به صورت مستقيم قابل تبديل نمي باشد. فراخواني تابع M(int,string) به دليل اينكه آرگومان دوم از نوع اختياري ست، مجاز مي باشد. به همين صورت توابع M(object) و M(int) نيز امضاء مجازي دارند. واضح است كه توابع M(int,string) و M(int) نسبت به تابع M(object) گزينه هاي مناسب تري هستند چون تبديل 5 به int بهتر از تبديل آن به object مي باشد. در نهايت به دليل اينكه تابع     (M(int,string آرگومان اختياري دارد نيز حذف شده و بهترين گزينه براي فراخواني، تابع M(int) خواهد بود.

كلام آخر

به اطلاع علاقمندان مي رساند كه سفارش CTP Visual Studio 2010 براي اجراي كدهاي ارائه شده در اين مقاله و كار با C# 4.0 از طريق فروشگاه وب سايت امكانپذير مي باشد.

در پايان اين مقاله از شما خواننده محترم دعوت مي شود كه با انعكاس نظر خود در بخش پيام در ارائه بهتر كمي و كيفي مقالات آينده ما را همراهي كنيد. قبلا از اظهار نظر شما كمال تشكر را دارم.

هر گونه استفاده از مطالب اين مقاله تنها با كسب اجازه از نويسنده مقاله مجاز مي باشد. اين مقاله به صورت اختصاصي در وب سايت Persia Developers ارائه شده است.

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
ابوالفضل حسن الدينف
Member of Barid Development Team, ERP Solutions
همه مقاله های نوشته شده توسط این کاربر (۱۱)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۹ از مجموع ۹ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
معرفی منبعی برای2008 #c محمد محبی ۸۸/۱۰/۵
پاسخ به: معرفی منبعی برای2008 #c وحید رحمانی فرد ۸۸/۱۰/۵
 
خیلی خوب بود مهران همدانی نژاد ۸۸/۳/۳
 
تشكر مهدی شجاعی ۸۷/۱۰/۲۲
 
خيلي جالب بود احمد برزگر ۸۷/۱۰/۱
 
اجازه! عمران صادقی ۸۷/۹/۲۸
پاسخ به: اجازه! ابوالفضل حسن الدينف ۸۷/۹/۲۸
پاسخ به: اجازه! عمران صادقی ۸۷/۹/۲۸
پاسخ به: اجازه! ابوالفضل حسن الدينف ۸۷/۹/۲۹
 
تشکر کاوش حسینی ۸۷/۹/۲۸
 
خوانندگان محترم اظهار نظر و بحث يادتون نره... ابوالفضل حسن الدينف ۸۷/۹/۲۷
 
Optional Argument مجید شهاب فر ۸۷/۹/۲۶
پاسخ به: Optional Argument ابوالفضل حسن الدينف ۸۷/۹/۲۶
 
تشکر فربد صالحی ۸۷/۹/۲۳
پاسخ به: تشکر ابوالفضل حسن الدينف ۸۷/۹/۲۳
اولین قبلی بعدی

Copyright © 2006 - 2010 All Rights Reserved.
Please direct your questions or comments to