User-Defined Conversions تبدیل تعریف شده توسط کاربر

یکی از امکانات جالب سی شارپ ، تعریف تبدیلات ضمنی و صریح implicit and explicit ، برای کلاسها و ساختارها مورد نیاز ، توسط کاربر است . به عبارت دیگر کاربر می تواند بر حسب نیاز خود تبدیلاتی را تعریف کند .در واقع ما می خواهیم امکانی به کلاس ما تعریف کنیم که در برخی مواقع بتوانیم در آن کلاس بر حسب نیاز خودمان برخی داده ها را تبدیل کنیم .

نحوه این کار دارای ساختار زیر است .نحوه تعریف تبدیل implicit and explicit یکسان است فقط با کلمه implicit and explicit متمایز می شوند .

علاوه بر آن سطح دسترسی public  و static  باید باشد .

به ساختار زیر دقت کنید .



1-required  : همانطور که در بالا اشاره شد این بخش باید public static  باشد

2-کلمه کلیدی implicit and explicit ، به اضافه operator  فرقی نمی کند تبدیل ما صریح باشد یا ضمنی

3-  target  : قرار است که تبدیل هدف ما چه باشد ، یعنی نوع مورد نظر ما را همان target  تبدیل خواهد شد .

4-source  :   در واقع منبع تبدیل است ، یعنی قرار است چه داده ای تبدیل شود .

5- return ObjectOfTargetType: مقداری که باید برگردد ، یا همان مقدار برگشتی که باید از نوع همان داده مشخص شده در target  باشد.

 

اکنون به مثال زیر دقت کنید که چگونه متغیری از نوع person  به نوع عددی تبدیل می شود .



محدودیتهای تبدیل تعریف شده توسط کاربر

 

در تعریف تبدیلات تعریف شده توسط کاربر چند محدودیت وجود دارد که باید به آن توجه کنید .

1-تبدیل تعریف شده توسط کاربر فقط برای کلاسها و ساختارها کاربر دارد.به عبارتی حتما درون کلاس یا ساختار تعریف می شوند .

2-شما نمی توانید این قانون را برای تبدیلات استاندارد اعمال کنید مثلا در مقاله قبل ذکر کردیم که برخی تبدیلات را براحتی می توان تبدیل کرد پس نیازی به تعریف تبدیل خاص نیست .

3-پنج حالت زیر در مورد تبدیلات باید رعایت شود فرض کنیم s  یک منبع تبدیل یا همان source type  و T  یک نوع هدف target type متفاوت باشند

 

 *-S  و T  باید از دو نوع متفاوت باشند.

*- S  و T  نباید هیچ رابطه وراثت باهم داشته باشند .

*-S  و یا T  نباید اینترفیسی از یک object  دیگر باشند .

 

به مثال زیر دقت کنید .



یک کلاس person  داریم که در این کلاس 2 تبدیل تعریف شده داریم ، در تبدیل اول هر گاه پارامتر ما از نوع کلاس person  باشد به متغیر عددی تبدیل می شود

اما در تبدیل دوم پارامتر عددی به نوع کلاس person  تبدیل می شود .

حال که ساختار کلاس بالا و تبدیلات آن را فهمیدم به کدهای زیر دقت کنید .




به قسمت مشخص شده در کادر قرمز رنگ دقت کنید در اینجا تبدیل ما از یک شی person  به یک شی عددی خواهد بود خروجی زیر را خواهیم داشت

 

Person Info: bill, 25

چرا ؟ چون ما مشخص کردیم که هر وقت شی person  به خواهد به مقدار عددی تبدیل شود پارامتر p.Age  ارسال شود .

 

 حالت دوم مشخص شده در کادر سبز رنگ ما یک متغیر عددی را به یک کلاس از نوع person  تبدیل می کنیم و خروجی ما بصورت زیر است .

 

Person Info: Nemo, 35