تبلیغات
میهن وب هاست

آموزش سی شارپ – عملگرهای سربار

نویسنده : امیر

نظرات : ۰ دیدگاه

بازدید : ۱۸۶ بازدید

تاریخ : ۰۱ اسفند ۱۳۹۶

یکی از موارد جالبی که در کمتر زبان های برنامه نویسی دیده می شود بحث overload عملگرها می باشد که در سی شارپ به صورت کامل بحث شده است.

 

حتما قبل از بررسی عملگرهای سربار در سی شارپ نوشته ی مطالب قبلی این دوره ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.

 

overload کردن عملگرهای رابطه‌ای :

به‌طور معمول، یک عملگر رابطه‌ای overload شده، مقدار true یا false را return می‌کند. نکته‌ی مهم دیگر این‌جاست که بایستی relational operators را به‌طور جفتی overload کنید. به‌عنوان مثال اگر > را overload کردید، بایستی < را نیز overload کنید. این مورد برای operator های (<= و >=) و (== و !=) نیز صادق است.

نکته‌ : اگر می‌خواهید operatorهای == و =! را overload کنید، بایستی متدهای ()Object.Equels و ()Object.GetHashCode را نیز override کنید.

 

overload کردن True و False :

کلمات کلیدی true و false نیز می‌توانند به‌عنوان unary operators به‌منظور overload کردن مورد استفاده قرار گیرند. هنگامی‌که true و false برای یک کلاس overload می‌شوند، می‌توانید از اشیای آن کلاس برای کنترل کردن if، for، while و do-while و همچنین ? استفاده کنید. Operatorهای true و false باید باهم overload شوند و نمی‌توانید فقط یکی از آن‌ها را overload کنید. هر دوی آن‌ها unary operator هستند؛

فرم کلی آن‌ها به‌صورت زیر است:

مثال : اگر یکی از فیلدها غیر صفر باشد، شیء true است و اگر همه‌ی فیلدها صفر باشند، شیء false است.

 

overload کردن عملگرهای منطقی :

فقط & و | و ! می‌توانند overload شوند، اما با دنبال کردن یک سری قوانین می‌توانید از مزیت‌های && و || بهره ببرید؛ اگر قصد استفاده از عملگرهای منطقی short-circuit را نداشته باشید، می‌توانید بسیار ساده & و | را overload کنید که هر کدام از آن‌ها یک مقدار bool را return می‌کند. overload کردن ! نیز مقدار bool را return می‌کند.

 

 

معرفی Conversion Operators :

Conversion operator‌ یک شیء از کلاس شما را به نوع دیگری که مد نظرتان است تبدیل می‌کند. دو حالت از conversion operator موجود است: implicit و explicit که فرم کلی آن‌ها به شکل زیر است:

target-type مشخص کننده‌ی نوعی است که قصد دارید source-type را به آن تبدیل کنید و value مقدار کلاس، بعد از تبدیل است. Conversion operator اطلاعات را مطابق با target-type باز می‌گرداند . اگر conversion operator به‌طور implicit مشخص شود، conversion به‌صورت اتوماتیک انجام خواهد شد. اگر conversion به‌صورت explicit تعریف شده باشد، cast مورد نیاز است. نمی‌توانید برای یک source-type و target-type هم implicit و explicit را تعریف کنید.

مثال :

نکته :

  • محدودیت‌هایی که در conversion operators وجود دارد:
  • Target-type یا source-type در conversion بایستی از جنس همان کلاسی باشد که conversion در آن تعریف شده است. برای مثال نمی‌توانید تبدیل double‌ به int را از نو تعریف کنید.
  • نمی‌توانید class type را به نوع داده‌ی object تبدیل کنید.
  • نمی‌توانید برای یک source-type و target-type هم تبدیل implicit و هم تبدیل explicit تعریف کنید.
  • نمی‌توانید از یک base class به یک derived class تبدیل انجام دهید.
  • نمی‌توانید برای یک class-type به/از interface تبدیل انجام دهید
  • علاوه‌بر این قوانین، برای انتخاب بین implicit یا explicit باید دقت کنید. implicit conversion باید زمانی مورد استفاده قرار گیرد که تبدیل کاملاً عاری از خطا باشد. برای کسب اطمینان در این مورد از
  • این دو قانون پیروی کنید: یک، هیچ فقدان اطلاعاتی (مثل کوتاه‌سازی، سرریز، تغییر علامت و…) نباید رخ دهد. دو، تبدیل نباید باعث بروز exception یا خطا در برنامه شود. اگر conversion نتواند این
  • دو قانون را رعایت کند، باید از explicit conversion بهره ببرید.

 

معرفی Indexersها :

index گذاری آرایه از طریق اپراتور [ ] انجام می‌شود. تعریف کردن اپراتور [ ] برای کلاس نیز امکان‌پذیر است اما برای این منظور از operator method‌ استفاده نکرده و در عوض از Indexer استفاده می‌کنیم. Indexer اجازه می‌دهد یک شیء مانند یک آرایه index گذاری شود. Indexerها می‌توانند یک یا بیشتر از یک بعد داشته باشند.

فرم کلی Indexer یک بعدی به‌شکل زیر است:

در این‌جا، element-type مشخص کننده‌ی نوع عنصر indexer است. پارامتر index در واقع index عنصری که می‌خواهید به آن دسترسی داشته باشید را مشخص می‌کند. توجه کنید که نیازی نیست حتماْ جنس پارامتر int‌ باشد اما استفاده از int در این مورد رایج است. درون بدنه‌ی indexer کلمه‌های get و set را مشاهده می‌کنید که به هر کدام از آن‌ها accessor گفته می‌شود. یک accessor‌ مشابه یک متد است با این تفاوت که return-type و parameter ندارد. هنگامی‌که از indexer استفاده می‌کنید این accessor ها به‌طور اتوماتیک فراخوانی می‌شوند و هر دوی accessorها index را به‌عنوان پارامتر دریافت می‌کنند اگر indexer در طرف چپ تساوی قرار گرفته باشد، set accessor فراخوانی شده و یک مقدار به عنصری که توسط index مشخص شده است، اختصاص داده می‌شود. در غیر این‌صورت get accessor فراخوانی شده و عنصر مشخص شده توسط index، return می‌شود. Set method‌ یک پارامتر به اسم value دارد که شامل مقداری است که به یک index مشخص اختصاص داده می‌شود.

مثال :

مثال : برای اینکه این بحث به طور کامل واضح شود در مثال زیر روی get و set کنترل بیشتری اعمال کرده‌ایم:

یک کلاس این قابلیت را اضافه کنید تا به‌شکل آرایه نیز بتوان از آن استفاده کرد.به مثال زیر توجه کنید:

دو محدودیت دیگر برای Indexerها موجود است. یک، به‌دلیل این‌که indexerها درواقع storage location (محل ذخیره سازی) تعریف نمی‌کنند و به نوعی متد هستند، استفاده از آن‌ها به‌عنوان پارامتر ref و out غیرمجاز است. دو، indexer نمی‌تواند به‌صورت static تعریف شود.

 

Properties در سی شارپ :

Property یکی دیگر از اعضای کلاس است. برای این‌که با اساس کار Properties آشنا شوید به مثال ساده‌ی زیر توجه کنید:

کاری که Property انجام می‌دهد : کنترل دسترسی و مقداردهی به فیلد می باشد . Property مانند Indexer از get accessor و set accessor استفاده می‌کند تا مقداری را در یک متغیر set و یا مقداری را از آن get کند.

فرم کلی یک property به‌شکل زیر است:

مثال :

 

معرفی Auto-Implemented Properties :

می توان propertyهای خیلی ساده را تعریف کرد که دیگر نیازی به متغیر ندارند تا property روی آن‌ها مدیریت داشته باشد. در عوض شما به کامپایلر اجازه می‌دهید که یک متغیر (underlying variable) برای این مورد به‌وجود آورد.

فرم کلی auto-implemented property به‌شکل زیر است:

در این‌جا، type مشخص‌‌کننده‌ی نوع و name مشخص‌کننده‌ ی نام property است. توجه کنید که get و set بدنه ندارند و مستقیماً بعد از آن‌ها semicolon قرار می‌گیرد. این syntax به کامپایلر می‌فهماند که باید یک storage location (که به آن backing field هم گفته می‌شود) برای نگه‌داری مقدار مورد نظر بسازد. این متغیر (backing field) دارای اسم نبوده و مستقیماً برای شما قابل دسترس نیست و تنها می‌توانید از طریق property به آن دسترسی داشته باشید.

همان‌طور که می‌بینید، به‌جای تعریف متغیر مستقیماً property تعریف کرده‌ایم. از آن‌جا که propertyهای تعریف شده public بوده و دارای getter و setter هستند، می‌توانید مقادیر را get و set کنید. بر خلاف propertyهای معمولی ، auto-implemented properties نمی‌توانند read-only یا write-only باشند و همیشه get و set باید تعریف شوند. با این‌که auto- implemented properties روش جالب و راحتی است، تنها زمانی باید از آن استفاده کنید که نیازی به کنترل کردن backing field نداشته باشید.

به‌طور پیش‌فرض، دسترسی به get و set بر اساس دسترسی خود properties (یا indexer) است. به‌عنوان مثال اگر property را به‌صورت public تعریف کنید، get و set نیز public هستند. با این حال می‌توانید برای get و set دسترسی جداگانه (مثلاً private) در نظر بگیرید.

به مثال زیر توجه کنید:

در این مثال، ID در کلاس خودش هم می‌تواند get و هم می‌تواند set شود اما خارج از کلاس فقط قابل get شدن است. همان‌طور که ذکر شد auto-implemented property نمی‌تواند read-only یا write-only باشد (نمی‌تواند فقط get یا set داشته باشد) اما با در نظر گرفتن get یا set به‌صورت private می‌توانید دسترسی را محدود کنید.

 

مبحث Recursion :

یک متد می‌تواند خودش را فراخوانی کند (درون خودش، خودش را صدا بزند)، به این پروسه recursion گفته می‌شود و متدی که خودش را صدا زده، recursive است. در مثال زیر محاسبه‌ی factorial را با روش recursive (بازگشتی) و nonrecursive (غیربازگشتی) می‌بینید:

 

خب این جلسه هم به پایان رسید باید به این نکته توجه کنید که مباحث بالا در برنامه نویسی تجاری اهمیت فراوانی دارد.

برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.

منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.

موفق و پیروز باشید.

با دوستانتان به اشتراک بگذارید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

code

مطالب زیر را از دست ندهید: