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

پس از برگزاري كنفرانس PDC 2008 و معرفي تكنولوژي هاي جديد مايكروسافت، در سري مقالات C# 4.0، نگاهي به آينده ، به معرفي ويژگي هاي نسخه 4.0 زبان سي شارپ پرداخته ايم. در دومين مقاله از اين سري ويژگي Variance مورد بحث و بررسي قرار گرفته است.

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

سي شارپ و برنامه نويسي عام گرا

يكي از مفاهيم بسيار مهم در دنياي برنامه نويسي، امكان توسعه ساختارها و كلاس ها بدون وابستگي به نوع خاص مي باشد. به اين صورت كه ساختار يا كلاس بر اساس يك الگو (template) طراحي شده و نوع مشخصي هنگام نمونه سازي از آن ساختار يا كلاس جايگزين الگو مي شود. اين مفهوم تحت عنوان برنامه نويسي عام گرا (Generic Programming) مطرح بوده و كاربرد زيادي در توسعه كتابخانه ها و ساختمان داده ها دارد. به دليل اهميتي كه برنامه نويسي عام گرا براي هر زبان برنامه نويسي دارد، سي شارپ با ارائه نسخه 2.0 به پشتيباني از آن پرداخت. ساختمان داده ها، واسط ها (interfaces) و نماينده هاي (delegates) جنريك تنوع و انعطاف زيادي را براي برنامه نويسان به همراه دارند. ديگر نيازي به استفاده از ساختمان داده هايي چون ArrayList - كه از مفهوم بسته بندي (boxing) براي نگهداري داده ها استفاده مي كنند - نيست و مي توان با تعريف List و نوع نگهدارنده ي آن، به سرعت عمل بيشتر و كدهاي بهينه تر دست يافت. با اين حال نكات ريزي در برنامه نويسي جنريك مطرح مي باشند كه نسخه فعلي سي شارپ از آن ها پشتيباني نمي كند. به عنوان مثال نمونه كد زير را در نظر بگيريد:

image001.jpg

انتساب انجام شده در خط سوم درست نبوده و پيغام خطاي آن نيز نمايش داده شده است. شايد اين تصور ايجاد شود كه چون هر نوعي را مي توان در object بسته بندي كرد، انتساب نيز به درستي صورت گرفته است. اگر فرض كنيم كه انتساب انجام شده درست بوده است مي توان در ادامه كدي به صورت زير نوشت:

دو خط كد بالا مفهوم محفوظ بودن نوع (type safety) را نقض مي كنند. چرا كه به راحتي اجازه داده ايم نوع int وارد ليستي از نوع string شود.با اين مقدمه به معرفي ويژگي Variance (واريانس) سي شارپ 4.0 مي پردازيم.

كوواريانس (Covariance) و ضدواريانس (Contravariance)

از آنجايي كه واريانس مفهوم ظريفي را معرفي مي كند، لازم است رابطه بين انواع مختلف را يك بار ديگر مرور كنيم. دو نوع T و U را در نظر بگيريد. بين دو نوع مذكور چهار نوع رابطه مي تواند وجود داشته باشد:

·  نوع T از نوع U بزرگتر است

·  نوع T از نوع U كوچكتر است

·  نوع T معادل نوع U است

·  نوع T بي ارتباط با نوع U است

سه رابطه ي اول در سلسله ارث بري مطرح مي باشند. سلسله جاندار <- پستاندار <- زرافه  را در نظر بگيريد. كلاس پستاندار از كلاس جاندار كوچكتر است چون زيركلاسي از آن مي باشد. به همين ترتيب مي توان گفت كه كلاس پستاندار از كلاس زرافه بزرگتر است.

واريانس در مواردي به كار برده مي شود كه رابطه اي از نوع اول يا دوم بين انواع برقرار باشد. قبل از اينكه به بررسي مثال هاي واريانس بپردازيم، قوانين واريانس را مطرح مي كنيم:

·  واريانس تنها بر روي نماينده ها (delegates) و واسط ها (interfaces) تعريف مي شود.

