ترویج آرگومان
یکی از ویژگی های مهم تعریف متد ها، اعمال فشار آرگومان هاست (یعنی مجبور کردن آرگومان ها به نوعی خاص برای ارسال به یک متد). این فرایند معمولا تبدیل ضمنی گفته می شود که در آن یک کپی از مقدار متغیر بدون تبدیل نوع صحیح، به نوعی متفاوت تبدیل می شود.
چنین تبدیلاتی نیز می تواند با کلاس convert در فضای نام System انجام شوند
.c# از تبدیلات عریض و باریک پشتیبانی می کند.تبدیل عریض هنگامی رخ می دهد که یک نوع به سایر انواع تبدیل شود( معمولا انواعی که می توانند داده های بیشتری را نگهداری کنند) بدون اینکه داده ای از بین برود و تبدیل باریک هنگامی روی می دهد که داده ممکن است در طی تبدیل ازبین برود( معمولا به انواعی که داده کوچک تری را نگهداری میکنند). جدول زیر تبدیلات ضمنی مجاز را نمایش می دهد.
|
می توانند به نوع (یا انواع) تبدیل شوند |
type |
|
Object |
Bool |
|
Decimal, double, float, int, uint, long, ulong, object, short or ushort |
Byte |
|
Decimal, double, float, int, long, object or short |
Sbyte |
|
Decimal, double, float, int, uint, long, ulong, object or ushort |
Char |
|
Object |
Decimal |
|
Object |
Double |
|
Double or object |
Float |
|
Decimal, double, float, long or object |
Int |
|
Decimal, double, float, long, ulong, or object |
Uint |
|
Decimal, double, float or object |
Long |
|
Decimal, double, float or object |
Ulong |
|
Decimal, double, float, int, long or object |
Short |
|
Decimal, double, float, int, uint, long, ulong or object |
Ushort |
مثلا متد sqrt کلاس Math می تواند با یک آرگومان صحیح فراخوانی شود، حتی اگر این متد در کلاس Math تعریف شده باشد تا یک آرگومان double را بگیرد. عبارت:
Console.WriteLine( Math.Sqrt(4));
Math.Sqrt(4) را به طور صریح ارزیابی کرده و مقدار 2 را نمایش می دهد. C# به طور ضمنی مقدار 4 از نوع int را به مقدار 4.0 از نوع double تبدیل می کند، پیش از اینکه آن مقدار را به Math.Sqrt ارسال کند.در برخی موارد، c# تبدیلات ضمنی را برای مقادیر آرگومانی اعمال میکند که به طور دقیق با انواع پارامتر در تعریف متد متناظر نباشند.در برخی موارد، تلاش برای این تبدیلات منجر به خطاهای کامپایلری می شود.زیرا c# ار قوانین تبدیل ضمنی برای تعیین زمان روی دادن یک تبدیل عریض استفاده می کند. در مثال Math.Sqrt قبل، C# یک int را بدون تغییر مقدار آن به double تبدیل کرد.به هر حال، تبدیل یک double به یک int، بخش عملیاتی مقدار double را قطع می کند.تبدیل انواع صحیح بزرگ به انواع صحیح کوچک نیز می تواند مقادیر را تغییر دهد.چنین تبدیلات باریکی ممکن است داده ها را تغییر دهند.
بنابراین، c# تبدیلات باریک را بدون یک عمل تبدیل صرح مجاز نمی داند.
قوانین تبدیل برای عباراتی به کار می روند که حاوی مقادیری از دو یا چند نوع داده باشند. و برای مقادیر نوع داده اصلی به عنوان آرگومان هایی برای متد ها می باشند. C# نوع هر مقدار در یک عبارت مرکب را به بالاترین نوع در عبارت تبدیل می کند. C# یک کپی کمکی از هر مقدار را ایجاد کرده و آن را در عبارت استفاده می کند.یک نوع آرگومان می تواند به هر نوع بالاتری ارتقا یابد.
تبدیل مقادیر به انواع کوچک تر ممکن است باعث از بین رفتن داده ها بشود. در مواردی که اطلاعات ممکن است در طی تبدیل از بین بروند، کامپایلر نیاز دارد که برنامه نویس از تبدیل برای اعمال فشار جهت روی دادن تبدیل استفاده کند.برای احضار متد square که یک پارامتر صحیح با متغیر y از نوع double می گیرد. فراخوانی متد به صورت زیر نوشته می شود:
Int result= Square((int)y);
این عبارت به طور صریح یک کپی از مقدار y را به یک عدد صحیح برای استفاده در متد square تبدیل می کند. بنابراین، اگر مقدار y برابر 4.5 باشد، متد Square، 16 را برمی گرداند و نه 20.25 را.
توجه: هنگامی که یک تبدیل باریک را انجام می دهید (مثل double به int ) ، تبدیل مقدار یک نوع داده اصلی به نوع داده اصلی دیگر ممکن است باعث از بین رفتن داده ها شود.
اما چه رنجی است لذت ها را تنها بردن و چه زشت است زیبایی ها را تنها دیدن و چه بدبختی آزاردهنده ای است تنها خوشبخت بودن! در بهشت تنها بودن سخت تر از کویر است.
( دکتر علی شریعتی )

مطالب جالب و مفیدی هستند.
در ضمن با توجه به فیلتر شدن وردپرس بهتره مطالبت را از اینجا نجات بدی و به جای دیگری منتقل کنی.
اگر در زمینه انتقال سوال داشتی میتونم کمک کنم.
موفق باشی.
دیدگاه توسط حمید — آوریل 27, 2011 @ 4:07 ب.ظ. |