تو قسمتهای قبلی (1 و 2 و 3 و 4 و 5 و 6) بحث های اولیه CLR به جاهای خوبی رسید. تو این قسمت درباره دو بخش مهم دیگه پلتفرم دات نت فریمورک، یعنی FCL که مخفف عبارت Framework Class Library و CTS که مخفف Common Type System هستن، مطالبی ارائه میشه.
بخش مهم و عظیمی از دات نت فریمورک قسمتیه به نام FCL. این قسمت درواقع شامل مجموعه بزرگی از اسمبلی های استاندارد دات نتیه که هزاران نوع مختلف رو که هر کدوم فعالیت خاصی رو انجام میدن، تعریف میکنه. البته مایکروسافت کتابخونه های مشابه دیگه ای مثل Windows Azure SDK یا DirectX SDK رو هم خارج از بدنه دات نت تولید میکنه. این کتابخونه ها که روز به روز هم به تعدادشون و هم به حجمشون اضافه میشه برای هر چه بیشتر راحتتر کردن کار برنامه نویسا تولید میشن.
برخی از انواع اپلیکیشن هایی که توسعه دهنده ها با استفاده از این کتابخونه ها میتونن تولید کنند عبارتنداز:
- Web Services: متدهایی که میتونن پیغامهای رسیده از طریق اینترنت رو پردازش کنن. این فرایند یا توسط تکنولوژی ASP.NET XML Web Service و یا با استفاده از WCF (یا Windows Communication Foundation) انجام میشه.
- Web Site/Application: اپلیکیشنهایی که با استفاده از تکنولوژیهای ASP.NET WebForms و یا ASP.NET MVC تولید میشن. معمولا تو این نوع از اپلیکیشن ها از دیتابیس های مختلف برای کابردهای گوناگون استفاده میشه، متدهای وب سرویسها فراخونی میشه، داده های موجود فیلتر یا ترکیب میشن و به سمت کاربر فرستاده یا از طرف اون دریافت میشن، و در نهایت این داده ها با استفاده از HTML به کاربر نمایش داده میشن.
- Windows GUI Application: با استفاده از این نوع اپلیکیشن ها میشه برنامه هایی تولید کرد که هم سرعت بالایی دارن و هم امکانات و ویژگی های کاملی. این اپلیکیشن ها معمولا با استفاده از تکنولوژیهای Windows Forms و یا WPF (یا Windows Presentaion Foundation) تولید میشن. در این نوع اپلیکیشنها میشه از انواع کنترلهای گرافیکی ساده و پیشرفته مثل دکمه ها، منوها، گریدها، و از این قبیل استفاده کرد. این نوع از برنامه ها برخلاف برنامه های وبی میتونن از با لایه های زیرین سیستم عامل هم ارتباط برقرار کنن. همچنین مثل برنامه های وبی میتونن از وب سرویسها هم بهره ببرن.
- Console Application: این نوع اپلیکیشنها رابط کاربری بسیار ساده ای دارن (شبیه کنسول سیستم عامل داس) و برای کاربردهای ساده و اولیه یا حتی کارهای آزمایشی کاربرد زیادی دارن. البته برای کاربردهای پیشرفته و خاصی مثل ابزارهای ویژه، یا کامپایلرها و برنامه های حساسی که بیشتر نیاز به سرعت و کارایی دارن تا کاربری و زیبایی هم از این نوع اپلیکیشنها استفاده میشه.
- Component: با دات نت فریمورک میشه اسمبلی هایی کاملا مستقل یا به اصطلاح Stand-alone تولید کرد که تو سایر برنامه بشه ازشون استفاده کرد.
انواع تعریف شده تو FCL با یه ساختار مشخص در کنار هم قرار دارن. تو این مجموعه عظیم، انواع مرتبط با هم تو یه بسته خاص که فضای نام بهش میگن، قرار گرفتن. مثلا یه فضای نام مهم تو این پلتفرم System هستش که بسیاری از انواع مهم و اولیه که تقریبا تو تموم برنامه ها از اونا استفاده میشه، رو در بر داره.
برای استفاده از هر کدوم از انواع تعریف شده تو FCL، نیازه تا نام فضای نام نوع موردنظر رو بدونیم. البته صرفا آگاهی از فضای نام مربوطه کافی نیست، چون درنهایت برای استفاده از نوع موردنظر باید بدونیم که این نوع تو کدوم اسمبلی تعریف شده. تو دات نت هر فضای نام میتونه شامل انواع زیادی باشه که ممکنه تو چند اسمبلی مختلف تعریف شده باشند. بنابراین آگاهی از اسمبلی ای که نوع موردنظر رو تعریف کرده و ریفرنس دادن به اون اسمبلی، هم برای استفاده از نوع موردنیاز لازمه.
بسیاری از انواع موجود تو FCL اجازه تغییر و شخصی سازی تو رفتارشون به برنامه نویس رو میدن. مثلا درصورت نیاز میشه برای رفع نیاز برنامه، انواع جدیدی رو براحتی با ارثبری از انواع مختلف موجود تو FCL تولید کرد. برنامه نویسی شی گرا که کاملا توسط دات نت پشتیبانی میشه فرایند تولید نرم افزار رو با استفاده از FCL کاراتر میکنه.
این ساختار منحصر به فرد، تو پیاده سازی اپلیکیشن ها کمک زیادی میکنه. با استفاده از این ساختار، دسته بندی انواع مختلف براحتی و آزادی بیشتری انجام میشه که درنهایت باعث ساده تر شدن مدیریت و نگهداری کد و برنامه میشه.
با توجه به توضیحاتی که تا اینجا ارائه شده، میشه نتیجه گرفت که کار با CLR کلا یعنی کار با نوع (Type)ها. این نوع ها، عملیات ها و ویژگی های مختلف رو برای برنامه ها و سایر انواع فراهم میکنن. درواقع با استفاده از این انواع میشه بین کدهای نوشته شده با زبانهای مختلف برنامه نویسی ارتباط برقرار کرد. و از اونجا که این انواع به نوعی در ریشه و محور CLR قرار دارن، مایکروسافت یه سری مشخصات رسمی و ثبت شده برای اونا به نام Common Type System یا CTS تهیه و استاندارد کرده، که نحوه تعریف و چگونگی رفتارشون رو شرح داده.
CTS مشخص کرده که یه نوع میتونه اعضایی به تعداد صفر یا بیشتر داشته باشه. این عضوها میتونن از انواع زیر باشن:
- Field: یه متغیر تو سطح نوع که برای نگهداری دیتای خاصی استفاده میشه و میتونه حالت و وضعیت نوع مربوطه رو مشخص کنه. فیلدها با استفاده از نام و نوعشون مشخص میشن.
- Method: یه متد جزئیه که یه فرایند یا عملیات خاص رو به انجام میرسونه که معمولا منجر به تغییر حالت یا وضعیت یه شی میشه. متدها یه اسم، یه امضا، و یه سری تغییردهنده رفتار (modifiers) دارن. امضای یه متد درواقع شامل تعداد پارامترهای ورودی اون، به همراه ترتیب قرارگیری و نوع اونا، و همچنین برگشت و یا عدم برگشت مقداری توسط متد و نوع مقدار برگشت درصورت وجود، میشه.
- Property: این عضو، رفتاری منحصر به فرد در مقایسه با سایر اعضا داره. برای فراخوانندگان و استفاده کنندگان از نوع، پراپرتی مثل یه فیلد میمونه، اما برای خود نوع رفتار متدی داره. در واقع این عضو در پشت صحنه از دو متد مجزا تشکیل میشه. با این ویژگی، میشه عملیاتی قبل و بعد از خواندن و نوشتن داده ها (مثل تعیین اعتبار و یا صدا زدن ایونت ها) و یا محاسبه و بدست آوردن یه مقدار خاص تنها درصورت وجود درخواستش، رو پیاده کرد. همچنین با استفاده از پراپرتی ها میشه اعضایی فقط خواندنی و یا فقط نوشتنی تولید کرد.
- Event: یک ایونت یا رویداد، برای پیاده سازی مکانیزمی جهت آگاه کردن سایر اشیای علاقه مند به اتفاقات رخداده درون نوع استفاده میشه. مثلا میشه وقتیکه روی یه دکمه کلیک شد، این اتفاق رو با استفاده از یه ایونت به بقیه اعلام کرد.
CTS قوانینی برای سطوح دسترسی مختلف به نوع ها و هر یک از اعضای یه نوع داره. مثلا با اعمال سطح public به یک نوع، دسترسی کاملا عمومی به این نوع اعمال میشه و اونو برای تمامی انواع و اسمبلی ها نمایان میکنه، و یا مثلا سطح internal نوع مربوطه رو تنها برای اشیای موجود تو همون اسمبلی در دسترس قرار میده. بنابراین CTS با استفاده از کلمات کلیدی این چنینی انواع مختلف سطوح دسترسی رو تعیین میکنه و CLR با استفاده از این مشخصه ها، این دسترسی ها رو در زمان اجرا الزام میکنه.
درضمن اعضای هر نوع میتونن سطح دسترسی خودشون رو بطور جداگانه نیز تعیین کنن و مثلا سطح دسترسی کمتری نسبت به خود نوع اعمال کنن. انوع تغییر دهنده های سطح دسترسی که برای اعضای یه نوع بکار میره عبارتنداز:
- Private: عضو مربوطه تنها تو نوعی که تعریف شده در دسترسه.
- Family: عضو مربوطه در دسترس اعضای نوع و اعضای انواعی که از نوع مربوطه به ارث بردن (فارغ از اسمبلی که توش تعریف شدن)، هست. تو #C به این سطح دسترسی protected گفته میشه.
- Family and assembly: عضو مربوطه تنها در دسترس انواع فرزندی که تو همون اسمبلی تعریف شدن هست. بسیاری از زبانهای برنامه نویسی (ازجمله #C و VB.NET) این تغییردهنده سطح دسترسی رو فراهم نمیکنن، درصورتیکه IL امکانش رو داره.
- Assembly: عضو مربوطه تنها تو اسمبلی ای که تعریف شده در دسترسه. بیشتر زبانهای برنامه نویسی از این نوع سطح دسترسی به عنوان internal نام میبرند.
- Family or assembly: عضو مربوطه در کلاسهای فرزند تو هر اسمبلی ای در دسترس هستند. تو #C این سطح دسترسی با نام protected internal وجود داره.
- Public: عضو مربوطه همه جا در دسترسه.
علاوه بر موارد اشاره شده بالا، CTS قوانینی برای چگونگی پیاده سازی ارثبری، متدهای ویرچوال، طول عمر اشیا و ... داره. این قوانین برای پیاده سازی ساختار استانداردی امروزی و مدرن برای زبانهای برنامه نویسی موجود تولید شده اند. درواقع نیازی نیست تا تمامی قوانین این چنینی موجود تو CTS رو بلد بود، چونکه زبانهای برنامه نویسی مختلف به نوبه خود ساختار زبانی و قواعدی دارن که این قوانین رو با شکل و شمایلی آشنا و منطبق با ساختار خودشون پیاده کردن که کار یادگیری اونا رو برای برنامه نویسای آشنا با ساختار زبان دلخواهش راحتتر میکنه.
برای روشن تر شدن مبحث بالا یه مثال اینه که تو زبان ++C امکان ارثبری از چند کلاس پایه وجود داره، اما CTS تنها اجازه استفاده از یک کلاس به عنوان کلاس پایه رو میده. بنابراین اگه زمان تولید یه نوع مدیریت شده تو C++/CLI از ارثبری چندگانه استفاده بشه، کامپایلر مایکروسافت یه خطا صادر میکنه و اجازه تولید اسمبلی مدیریت شده رو نمیده.
یکی دیگه از قوانین کلی CTS اینه که تمامی انواع تعریف شده باید در نهایت از نوع System.Object مشتق شده باشن. استفاده از این کلاس پایه، وجود یکسری امکانات و رفتارهای لازم رو تو تمامی نوع ها تضمین میکنه. مخصوصا اینکه Object موارد زیر رو فراهم میکنه:
- مقایسه برابری ریفرنس دو شی مختلف (از طریق متد Equals).
- تولید یه «هش کد» برای هر شی (از طریق متد GetHashCode).
- بازیابی نوع واقعی هر شی (از طریق متد GetType).
- تولید یه کپی کم عمق (Shallow) از هر شی (از طرق متد MemberwiseClone).
- تولید یه رشته معرف شی مربوطه (از طریق متد ToString).
.: در ادامه درباره CLS یا Common Language Specification بحث میشه.
CLR به زبان ساده - قسمت اول: پیشگفتار
CLR به زبان ساده - قسمت دوم: اسمبلی
CLR به زبان ساده - قسمت سوم: بارگذاری
CLR به زبان ساده - قسمت چهارم: اجرا
CLR به زبان ساده - قسمت پنجم: IL و بررسی کد
CLR به زبان ساده - قسمت ششم: NGen.exe
CLR به زبان ساده - قسمت هفتم: FCL و CTS
CLR به زبان ساده - قسمت هشتم: CLS
CLR به زبان ساده - قسمت نهم: کد مدیریت نشده
:.