· واريانس در مواردي قابل استفاده است كه تبديل بين انواع از نوع مرجع (reference) باشد. مثلا تبديل string به object از نوع مرجع بوده درحاليكه تبديل int به object از نوع بسته بندي (boxing) است.

· از كوواريانس و ضدواريانس در كنار هم نمي توان استفاده كرد.

براي تعريف كوواريانس از كلمه كليدي out استفاده مي شود. كوواريانس در مواردي تعريف مي شود كه رابطه ي بين انوع از كوچكتر به بزرگتر باشد. به مثال زير توجه كنيد:

image003.jpg

با تعريف كوواريانس به صورتي كه در مثال بالا مشاهده مي شود، CoObject = CoString انتساب درستي بوده كه خروجي زير را به دنبال دارد:

image004.jpg

براي تعريف ضدواريانس از كلمه كليد in استفاده مي شود. برعكس كوواريانس، ضدواريانس در مواردي تعريف مي شود كه رابطه ي بين انواع از بزرگتر به كوچكتر باشد. با اندكي تغيير به مثال ضدواريانس توجه كنيد:

image005.jpg

تعريف ضدواريانس به ما اين اجازه را مي دهد كه انتساب ContraString = ContraObject را انجام دهيم. خروجي زير حاصل اجراي مثال ضدواريانس مي باشد:

image006.jpg

كوواريانس و ضدواريانس از ديدگاه ديگري نيز قابل بررسي مي باشند. كلمه كليدي out در تعريف كوواريانس ايجاب مي كند كه نوع جايگزين كننده قالب T همواره در موقعيت خروجي باشد.  به همين ترتيب در تعريف ضدواريانس، كلمه كليدي in ايجاب مي كند كه نوع جايگزين كننده قالب T همواره در موقعيت ورودي قرار گيرد. به منظور روشن شدن اين ديدگاه به آخرين مثال تركيبي از كوواريانس و ضدواريانس در تعريف نماينده توجه كنيد:

image007.jpg

همانطور كه مشاهده مي شود آرگومان ورودي نماينده با استفاده از ضدواريانس و مقداربازگشتي با استفاده از كوواريانس تعريف شده است. اين مثال خروجي زير را توليد مي كند:

image008.jpg

جمع بندي

مفاهيم، قوانين و نحوه استفاده از واريانس در سي شارپ 4.0 را بيان كرديم. حال ممكن است اين سوال در ذهن مطرح شود كه چرا واريانس؟ در پاسخ بايد گفت كه واريانس تنها براي پوشش دادن مفاهيمي كه تكميل كننده برنامه نويسي عام گرا بوده و مي بايست همراه نسخه 2.0 ارائه مي شدند، به نسخه 4.0 اضافه شده است.

منابع بيشتر

در حال حاضر منابع محدودي در رابطه با ويژگي هاي جديد سي شارپ 4.0 موجود مي باشند. مطالعه اين منابع براي تسلط بيشتر و درك مفاهيم جديد توصيه مي شود:

·         مجموعه مقالات Eric Lippert در رابطه با واريانس ( از ابتدا تا حال )

·         Generic Variance in C# 4.0

·         C# Future

قسمت اول سري C# 4.0، نگاهي به آينده اينجا ارائه شده است. 

كلام آخر

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

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

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

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

 عنوان فرستنده تاریخ
 
مرسی ابوالفضل جان !! محمد هادی صحافیان ۸۸/۱/۸
پاسخ به: مرسی ابوالفضل جان !! ابوالفضل حسن الدينف ۸۸/۱/۹
 
تشکر محمد کنکاش ۸۸/۱/۷
 
عالي بود احمد برزگر ۸۷/۱۰/۱
 
پیشنهاد کاوش حسینی ۸۷/۹/۲۸
پاسخ به: پیشنهاد ابوالفضل حسن الدينف ۸۷/۹/۲۸
 
خوانندگان محترم اظهار نظر و بحث يادتون نره... ابوالفضل حسن الدينف ۸۷/۹/۲۷
با تشکر از زحمات و تلاش شما مرتضی نیکوقدم ۸۷/۱۲/۱۱
با تشکر از زحمات و تلاش شما ابوالفضل حسن الدينف ۸۷/۱۲/۱۱
اولین قبلی بعدی

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