نگاهی به4.0 #C
حدود يك سال است كه از ارائه شدن نهايي سي شارپ نسخه 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
IList
توجه داشته باشيد كه تمام تكنولوژي فعلي در حال توسعه و تكامل مي باشد و يكي از دلايلي كه مايكروسافت CTP آن را در اختيار عموم قرار داده است، دريافت نظرات و فيدبك هاي بيشتر به منظور ارائه جامع محصول نهايي مي باشد. آنچه كه در سري مقالات C# 4.0، نگاهي به آينده ارائه خواهد شد، بر پايه نسخه اوليه بوده و نام برگزيده شده براي اين سري گوياي اين امر است.
در اين مقاله ويژگي Named Arguments - Optional Argumentsرا مورد بررسي قرار مي دهيم.
آرگومان هاي اختياري (Optional Arguments) – آرگومان هاي نامي (Named Arguments)
اين مفاهيم ويژگي هاي جديدي در دنياي برنامه نويسي به شمار نمي روند. بسياري از زبان ها از آن ها پشتيباني مي كنند. به عنوان مثال مي توان به Office automation API اشاره كرد كه توابع اين حوزه با در نظر گرفتن آرگومان هاي اختياري و نامي نوشته شده اند. به دليل دشوار بودن فراخواني توابعي از اين نوع در زبان سي شارپ، ويژگي هاي مذكور به نسخه بعدي اضافه خواهند شد.
آرگومان اختياري به برنامه نويس اجازه مي دهد كه هنگام تعريف، مقدار پيش فرضي براي آن در ليست پارامترهاي تابع در نظر بگيرد. در نتيجه هنگام فراخواني تابع چنانچه اين آرگومان در ليست پارامترهاي تابع ذكر نشود، كامپايلر از مقدار پيش فرض استفاده خواهد كرد. در واقع آرگومان را به اين دليل اختياري مي ناميم كه مي توان هنگام فراخواني تابع، آن را از ليست پارامترها حذف كرد. آرگومان (هاي) اختياري بايد پس از ذكر آرگومان هاي اصلي تعريف شود(شوند). به مثال زير توجه كنيد:

چند خط كد بالا خروجي زير را توليد مي كنند:
.jpg)
همانطور كه ذكر شد آرگومان اختياري به راحتي با تعيين مقدار پيش فرض براي آن حاصل مي شود. فرض كنيد كه تابعي به شكل زير با دو آرگومان اختياري تعريف كرده باشيم:
![]()
با توجه به مطالب بيان شده مي توان فراخواني هاي زير را براي اين تابع در نظر گرفت:
.jpg)
نكته ظريفي در فراخواني خط دوم وجود دارد. با توجه به اينكه آرگومان هاي y و z هر دو اختياري هستند، كامپايلر مقدار 2 را براي كدام يك از آرگومان هاي y يا z در نظر مي گيرد؟ در پاسخ به اين سوال بايد گفت كه قرارداد ساده اي در اين مورد بيان مي كند كه آرگومان هاي اختياري در ليست پارامترهاي تابع به ترتيب از چپ به راست ارزيابي مي شوند. در نتيجه كامپايلر مقدار 2 را براي آرگومان y در نظر گرفته و مقدار پيش فرض 7 را نيز به Z تخصيص خواهد داد. ازين رو فراخواني (M(1, 2 معادل فراخواني (M(1, 2, 7 مي باشد.
براي اينكه كار با آرگومان هاي اختياري راحت تر باشد، و سناريوهايي مانند مثال قبل ايجاد محدوديت نكنند، مفهوم آرگومان نامي در كنار آرگومان اختياري شكل گرفته است. با استفاده از آرگومان نامي، مي توان نام متغير را در ليست پارامترهاي تابع به هنگام فراخواني آن صريحا ذكر كرد تا كامپايلر در تخصيص مقادير از قانون مذكور استفاده نكند. با در نظر گرفتن مثال قبل و مفهوم پارامتر نامي، فراخواني هاي زير را انجام داده ايم :
![]()
قوانين سربارگذاري توابع
اگر دقت كرده باشيد، حتما متوجه اين نكته شده ايد كه آرگومان هاي اختياري و نامي امضاء تابع را تحت تاثير قرار مي دهند. حال اين سوال مطرح مي شود كه با اضافه شدن آرگومان هاي اختياري و نامي به جمع پارامترهاي تابع چه تغييري در قانون امضاء تابع حاصل مي شود؟
با توجه به مستند منتشر شده مي توان به موارد زير اشاره كرد:
-
امضاءي يك تابع در صورتي قابل اجراست كه تمام آرگومان ها از نوع اختياري بوده يا حداقل يك آرگومان اصلي در ليست پارامتر ها وجود داشته باشد كه بتوان هنگام فراخواني تبديل مستقيمي به آن نوع انجام داد.
-
قوانين تبديل نوع تنها براي آرگومان هايي كه صريحا بيان شده اند صورت گرفته و آرگومان هاي اختياري در نظر گرفته نمي شوند.
-
اگر امضاء دو تابع مناسب باشد، تابعي فراخواني مي شود كه آرگومان اختياري نداشته باشد.
براي فهم بهتر قوانين بيان شده تعاريف زير را در نظر بگيريد:
.jpg)
اگر بخواهيم تابع 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) خواهد بود.
سي شارپ و برنامه نويسي عام گرا
يكي از مفاهيم بسيار مهم در دنياي برنامه نويسي، امكان توسعه ساختارها و كلاس ها بدون وابستگي به نوع خاص مي باشد. به اين صورت كه ساختار يا كلاس بر اساس يك الگو (template) طراحي شده و نوع مشخصي هنگام نمونه سازي از آن ساختار يا كلاس جايگزين الگو مي شود. اين مفهوم تحت عنوان برنامه نويسي عام گرا (Generic Programming) مطرح بوده و كاربرد زيادي در توسعه كتابخانه ها و ساختمان داده ها دارد. به دليل اهميتي كه برنامه نويسي عام گرا براي هر زبان برنامه نويسي دارد، سي شارپ با ارائه نسخه 2.0 به پشتيباني از آن پرداخت. ساختمان داده ها، واسط ها (interfaces) و نماينده هاي (delegates) جنريك تنوع و انعطاف زيادي را براي برنامه نويسان به همراه دارند. ديگر نيازي به استفاده از ساختمان داده هايي چون ArrayList - كه از مفهوم بسته بندي (boxing) براي نگهداري داده ها استفاده مي كنند - نيست و مي توان با تعريف List و نوع نگهدارنده ي آن، به سرعت عمل بيشتر و كدهاي بهينه تر دست يافت. با اين حال نكات ريزي در برنامه نويسي جنريك مطرح مي باشند كه نسخه فعلي سي شارپ از آن ها پشتيباني نمي كند. به عنوان مثال نمونه كد زير را در نظر بگيريد:

انتساب انجام شده در خط سوم درست نبوده و پيغام خطاي آن نيز نمايش داده شده است. شايد اين تصور ايجاد شود كه چون هر نوعي را مي توان در 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 استفاده مي شود. كوواريانس در مواردي تعريف مي شود كه رابطه ي بين انوع از كوچكتر به بزرگتر باشد. به مثال زير توجه كنيد:

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

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

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

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

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

جمع بندي
مفاهيم، قوانين و نحوه استفاده از واريانس در سي شارپ 4.0 را بيان كرديم. حال ممكن است اين سوال در ذهن مطرح شود كه چرا واريانس؟ در پاسخ بايد گفت كه واريانس تنها براي پوشش دادن مفاهيمي كه تكميل كننده برنامه نويسي عام گرا بوده و مي بايست همراه نسخه 2.0 ارائه مي شدند، به نسخه 4.0 اضافه شده است.
منابع بيشتر
در حال حاضر منابع محدودي در رابطه با ويژگي هاي جديد سي شارپ 4.0 موجود مي باشند. مطالعه اين منابع براي تسلط بيشتر و درك مفاهيم جديد توصيه مي شود:
· مجموعه مقالات Eric Lippert در رابطه با واريانس ( از ابتدا تا حال )
برنامه نويسي پويا
برنامه نويسي پويا بحث داغ دات نت فريم ورك 4.0 مي باشد. طراحان و توسعه دهندگان اين كتابخانه عظيم در صدد هستند تا با فراهم كردن بستر مناسب، امكان فراخواني هاي پويا را براي زبان هاي تحت دات نت از جمله سي شارپ فراهم كنند. اين وظيفه را Dynamic Language Runtime و به اختصار DLR در محيط فريم ورك فراهم خواهد كرد.
برنامه نويسي پويا مربوط به زمان اجرا (Run Time) بوده كه نقطه مقابل زمان كامپايل مي باشد (Compile Time). در زمان كامپايل سه عمل زير انجام مي شود:
-
تحليل لغوي: در اين مرحله كد نوشته شده به سمبل ها، كلمات و اعداد شكسته مي شود. كامپايلر بر اساس نحو (syntax) زبان، كد را بررسي كرده، در صورت برخورد با خطاي لغوي - مثل جا انداختن نقطه ويرگول در پايان عبارت - پيغام خطاي مناسب را نمايش خواهد داد.
-
تحليل معنايي: در اين مرحله عبارات به دست آمده از مرحله قبل از نظر معنايي مورد ارزيابي كامپايلر قرار مي گيرند. به عنوان مثال حاصلضرب دو مقدار اعشاري را نمي توان در يك مقدار صحيح قرار داد و با وجود اينكه از نظر لغوي عبارت مذكور درست است كامپايلر خطاي معنايي را نمايش خواهد داد.
-
توليد كد ماشين: در اين مرحله در صورت عدم وجود خطا، كد ماشين معادل، توليد شده و در يك پيمانه اجرايي (فايل exe) يا كتابخانه (فايل dll) ذخيره مي شود.
كامپايلرهاي مختلف ممكن است عمليات بيشتري علاوه بر آنچه كه بيان شد، در زمان كامپايل انجام دهند كه مرحله لينك نمونه اي از اين مراحل مي باشد.
تمامي زبان هاي دات نت در مرحله توليد كد ماشين، به زبان مياني مايكروسافت (MSIL) ترجمه شده و در فايل اسمبلي اعم از فايل اجرايي يا كتابخانه اي ذخيره مي شوند. از اين رو هنگام اجراي فايل اسمبلي در محيط CLR، كامپايلري تحت عنوان Just In Time Compiler زبان مياني مايكروسافت را به زبان ماشين ترجمه مي كند.
افزودن ويژگي پويا به كامپايلر زبان برنامه نويسي اين امكان را فراهم مي كند كه كامپايلر از تحليل معنايي تعاريف و بلوك هاي پويا صرف نظر كند. از اين رو تحليل معنايي به زمان اجرا موكول مي شود و اگر خطايي در معناي تعاريف يا بلوك هاي پويا وجود داشته باشد، پيغام خطاي زمان اجرا صادر خواهد شد.
نوع جديد dynamic در سي شارپ
در سي شارپ 4.0 برنامه نويسي پويا از طريق نوع جديد گنجانده شده در زبان يعني dynamic امكان پذير خواهد بود. كلمه كليدي dynamic در تمامي جاهايي كه امكان تعريف و استفاده از نوع وجود دارد، قابل استفاده مي باشد. به نمونه كد زير توجه كنيد:
dynamic d = GetDynamicObject();
d.M(7);
كامپايلر سي شارپ اجازه خواهد داد كه توابعي با نام و آرگومان هاي دلخواه بر روي d فراخواني شوند. چون d از نوع پويا است كامپايلر هيچ تفسير معنايي از فراخواني(M(7 نخواهد داشت و تفسير آن را به زمان اجرا موكول خواهد كرد.
علاوه بر تابع، فراخواني عضو، خصيصه، عمليات انديس، عملگر و نماينده بر روي نوع پويا امكان پذير خواهد بود.
d.f = d.P; // getting and settings fields and properties
d["one"] = d["two"]; // getting and setting through indexers
int i = d + 3; // calling operators
string s = d(5,7); // invoking as a delegate
تنها نقش كامپايلر سي شارپ در زمان كامپايل اين سناريو ، بسته بندي اطلاعاتي است كه بيان مي كنند "چه اتفاقي براي d رخ داده است". در زمان اجرا تفسير دقيق هر يك از اين فراخواني ها مشخص خواهد شد.
تفسير نوع پويا در زمان اجرا
در مثال قبل با تعريف نوع پويا d، اين امكان را فراهم كرديم كه كامپايلر به بسته بندي اطلاعات موجود در زمينه فراخواني ها و عمليات انجام شده بر روي d اكتفا كند تا در زمان اجرا تفسير واقعي اين اطلاعات به دست آيد. اين تكنيك اصطلاحا پيگرد پويا (dynamic lookup) ناميده مي شود.
در زمان اجرا، ذات d نوع تفسير ها را مشخص خواهد كرد. d مي تواند يكي از انواع پويا زير باشد:
-
شيئي از نوع COM: چنانچه d شيئي از نوع COM باشد، DLR، تفسير پويا آن را از طريق واسط IDispatch كه نوع COM فراهم مي كند، انجام خواهد داد. فراخواني پويا شيء COM، امكان استفاده از ويژگي هاي COM را كه نقطه مقابلي در زبان سي شارپ ندارند، فراهم خواهد كرد. خصيصه هاي انديس دار (indexed properties) و خصيصه هاي پيش فرض (default properties) نمونه اي از اين ويژگي ها هستند .
-
شيء پويا (Dynamic Object): اگر d واسط IDynamicObject را پياده سازي كند، از نوع پويا محسوب خواهد شد. پياده سازي واسط IDynamicObject، اين امكان را فراهم مي كند كه نوع جديد تمامي عمليات پويا را به دلخواه خود سربارگذاري كند. اين ويژگي براي توسعه زبان هاي پويا مانند IronPython و IronRuby در توصيف مدل پويا آبجكت ها مورد استفاده قرار مي گيرد. براي استفاده از API به كار رفته در مدل HTML DOM و دسترسي به خصيصه هاي آبجكت هاي آن نيز از اين روش استفاده خواهد شد.
-
شيء ساده (Plain Object): چنانچه d هيچ يك از دو نوع بالا نباشد، مي توان نتيجه گرفت كه d شيء استاندارد دات نت بوده كه تفسير پويا آن از طريق Reflection و Runtime Binder سي شارپ انجام خواهد شد. اين بخش از كامپايلر سي شارپ به عنوان مؤلفه در زمان اجرا براي "اتمام پردازش نوع پويا" مورد استفاده قرار مي گيرد.
موارد استفاده از ويژگي پويا
با توجه به انواع اشياء پويا مي توان به سه سناريوي زير كه بيشترين بهره را از ويژگي پويا خواهند برد، اشاره كرد:
-
اتوماسيون آفيس و ديگر اينتراپت هاي COM: ويژگي پويا باعث خواهد شد كه نسخه بعدي اتوماسيون آفيس ساده تر از قبل شود. از اين رو نيازي به استفاده از تايپ هاي بزرگ و فراخواني توابع با آرگومان هاي زياد وجود نخواهد داشت.
-
استفاده از زبان هاي پويا ديگر: محبوبيت زبان هاي پويا از قبيل IronPython و IronRuby رو به افزايش است. در حال حاضر اين زبان ها به راحتي مي توانند از كدهاي سي شارپ و ديگر زبان هاي دات نت بهره مند شوند در حاليكه عكس آن امكان پذير نيست. فعال شدن ويژگي پويا باعث خواهد شد كه فراخواني اشياء زبان هاي پويا و ساختارهاي متغيير مانند HTML DOM در زبان هاي دات نت فراهم شود. توسعه دهندگان قادر خواهند بود ضمن استفاده از كدهاي موجود، به توسعه ي آن ها و توليد كدهاي جديد بپردازند.
-
فراخواني راحت تر Reflection: در حال حاضر توسعه دهندگان و برنامه نويسان از طريق فضاي نام Reflection قادر به توليد كلاس ها و فراخواني توابعي هستند كه در زمان كامپايل نامشخص اند. ويژگي پويا كامپايلر سي شارپ چنين فراخواني هايي را به مراتب ساده تر خواهد كرد.
توسعه آبجكت هاي پويا
همانطور كه اشاره شد، واسط IDynamicObject امكان تعريف نوع پويا با رفتار دلخواه را فراهم مي كند. IDynamicObject براي توصيف رفتار پويا خود، از كلاسي به نام MetaObject استفاده مي كند. از طريق سربارگذاري توابع زير كه توسط MetaObject ارائه مي شوند، تفسير پويا فراخواني ها در زمان اجرا مشخص مي شود:

همانطور كه مشاهده مي شود، هر تابع بيانگر يك عمل انجام شده بر روي نوع پويا است. به عنوان مثال تابع Call براي سربارگذاري نحوه فراخواني توابع بر روي آبجكت پويا به كار مي رود. توابع GetMember و SetMember براي سربارگذاري نحوه فراخواني خصيصه بر روي نوع پويا استفاده مي شوند. تمامي توابع، دو آرگومان استاندارد در ليست پارامترهاي خود دارند. پارامتر اول از نوع نماينده بوده كه اطلاعاتي پيرامون نوع عمل انجام يافته بر روي نوع پويا را شامل مي شود. پارامتر دوم نيز آرايه اي از آرگومان هاي عمل صورت گرفته بر روي نوع پويا مي باشد. به عنوان مثال اگر تابعي بر روي نوع پويا با يك پارامتر فراخواني شده باشد، نماينده حاوي تابع و آرايه حاوي پارامتر اين تابع خواهد بود.
نسخه CTP به صورت كامل و نهايي از ويژگي هاي پويا معرفي شده در اين مقاله پشتيباني نمي كند. همانطور كه در ليست توابع ارائه شده براي سربارگذاري مشاهده مي شود، توابع مربوط به سربارگذاري indexor و delegate گنجانده نشده اند.
در ادامه مثال ساده اي براي مرور مفاهيم بيان شده در اين مقاله معرفي مي كنيم. نوع پويا PdDynamicType را به شكل زير تعريف كرده ايم :

تابع Call را سربارگذاري كرديم تا Runtime Binder در زمان اجرا با برخورد به فراخواني تابع دلخواه بر نوع PdDynamicType نام آن را در كنسول چاپ كند. علاوه بر تعريف نوع پويا، نوع ساده PdType به شكل زير تعريف شده است:

در نهايت تعاريف بالا به شكل زير در تابع Main به كار رفته اند:

تابع PdDynamicCall سه بار و هر بار با نوعي متفاوب فراخواني شده است. اين تابع نوع پويا dynamicType را به عنوان آْرگومان دريافت كرده و تابعي به نام PdFunc را بر روي آن فراخواني مي كند. در زمان كامپايل، تنها اطلاعي كه كامپايلر سي شارپ از dynamicType دارد اين است كه تابع PdFunc بر روي آن فراخواني شده است و اينكه اين تابع چيست و چه كاري انجام مي دهد، تنها در زمان اجرا مشخص خواهد شد. به خروجي حاصل از اين اجرا توجه كنيد:

همانطور كه مشاهده مي شود در زمان اجرا، تابع PdFunc نوع int پيدا نشده است و لذا استثناي زمان اجرا نمايش داده شده است. به همين دليل است كه كد تابع PdDynamicCall داخل بلوك try - catch نوشته شده است. PdType تعريفي براي تابع PdFunc ارائه كرده است. فراخواني آن در زمان اجرا منجر به چاپ خط دوم در كنسول شده است. در نهايت فراخواني PdFunc بر روي نوع پويا PdDynamicType صورت گرفته است كه سربارگذاري تابع Call، باعث چاپ نام تابع در خط سوم كنسول شده است.