
آموزش گام به گام #C (جلسه شانزدهم: استفاده از اتریبیوتها)
اتریبیوتها از جمله عناصر بسیار مهم و مفید برنامهنویسی هستند که در مرتب نوشتن کد، خوانایی و عملکرد بهتر سیستم کمک میکنند. با ما همراه باشید!
جلسه اول: آغاز کار با #C | جلسه ششم: namespaceها | جلسه یازدهم: اندیس گذار یا indexerها | جلسه شانزدهم: استفاده از اتریبیوتها | جلسه بیست و یکم: متدهای بینام یا anonymous |
جلسه دوم: عملگرها، نوعها و متغیرها | جلسه هفتم: مقدمهای بر کلاسهای #C | جلسه دوازدهم: ساختار یا structها | جلسه هفدهم: enumها | جلسه بیست و دوم: موضوعاتی در مورد نوع در #C |
جلسه سوم: عبارات کنترلی - گزینشی | جلسه هشتم: وراثت کلاس در #C | جلسه سیزدهم: واسط یا interfaceها | جلسه هجدهم: عملگرهای overloading | جلسه بیست و سوم: کار با نوعهای nullable |
جلسه چهارم: عبارات کنترلی - حلقهها | جلسه نهم: چندریختی | جلسه چهاردهم: مقدمهای بر delegateها و رویدادها | جلسه نوزدهم: کپسولهسازی | |
جلسه پنجم: متدها | جلسه دهم: ویژگی یا propertyها | جلسه پانزدهم: مقدمهای بر کنترل خطا یا exception | جلسه بیستم: مقدمهای بر generic collectionها |
در این جلسه، نحوه استفاده از اتریبیوتهای #C را توضیح میدهیم. اهداف این جلسه به شرح زیر هستند:
- درک اینکه اتریبیوتها چه هستند و چرا از آنها استفاده میکنیم.
- به کارگیری اتریبیوتهای مختلف همراه با چند یا صفر پارامتر.
- استفاده از اتریبیوتهای اسمبلی، نوع عضو و نوع سطح.
چرا از اتریبیوتها استفاده میکنیم؟
اتریبیوتها عناصری هستند که شما را قادر میسازند اطلاعات اعلانی (declarative) به برنامههای خود اضافه کنید. این اطلاعات اعلانی برای اهداف مختلف در طول رانتایم مورد استفاده قرار میگیرند و میتوان با استفاده از ابزارهای توسعه اپلیکیشن، از آنها در هنگام طراحی نیز استفاده کرد.
برای مثال، اتریبیوتهایی مانند DllImportArrribute وجود دارند که به یک برنامه اجازه میدهند با کتابخانههای Win32 ارتباط برقرار کند. اتریبیوت دیگری به نام ObsoleteAttribute، یک هشدار در زمان کامپایل ظاهر میسازد که به توسعهدهنده اطلاع میدهد که یک متد دیگر نباید مورد استفاده قرار گیرد.
وقتی در حال ساختن برنامههای Windos Form هستید، چند اتریبیوت وجود دارند که اجازه میدهند اجزای بصری را drag کرده و به داخل سازنده فرم بصری drop کنید و اطلاعات آنها را در شبکه propertyها نمایش دهید.
اتریبیوتها همچنین به صورت گسترده در ایمنسازی اسمبلیهای NET. به کار میروند و کد فراخوانی را مجبور به ارزیابی و سنجش در برابر محدودیتهای امنیتی از پیش تعریف شده میکنند. اینها فقط توضیحات کوچکی از چگونگی استفاده از اتریبیوتها در برنامههای #C میباشند.
دلیل اینکه چرا اتریبیوتها ضروری و لازم هستند این است که، اگر بخواهیم بسیاری از خدماتی که آنها فراهم میکنند را با کد به صورت طبیعی خودمان بنویسیم، بسیار سخت و مشکل خواهد بود. اتریبیوتها چیزی به نام متا داده را به برنامههای شما اضافه میکنند.
وقتی برنامه #C شما کامپایل میشود، فایلی به نام assembly ایجاد میکند، که طبیعتا یک کتابخانه قابل اجرا یا DLL است. اسمبلیها فایلهای خود توضیح هستند، چون وقتی کامپایل میشوند، متاداده در آنها نوشته میشود. از طریق فرآیندی به نام Reflection، اتربیوتهای یک برنامه میتوانند از متاداده فایل اسمبلی برنامه بازیابی شوند.
اتریبیوتها کلاسهایی هستند که میتوان آنها را در #C نوشت و برای تزئین و زیباسازی کد شما با اطلاعات اعلانی از آنها استفاده کرد. این امر بسیار مهم است، چون بدان معنا است که میتوانید با ایجاد Syntax اعلانی سفارشیسازی شده به وسیله اتریبیوتها، زبان خود را گسترش دهید.
تمرینات این جلسه، نحوه استفاده از اتریبیوتهای از پیش موجود در برنامههای #C را نشان میدهند. درک مفاهیم و چگونگی استفاده از این چند اتریبیوت، به شما کمک میکنند تعداد زیادی از اتریبیوتهای از پیش موجود دیگر در کتابخانههای کلاس NET. را یافته و همچنین از آنها استفاده کنید.
اصول اتریبیوت
اتریبیوتها در کد معمولا در جلوی اعلانهای نوع و نوع عضو قرار میگیرند. اتریبیوتها در بین کروشهها باز و بسته (“[“ و “]”) تعریف میشوند. تعریف اتریبیوتها چیزی مانند مثال زیر است:
بخش “Attribute” از نام اتریبیوت اختیاری است. بنابراین مثال زیر نیز همان کار مثال بالا را انجام میدهد:
همانطور که مشاهده میکنید، اتریبیوت فقط با نام اتریبیوت تعریف میشود و در بین کروشه قرار میگیرد. بسیاری از اتریبیوتها دارای لیستهای پارامتر هستند که امکان درج کردن اطلاعات اضافی برای بیشتر سفارشیسازی کردن برنامه را فراهم میکنند. لیست ۱-۱۶ روشهای مختلف استفاده از اتریبیوت ObsoleteAttribute را نشان میدهد.
لیست ۱-۱۶. نحوه استفاده از اتریبیوتها: BasicAttributeDemo.cs
بررسی کد موجود در لیست ۱-۱۶ نشان میدهد که میتوان به روشهای مختلفی از اتریبیوت ObsoleteAttribute استفاده کرد. اولین روش استفاده، در متد ()MyFirstdeprecatedMethode ظاهر شده است و دومین روش استفاده، در متد ()MySecondDeprecatedMethod قرار گرفته است که در کدهای زیر مشاهده میکنید:
تنها تفاوت بین دو اتریبیوت این است که متد ()MySecondDeprecatedMethod در قسمت تعریف اتریبیوت دارای نام “Attribute” است. نتایج هر دو اتریبیوت دقیقا یکسان هستند. اتریبیوتها همچنین میتوانند دارای پارامتر باشند که در تعریف زیر مشاهده میکنید:
این کد، رفتار سفارشیسازی شدهای به اتریبیوت ObsoleteAttribute اضافه میکند که باعث میشود از دیگر تعاریف اتریبیوت ObsoleteAttribute نتایج مختلفی حاصل شوند. نتایج هر سه اتریبیوت ObsoleteAttribute در زیر نمایش داده شدهاند. اینها هشدارهایی هستند که وقتی برنامه کامپایل میشود، توسط کامپایلر #C حذف میشوند:
همانطور که مشاهده میکنید، اتریبیوت ObsoleteAttribute باعث شده است که متد ()MyThirdDeprecatedMethod پیام را حذف کند (پیامی که یکی از پارامترهای اتریبیوت ObsoleteAttribute از متد داخل کد میباشد). اتریبیوتهای دیگر فقط هشدارهای استاندارد را حذف میکنند.
لیست ۱-۱۶ همچنین شامل یک اتریبیوت دیگر به نام STAThereadAttribute نیز میباشد. حتما دیدهاید که این اتریبیوت گاهی در متد ()Main استفاده میشود و بیان میکند که این برنامه #C باید با استفاده از ساختار تک نخی (STA) با کد مدیریت نشده COM ارتباط برقرار کند.
معمولا استفاده از این کد ایمن و بیخطر است، چون شما هیچوقت نمیدانید کتابخانه خارج از سیستمی که از آن استفاده میکنید، چه موقع با COM ارتباط برقرار میکند. قطعه کد زیر، چگونگی استفاده از اتریبیوت STAThreadAttribute را نشان میدهد:
پارامترهای اتریبیوت
گاهی اتریبیوتها دارای پارامترهایی هستند که امکان سفارشیسازی را فراهم میکنند. دو نوع پارامتر وجود دارند که میتوان در اتریبیوتها به کار برد، پارامترهای موقعیتی و اسمی. پارامترهای موقعیتی زمانی استفاده میشوند که ایجاد کننده اتریبیوت بخواهد حتما پارامترها درخواست شوند.
به هر حال، این یک قانون اجباری و حتمی نیست، چون اتریبیوت ObsoleteAttribute دارای یک پارامتر موقعیتی دوم به نام error با نوع bool است که، همانطور که در لیست ۱-۱۶ نشان داده شده است، میتوانیم آن را حذف کنیم. میتوانیم آن اتریبیوت را با پارامتر موقعیتی دوم بنویسیم تا یک ارور کامپایلر اجباری به جای یک هشدار معمولی نمایش داده شود. این عمل در کد زیر پیادهسازی شده است:
تفاوت بین پارامترهای موقعیتی و پارامترهای اسمی این است که پارامترهای اسمی با نام پارامتر مشخص میشوند و همیشه اختیاری هستند. اتریبیوت DllImportAttribute اتریبیوتی است که دارای هر دو پارامترهای موقعیتی و اسمی میباشد (لیست ۲-۱۶).
لیست ۲-۱۶. استفاده از پارامترهای اتریبیوت موقعیت و اسمی: AttributeParamsDemo.cs
اتریبیوت DllImportAttribute در لیست ۲-۱۶ دارای یک پارامتر موقعیتی به نام User32.dll و یک پارامتر اسمی به نام ”EntryPoint=”MessageBoxمیباشد. پارامترهای موقعیتی همیشه قبل از پارامترهای اسمی قرار میگیرند.
اما پارامترهای اسمی میتوانند به هر ترتیبی آورده شوند. این بدان خاطر است که آنها با نام پارامتر نشانهگذاری میشوند، مانند پارامتر اتریبیوت DllImportAttribute، به نام ”EntryPoint=”MessageBox. چون هدف این جلسه، توضیح کلی چگونگی استفاده از اتریبیوتها است، زیاد وارد جزئیات اتریبیوت DllImportAttribute نمیشوم.
بسیاری از اتریبیوتهای دیگری که دارای پارامترهای موقعیتی و اسمی میباشند نیز میتوانند به جای نمونههای گفته شده به کار روند.
اهداف اتریبیوت
اتریبیوتهایی که تا الان نشان داده شدهاند برای متدها به کار رفتند، اما عناصر زیاد دیگری از زبان #C وجود دارند که میتوانید آنها را با اتریبیوتها به کار ببرید. جدول ۱-۱۶ عناصر زبان #C که میتوان برای آنها از اتریبیوت استفاده کرد را نشان میدهد.
هدف اتریبیوت |
قابل پیادهسازی در |
all |
everything |
assembly |
entire assembly |
class |
classes |
constructor |
constructors |
delegate |
delegates |
enum |
enums |
event |
events |
field |
fields |
interface |
interfaces |
method |
methods |
module |
modules (کد کامپایل شدهای که میتواند بخشی از یک اسمبلی باشد) |
parameter |
parameters |
property |
properties |
returnvalue |
return values |
struct |
structures |
هر موقع ابهامی در چگونگی به کار رفتن یک اتریبیوت داشتید، میتوانید هدفی مشخص کنید تا اطمینان یابید که اتریبیوت برای عنصر زبان مناسب به کار رفته است. اتریبیوتی که کمک میکند مطمئن شوید اسمبلیها با مشخصه زبان مرسوم (CLS) تطابق دارد، اتریبیوت CLSCompliantAttribute است.
CLS مجموعهای از استانداردها است که امکان برقراری ارتباط زبانهای NET. مختلف با یکدیگر را فراهم میکند. اهداف اتریبیوت با پسوند نام اتریبیوت همراه با هدف (که اهداف با دونقطه (:) از هم مجزا میشوند) مشخص میشوند.
لیست ۳-۱۶ چگونگی استفاده از اتریبیوت CLSCompliantAttribute و به کار بردن آن برای کل اسمبلی را نمایش میدهد.
لیست ۳-۱۶. استفاده از پارامترهای اتریبیوت موقعیتی و اسمی: AttributeTargetdemo.cs
کد لیست ۳-۱۶ یک هشدار کامپایلر ایجاد میکند و این هشدار به خاطر پارامتر نوع uint تعریف شده در متد ()NonClsCompliantMethod ایجاد میشود.
اگر اتریبیوت CLSCompliantAttribute را به false تغییر دهید یا نوع متد ()NonClsCompliantMethod را به نوع CLS compliant (مثلا int) تغییر دهید، آنگاه برنامه بدون هیچ هشداری کامپایل میشود.
نکته لیست ۳-۱۶ این است که اتریبیوت CLSCompliantAttribute با هدف اتریبیوت “assembly” تعریف شده است. این باعث میشود همه اعضای این اسمبلی با توجه به تنظیمات اتریبیوت CLSCompliantAttribute ارزیابی شوند.
برای محدود کردن دامنه اتریبیوت CLSCompliantAttribute، آن را مستقیما با کلاس AttributeTargetdemo یا متد ()NonClsCompliantMethod به کار ببرید.
خلاصه
اتریبیوتها عناصر زبان #C هستند که عناصر برنامه را با متاداده اضافی (که برنامه را توصیف میکند) تزئین میکنند. این متاداده در جاهای مختلف (مانند رانتایم یا زمان طراحی) برای اهداف مختلف ارزیابی میشوند.
مثالها در این جلسه چگونگی استفاده از اتریبیوت ObsoleteAttribute برای ایجاد هشدارهای زمان کامپایل برای کد بد یا منسوخ را نشان دادند. با به کار بردن اتریبیوت DllImportAttribute، میتوانید چگونگی به کار رفتن پارامترهای موقعیتی و اسمی برای یک اتریبیوت را مشاهده کنید.
اتریبیوتها همچنین با استفاده از یک تعریف کننده هدف، میتوانند برای تزئین انواع مختلف عناصر برنامه استفاده شوند. در یک مثال از اتریبیوت CLSCompliantAttribute برای یک اسمبلی کامل استفاده شد. به هر حال، همچنین میتوان برای محدود کردن دامنه این اتریبیوت، آن را با توصیف کنندههای هدف برای عناصر مختلف برنامه به کار برد.
منبع: C#-Station
جلسه بعد جلسه قبل
آخرین مطالب

دستور UPDATE در SQL Server برای تغییر دادههای موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفادهای ندارد را حذف کنید. برای ...

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...
دیدگاه خود را درباره این پست بنویسید