نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

تبدیل نوع ضمنی C#. تبدیل های نزولی

بیایید به سراغ مثال ها برویم. کلاس آزمایش کردن, حاوی مثال‌ها، مجموعه‌ای از داده‌ها از انواع مختلف است که عملیاتی را انجام می‌دهند که تبدیل نوع را نشان می‌دهد. اینم توضیحات کلاس

تست: با استفاده از سیستم.
فضای نام TypesProject
{
تست کلاس عمومی{
/// < خلاصه>
/// مجموعه ای از فیلدهای اسکالر از انواع مختلف.
///
بایت خصوصی ب= 255;
خصوصی int x= 11 ;
واحد خصوصی ux= 1111 ;
شناور خصوصی y= 5.5f;
دوگانه خصوصی= 5.55;
رشته خصوصی s= "سلام!"؛
رشته خصوصی si= "25";
شی خصوصی obj= شیء جدید ();
// بعدی متدهای کلاس هستند که در طول مسیر ارائه می شوند
// توضیحات نمونه
}
}

مجموعه داده کلاس شامل داده های اسکالر است نوع حسابیمتغیرهای مرتبط با ارزش نوع رشتهو تایپ کنید هدف - شی, متعلق به انواع مرجع بسته را در نظر بگیرید (خصوصی) متد این کلاس یک رویه است WhosWhoبا استدلال کلاسی رسمی هدف - شی. رویه نام آرگومان ارسال شده به آن، نوع و مقدار آن را در کنسول چاپ می کند.

اینم متنش:

/// < خلاصه>
/// این روش اطلاعات مربوط به نوع را در کنسول چاپ می کند و
/// مقدار آرگومان واقعی. رسمی
/// آرگومان از نوع استهدف - شی. استدلال واقعی
/// می تواند از هر نوع باشد، از همیشه
/// تبدیل ضمنی به نوع مجاز استهدف - شی.
///
/// نامدومینبحث و جدل
/// اعتراف کنیمبحث و جدلهرنوع
خلأ خصوصی WhoIsWho (نام رشته، شیء هر){
Console.WriteLine ("نوع{0} است (1), ارزش است{2}",
نام، any.GetType ()، any.ToString ());
}

اینجا باز است (عمومی) روش کلاس آزمایش کردن, که در آن متد به طور مکرر فراخوانی می شود WhosWhoبا آرگومان های مختلف:

/// < خلاصه>
/// اطلاعاتی در مورد نوع و مقدار دریافت کنید
/// از آرگومان تصویب شده - متغیر یا عبارت
/// خلاصه>
عمومی void WhoTest (){
WholsWho ("x"، x);
WholsWho ("ux"، ux)؛
WhoIsWho ("y"، y);
WhoIsWho ("dy"، dy);
WhoIsWho ("s"، s);
WhoIsWho ("11+ 5.55 + 5.5f "، 11+ 5.55 + 5.5f)؛
obj= 11 + 5.55 + 5.5f;
WhoIsWho(" obj", obj);
}

توجه داشته باشید که نهاد هر- استدلال کلاس رسمی هدف - شی, که در هر فراخوانی به صورت پویا نوع را با ارتباط با شی داده شده توسط آرگومان واقعی تغییر می دهد. بنابراین، نوع آرگومان گزارش شده به کنسول، نوع آرگومان واقعی است. همچنین توجه داشته باشید که کلاسی که از کلاس به ارث برده شده است هدف - شیروش Gettypeنوع FCL را برمی گرداند، یعنی نوعی که نشان دهنده نوع زبان و واقعی بودن آن است کار در حال انجامهنگام اجرای ماژول در اکثر فراخوانی ها، آرگومان واقعی یک متغیر است - ویژگی مربوط به کلاس آزمایش کردن, اما در یک مورد، یک عبارت حسابی معمولی ارسال می شود که به طور خودکار به یک شی تبدیل می شود. وضعیت مشابهی هنگام انجام یک تکلیف در رویه مورد بررسی اتفاق می افتد.

در شکل 11 خروجی کنسول را هنگام فراخوانی متد نشان می دهد WhoTestدر روش فوق اصلیکلاس کلاسی.

شکل 11. چاپ نتایج آزمون WhoTest

تبدیل نوع کجا، چگونه و چه زمانی انجام می شود؟

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

اگر هنگام ارزیابی یک عبارت، عملوندهای یک عملیات دارای انواع مختلفی باشند، لازم است آنها را به یک نوع ریخته کنیم. چنین نیازی نیز زمانی به وجود می آید که عملوندها از یک نوع باشند، اما با نوع عملیات ناسازگار باشد. به عنوان مثال، هنگام اجرای جمع، عملوندهای نوع بایتباید برای تایپ ریخته گری شود بین المللی, از آنجایی که اضافه بر روی بایت تعریف نشده است. هنگام انجام یک تکلیف ایکس= هنوع منبع هو نوع هدف ایکسباید سازگار باشد به همین ترتیب، هنگام فراخوانی یک متد، نوع منبع و هدف آرگومان های واقعی و رسمی نیز باید سازگار باشند.

تبدیل نوع مرجع

از آنجایی که عملیات روی انواع مرجع تعریف نشده است (استثنا رشته ها هستند، اما عملیات روی آنها، از جمله تخصیص، مانند انواع مقادیر انجام می شود)، نیاز به آنها فقط در هنگام تخصیص و فراخوانی متدها ایجاد می شود.

تبدیل ها را در عبارات تایپ کنید

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

تبدیل‌های صریح تبدیل‌های قانونی هستند که تضمینی برای موفقیت ندارند یا ممکن است منجر به از دست دادن دقت شوند. چنین تبدیل های بالقوه خطرناکی باید به صراحت توسط برنامه نویس مشخص شود. تبدیل از نوع بین المللیدر نوع بایتبه صریح اشاره دارد زیرا ناامن است و می تواند منجر به از دست دادن ارقام قابل توجه شود. توجه داشته باشید که همه انواع دارای تبدیل صریح نیستند. در این مورد، مکانیسم های تبدیل نوع دیگری مورد نیاز است که بعداً مورد بحث قرار خواهد گرفت.

تبدیل در یک نوع حسابی

نوع حسابی، همانطور که در جدول نوع داده نشان داده شده است، به 11 زیرگروه تقسیم می شود. در شکل شکل 12 نموداری از تبدیل ها را در یک نوع حسابی نشان می دهد.

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

نمودار نشان داده شده در شکل به شما امکان می دهد به تعدادی از سوالات مهم مربوط به وجود تبدیل بین انواع پاسخ دهید. اگر نمودار یک مسیر (فلش) را از نوع A به نوع B نشان دهد، این به معنای وجود یک تبدیل ضمنی از نوع A به نوع B است. همه تبدیل‌های دیگر بین انواع فرعی از نوع حسابی وجود دارند، اما صریح هستند. توجه داشته باشید که هیچ چرخه ای در نمودار وجود ندارد، همه فلش ها یک طرفه هستند، بنابراین تبدیل معکوس به ضمنی همیشه باید به طور صریح مشخص شود.

مسیر نشان داده شده در نمودار می تواند بسیار طولانی باشد، اما این بدان معنا نیست که کل دنباله تبدیل ها در این مسیر... وجود یک مسیر تنها نشان دهنده وجود یک تبدیل ضمنی است و خود تبدیل تنها یک بار از منبع نوع A به نوع مقصد B انجام می شود.

گاهی اوقات موقعیتی پیش می آید که در آن برای یک نوع منبع چندین نوع مقصد می تواند به طور همزمان وجود داشته باشد و لازم است یک هدف - نوع مقصد انتخاب شود. چنین مشکلات انتخابی برای مثال هنگام کار با متدهای بارگذاری شده در کلاس ها به وجود می آیند.

قانون انتخاب یک پیاده سازی هنگام فراخوانی یک متد به شرح زیر است: پیاده سازی انتخاب می شود که مسیر تبدیل مشخص شده در نمودار برای آن کوتاه تر باشد. اگر تطابق دقیق پارامترها بر اساس نوع (مسیر طول 0) وجود داشته باشد، البته این پیاده سازی انتخاب خواهد شد.

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

/// < خلاصه>
/// گروهی از متدهای بارگذاری شدهبارگیری
/// با یک یا دو آرگومان نوع حسابی.
/// اگر آرگومان واقعی یکی باشد، یکی از
/// متدهایی که بیشترین تطابق را با نوع آرگومان دارند.
/// هنگام فراخوانی متدی با دو آرگومان، این امکان وجود دارد
/// تعارض در انتخاب روش مناسب، در نتیجه
/// به یک خطای زمان کامپایل.
///
Private void OLoad (float par){
Console.WriteLine ("مقدار شناور{0}", همتراز)؛
}
/// < خلاصه>
/// روش اضافه باربارگیریبا یک پارامتر نوعطولانی
///
///
خلا خصوصی OLAd (طولان برابر){
Console.WriteLine ("مقدار طولانی (0)"، par);
}
/// < خلاصه>
/// روش اضافه بارOnLoadبا یک پارامتر نوعطولانی
///
///
Private void OLAd (طول همتراز){
Console.WriteLine ("مقدار طولانی (0)"، par);
}
/// < خلاصه>
/// روش اضافه باربارگیریبا یک پارامتر نوعدو برابر
///
///
Private void OnLoad (دو برابر){
Console.WriteLine ("مقدار دوگانه (0)"، par);
}
/// < خلاصه>
/// روش اضافه باربارگیریبا دو پارامتر مانندطولانیوطولانی
///
///
///
Private void OLoad (long par1، long par2){
Console.WriteLine ("long par1{0}, طولانی par2{1}", par1، par2)؛
}
/// < خلاصه>
/// روش اضافه باربارگیریبا دو پارامتر مانند
/// دو برابرودو برابر
///
///
///
Private void OLAd (دو برابر 1، دو برابر 2){
Console.WriteLine ("double par1{0}, دو برابر 2{1}", par1، par2)؛
}
/// < خلاصه>
/// روش اضافه باربارگیریبا دو پارامتر مانند
/// بین المللیوشناور
///
///
///
Private void OLoad (int par1، float par2){
Console.WriteLine ("int par1{0}, float par2{1}", par1، par2)؛
}

همه این روش ها به اندازه کافی ساده هستند. آنها اطلاعاتی در مورد نوع و ارزش آرگومان های ارسال شده ارائه می دهند.

در اینجا یک روش تست است که متد را فراخوانی می کند بارگیریبا تعداد و انواع مختلف آرگومان ها:

/// < خلاصه>
/// فراخوانی یک متد اضافه باربارگیری. بسته به
/// نوع و تعداد آرگومان ها یکی از متدهای گروه فراخوانی می شود.
///
عمومی void OLoadTest (){
OLload (x)؛
OLoad (ux)؛
OLoad (y)؛
OLoad (dy)؛
// OLoad (x، ux)؛
// درگیری: (int، شناور)و(طولانی، طولانی)
OLoad (x, (شناور) ux)؛
OLoad (y، dy)؛
بارگیری(ایکس, دو);
}

توجه داشته باشید که یکی از تماس ها نظر داده می شود زیرا منجر به درگیری در مرحله ترجمه می شود. برای حذف تضاد هنگام فراخوانی متد، باید تبدیل صریح آرگومان را مشخص می‌کردیم که در خط بعد از خط نظر نشان داده می‌شود. نتیجه آزمایش OLoadTestدر شکل نشان داده شده است. سیزده.

شکل 13. چاپ نتایج OLoadTest

تبدیل های صریح

همانطور که قبلا ذکر شد، تبدیل های صریح می توانند به دلیل از دست دادن دقت خطرناک باشند. بنابراین، آنها به دستور برنامه نویس اجرا می شوند - او تمام مسئولیت نتایج را بر عهده دارد.

تبدیل رشته ها

یک کلاس مهم از تبدیل ها تبدیل به رشته و بالعکس است. تبدیل به یک نوع رشته همیشه تعریف می شود، زیرا همه انواع از نوادگان کلاس پایه هستند هدف - شی, و بنابراین، روش را داشته باشید ToString(). اجرای مناسب این روش برای انواع توکار تعریف شده است. به طور خاص، برای تمام زیرگروه های نوع حسابی، روش ToString() رشته ای را که مقدار حسابی مربوطه را مشخص می کند به شکل مناسب برمی گرداند. توجه داشته باشید، روش ToStringرا می توان به طور صریح فراخوانی کرد، اما اگر یک فراخوانی صریح مشخص نشده باشد، هر زمان که زمینه نیاز به تبدیل به یک نوع رشته داشته باشد، به طور ضمنی فراخوانی می شود. در اینجا یک مثال مرتبط آورده شده است:

/// < خلاصه>
/// نمایش تبدیل داده ها از انواع مختلف به رشته.
///
عمومی void ToStringTest ()
{
س= " ولادیمیرپتروف ";
s1= " سن: ";
ux= 27;
س= س+ s1+ ux.ToString ();
s1= " حقوق: ";
دو= 2700.50;
س= س+ s1+ dy;
WhoIsWho(" س", س);
}

نتیجه این روش در شکل نشان داده شده است. 14.

شکل 14. چاپ نتایج ToStringTest

تبدیل از نوع رشته به انواع دیگر، مانند حساب، باید به صراحت انجام شود. اما هیچ تبدیل صریحی بین حساب و رشته وجود ندارد. مکانیسم های دیگری مورد نیاز است، و آنها در C # موجود هستند. برای این منظور می توانید از متدهای کلاس مربوطه استفاده کنید تبدیلکتابخانه FCL در فضای نام تعبیه شده است سیستم. بیایید مثالی بزنیم:

/// < خلاصه>
/// نمایش تبدیل یک رشته به داده از انواع مختلف.
///
خالی عمومی FromStringTest (){
س= " واردسن ";
Console.WriteLine (های)؛
s1= Console.ReadLine ();
ux= Convert.ToUInt32 (s1);
WhoIsWho("سن: "،ux);
س= "حقوق را وارد کنید";
Console.WriteLine (های)؛
s1= Console.ReadLine ();
دو= Convert.ToDouble (s1);
کیست کی ("حقوق: ", dy)؛
}

این مثال ورودی داده از کنسول را نشان می دهد انواع مختلف... داده ها از کنسول با روش خوانده می شوند ReadLineیا خواندن, همیشه یک رشته را نشان می دهد که سپس باید به نوع مورد نظر تبدیل شود. برای این کار، متدهای کلاس مربوطه فراخوانی می شوند. تبدیل. طبیعتاً، برای موفقیت در تبدیل، رشته باید دارای مقداری در قالبی باشد که امکان چنین تبدیلی را فراهم کند. به عنوان مثال توجه داشته باشید که هنگام نوشتن مقدار یک عدد، برای برجسته کردن قسمت کسری باید از کاما استفاده شود، نه نقطه. در غیر این صورت یک خطای زمان اجرا رخ خواهد داد.

در شکل 15 نتایج خروجی و ورودی از کنسول را هنگام اجرای این رویه نشان می دهد.

شکل 15. چاپ نتایج FromStringTest

تبدیل نوع داده ضمنی توسط کامپایلر C ++ انجام می شود، در حالی که تبدیل نوع داده صریح توسط خود برنامه نویس انجام می شود. در مورد تبدیل نوع داده من به شرح زیر خواهم گفت: "نتیجه هر محاسبه به دقیق ترین نوع داده از آن دسته از انواع داده هایی که در محاسبه دخیل هستند تبدیل می شود." برای مثال گویامن یک جدول با تبدیل نوع داده ارائه خواهم کرد. بیایید به عملیات تقسیم در جدول نگاه کنیم. ما به عنوان یک نوع داده عدد صحیح می گیریم بین المللیخوب، ما یک نوع داده واقعی خواهیم داشت شناور.

جدول 1 - تبدیل نوع داده صریح و ضمنی در C ++
ایکس y نتیجه تقسیم مثال
سود سهام تقسیم کننده خصوصی x = 15 y = 2
بین المللی بین المللی بین المللی 15/2=7
بین المللی شناور شناور 15/2=7.5
شناور بین المللی شناور 15/2=7.5

جدول نشان می دهد که با تغییر متغیرها در مکان های مختلف، نتیجه یکسان می ماند (در مورد ما، این تقسیم کننده و تقسیم کننده است). همه چیز در مورد تبدیل نوع داده ضمنی است. در مورد تبدیل صریح، برای انجام برخی دستکاری ها، در نتیجه تغییر نتیجه محاسبه ضروری است. ساده ترین راه برای تبدیل صریح انواع داده ها، به عنوان مثال: فرض کنید باید چنین اعدادی را به 15 و 2 تقسیم کنیم، تقسیم می کنیم! 15/2 = 7. نتیجه مانند جدول است. اما اگر با این تقسیم تبدیلات جزئی انجام دهید، به عنوان مثال: 15.0 / 2 = 7.5، عدد 15 واقعی است، نتیجه واقعی خواهد بود. خود عدد 15 از نظر ریاضیات تغییر نکرده است، زیرا 15 = 15.0 است. همین تکنیک را می‌توان برای دو به کار برد، نتیجه یکسان خواهد بود، اما می‌توان آن را همزمان روی دو عدد اعمال کرد، اما چرا، اگر یکی از این دو کافی است.

روش دیگری برای تبدیل صریح انواع داده ها:

Float (15) / 2 // نتیجه 7.5 است، عدد 15 به نوع داده واقعی float تبدیل می شود. دو برابر (15) / 2 // نتیجه 7.5 است - یکسان !!!

C ++ نیز فراهم می کند عملیات یکنواختنوع بازیگران:

Static_cast(/ * متغیر یا عدد * /)

مثال: static_cast (15) / 2 نتیجه 7.5 است
مثال با یک متغیر:

Int ret = 15; static_cast (ret) / 2 // نتیجه 7.5 است

در مورد یک متغیر، باید بدانید که در خط 2، متغیر ret به نوع داده float تبدیل نمی شود، بلکه فقط یک کپی موقت از متغیر ret با نوع داده float ایجاد می شود. بیایید در عمل تمام روش های تبدیل صریح و ضمنی انواع داده ها را در نظر بگیریم.

// pryeobrazovanie.cpp: نقطه ورودی برنامه کنسول را تعریف می کند. #include "stdafx.h" #include #عبارتند از با استفاده از namespace std. int _tmain (int argc, _TCHAR * argv) (int int_value15 = 15, int_value2 = 2؛ // دو متغیر را اعلام کنید از نوع int float float_value15 = 15، float_value2 = 2; // دو متغیر را اعلام کنید شناورکوت<< fixed << setprecision(2) // определяем, при выводе чисел с плавающей точкой, два знака после запятой << "15 / 2 = " << int_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << int_value15 / float_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / float_value2 << endl; //неявное преобразование типов данных cout << "15.0 / 2 = " << 15.0 / 2 << endl // явное преобразование типа данных, число 15.0 - число с плавающей точкой << "15 / 2.0 = " << 15 / 2.0 << endl; // явное преобразование типа данных, число 2.0 - число с плавающей точкой cout << "float(int_value15) / int_value2 = " << float(int_value15) / int_value2 << endl // явное преобразование типа данных << "15 / double(2) = " << 15 / double(2) << endl; // используя приводимый тип как функцию cout << "static_cast(15) / 2 = " << static_cast(15) / 2 << endl // унарная операция приведения типа << "static_cast(15) = " << static_cast(15) << endl // можно печатать различные символы из таблицы ASCII, << "static_cast(20) = " << static_cast(20) << endl; // в скобочках прописываем код символа, который находим в таблице ASCII system("pause"); return 0; }

V خط 5متصل ، این کتابخانه برای استفاده از دستکاری های مختلف مورد نیاز است، در مورد ما -دقت تنظیم ثابت (). V خط 10به خصوص ایجاد دو متغیرهایی مانند بین المللی ، به طور مشابه دو متغیر از نوع ایجاد کردشناور در خط 11، این متغیرها برای تبدیل مقادیر آنها به انواع داده های دیگر مورد نیاز خواهند بود. Vخط 12بعد از اپراتورکوت و عملیات را به جریان خروجی تغییر دهید << دو دستکاری کننده وجود داردثابت و تنظیم دقیق (). دستکاری کننده ثابت - این یک دستکاری کننده پارامتری نیست، زیرا هیچ پارامتری را نمی پذیرد، بدون پرانتز نوشته می شود. این دستکاری همراه با یک دستکاری پارامتری استفاده می شوددقت تنظیم () و نمایش ثابت ارقام اعشار را انجام می دهد. یک دستکاری کنندهدقت تنظیم () تعداد ارقام اعشاری و آنچه در پرانتز نشان داده شده است را نشان می دهد. Vخطوط 13، 14، 15، 16نمونه هایی از تبدیل نوع داده ضمنی نشان داده شده است، این نمونه ها از آن گرفته شده اندمیز 1... V خطوط 17، 18یکی از راه های تبدیل صریح داده ها را نشان می دهد. ماهیت این روش این است که شما باید یک کاما و صفر را به یک عدد صحیح اضافه کنید. Vخطوط 19، 20تبدیل صریح با استفاده از انواع castable به عنوان توابع انجام می شود که در داخل پرانتز آنها باید مقدار یا متغیر مورد تبدیل را مشخص کنید. در خطوط 21، 22، 23، یک تبدیل نوع داده صریح با استفاده از یک عملیات تبدیل داده یکنواخت انجام می شود. پرانتز نشان دهنده متغیر یا مقداری است که باید تبدیل شود و کاراکترها قاب می شوند < > نوع داده ای که باید به آن تبدیل شود. نمونه ای از برنامه در زیر نشان داده شده است (شکل 1 را ببینید).

شکل 1 - تبدیل صریح و ضمنی انواع داده های C ++

V خطوط 22، 23یک عملیات تبدیل داده یکنواخت انجام می شود و اعداد 15 و 20 به char تبدیل می شوند. این نوع داده هنوز برای شما شناخته شده نیست، اما به یاد داشته باشید که char نوع داده برای ذخیره سازی است. بنابراین، از شکل 1می توانید ببینید که نمادهایی در انتها وجود دارد. این کاراکترها با تبدیل اعداد به char به دست آمده اند. اعداد از کدهایی بودند. بنابراین، اگر شما نیاز به نمایش هر کاراکتری از جدول ASCII دارید، این کار را می توان همانطور که در نشان داده شده است انجام داد خطوط 22، 23، در حالی که فقط کد مورد نیاز را جایگزین می کند.

در برنامه نویسی اغلب نیاز به انجام محاسبات روی متغیرهای یک نوع و در نتیجه گرفتن نوع دیگری وجود دارد. به عنوان مثال، هنگام تقسیم اعداد صحیح، یک واقعی دریافت کنید. هنگامی که مقداری از یک نوع در متغیری از نوع دیگر ذخیره می شود، تبدیل نوع داده انجام می شود. مکانیسم های مختلفی برای این کار در C# وجود دارد.

تبدیل نوع داده ضمنی

تبدیل ضمنی زمانی اتفاق می‌افتد که یک مقدار در متغیری از نوع متفاوت ذخیره می‌شود، بدون اینکه آن را در کد مشخص کنید.

برای اینکه کامپایلر C# به طور خودکار نوع داده را تبدیل کند، دو شرط باید رعایت شود:

  • نوع مقدار و نوع متغیر باید با یکدیگر سازگار باشند.
  • محدوده مقادیر ممکن یک نوع متغیر نباید کمتر از یک نوع مقدار باشد.

بایت a = 15; بایت b = 120; int c = a + b;

این مثال اجرا می شود تبدیل ضمنی و متغیر c در نهایت از نوع int خواهد بود. این امکان پذیر است زیرا بایت و int اعداد صحیح هستند و int شامل کل محدوده بایت است.

یک مثال دیگر:

کوتاه a = 815; ushort b = a؛ // خطا

اگرچه 815 در محدوده کوتاه است، در این مورد یک پیام خطا ظاهر می شود... این به این دلیل است که کامپایلر برای تبدیل ضمنی فقط شرایط فوق را بررسی می کند و فقط به انواع نگاه می کند و به مقادیر خاصی توجه نمی کند.

تبدیل نوع داده صریح

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

Int d = 13; int c = 4; var e = (دو برابر) d / c;

بنابراین، متغیر e نوع دوگانه و مقدار 3.25 را دریافت می کند. اگر از تبدیل استفاده نمی کردیم، این متغیر طبق قوانین تقسیم اعداد صحیح در C# دارای نوع int و مقدار 3 خواهد بود.

مثالی دیگر:

Ushort num = 257; دو برابر dbl = 34.9318; int rnd = (کوتاه) dbl; // مقدار 34 بایت تعیین می شود what = (byte) num; // مقدار 1 به آن اختصاص داده می شود

در مورد rnd، قانون زیر رعایت می شود: هنگام تبدیل اعداد ممیز شناور به اعداد صحیح، قسمت کسری آنها کنار گذاشته می شود.

و در مورد چههمه چیز کمی پیچیده تر است هنگام تبدیل صریح، کامپایلر محدوده‌های نوع را نادیده می‌گیرد. و در حین اجرای برنامه، اگر سعی شود مقداری در متغیری وارد شود که در محدوده آن نیست (با عمق بیت بیشتر)، تمام بیت های مرتبه بالا پاک می شوند. عدد 257 در نمایش دودویی نوع ushort شبیه 00000001 00000001 است. وقتی به بایت تبدیل می شود، تنها آخرین بایت 00000000، یعنی 1، باقی می ماند.

تبدیلی که در آن محدوده نوع متغیر به طور کامل محدوده نوع مقدار را پوشش نمی دهد، باریک شدن نامیده می شود. برای جلوگیری از از دست دادن داده ها، مانند مثال قبلی، باید از بررسی سرریز استفاده کنید.

هنگام محدود کردن تبدیل داده ها، سرریز می شود

بدیهی است که نمی‌توانید مکان‌هایی را در کد که ممکن است از دست دادن داده‌ها به دلیل سرریز رخ دهد نادیده بگیرید. در غیر این صورت، متغیرها ممکن است مقادیر غیرمنتظره ای به خود بگیرند که بر عملکرد برنامه تأثیر می گذارد و ردیابی علت خطا بسیار دشوار خواهد بود.

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

تصادفی rnd = تصادفی جدید (); int bigger = rnd.Next (99999); // یک عدد تصادفی بین 0 و 99999 کوچکتر ایجاد می کند. try (کوچکتر = علامت زده شده ((کوتاه) بزرگتر)؛) catch (System.OverflowException e) (Console.WriteLine ('Overflow raised by checked on smaller:' + e.ToString ()); // چاپ می کند // پیامی در مورد که یک استثنا کوچکتر = -1 رسیدگی شد؛)

بزرگتر یک عدد تصادفی از 0 تا 99999 است. اگر این مقدار از محدوده نوع کوتاه بیشتر شود، یک استثنا ایجاد می شود. System.OverflowExceptionو متغیر کوچکترمقدار -1 به آن اختصاص داده خواهد شد. اگر سرریز اتفاق نیفتد، هیچ استثنایی وجود نخواهد داشت و متغیر کوچکتر به سادگی مقدار متغیر بزرگتر را می گیرد، اما در نوع کوتاه.

اپراتور است

برای بررسی امکان ریخته‌گری یک شی به یک نوع خاص در C#، از عملگر استفاده کنید است... بررسی می کند که آیا یک شی نمونه ای از نوع مشخص شده است یا از آن مشتق شده است. نتیجه یک عملیات باینری با عملگر is یک مقدار بولی (درست یا نادرست) است.

مثالی از استفاده از عملگر is:

Class Samle1 () class Samle2 (): Sample1 () // کلاس Sample1 کلاس Sample3 () Samle1 t1 = new Samle1 (); Sample2 t2 = Samle2 جدید (); Sample3 t3 = new Sample3 (); char t4 = 't'; if (t1 is Sample1) (Console.WriteLine ("t1 is Sample1")؛) // اگر (t2 is Sample1 است) نمایش داده می شود (Console.WriteLine ("t2 is Sample1")؛) // نمایش داده می شود اگر ( t3 is Sample1) (Console.WriteLine ("t3 is Sample1")؛) // اگر (t4 Sample1 است) نمایش داده نمی شود (Console.WriteLine ("t4 is Sample1")؛) // نمایش داده نمی شود

به عنوان اپراتور

عملگر as برای تبدیل انواع مرجع سازگار استفاده می شود. توجه داشته باشید که اگر تبدیل ناموفق باشد، هیچ استثنایی ایجاد نمی شود، اما null برگردانده می شود. این باید هنگام پردازش نتیجه تبدیل با as در نظر گرفته شود.

شیء کلاس SamleClass () Arr = شیء جدید; Arr = کلاس نمونه جدید (); Arr = "خوش آمدید"؛ Arr = (کوتاه) 654; Arr = null; برای (بایت i = 0؛ i< Arr.Length; i++) { string t1 = Arr[i] as string; SampleClass t2 = Arr[i] as SampleClass; if (t1 != null) { Console.WriteLine(“{0}: it’s a string ‘” + t1 + “’”, i+1); } else if (t2 != null) { Console.WriteLine(“{0}: it’s a SampleClass”, i+1); } else { Console.WriteLine(“{0}: it’s not string or SampleClass”, i+1); } }

خروجی نمونه به صورت زیر خواهد بود:

1: این یک کلاس نمونه است

2: خوش آمدید "یک رشته"

3: رشته یا SampleClass نیست

4: رشته یا SampleClass نیست

تبدیل انواع با کلاس تبدیل

کلاس System.Convert سیستم حاوی متدهایی است که می توان از آنها برای تبدیل مقادیر انواع داده های پایه و همچنین نوع سیستم DateTime استفاده کرد.

تبدیلشامل مجموعه ای از روش های فرم است ToTypeکه در آن Type با نام سیستم نوع مقدار هدف جایگزین می شود (به عنوان مثال ToChar، ToInt32، ToBoolean). این روش ها به شما این امکان را می دهند که تمام تبدیل های ممکن را به انواع پایه C# انجام دهید.

متد Convert.ChangeType هر شی را به هر نوع مشخصی تبدیل می کند.این روش در صورت وجود عدم تطابق نوع یا سرریز، یک استثنا ایجاد می کند.

در برنامه نویسی غیر معمول نیست که مقادیر متغیرهای یک نوع به متغیرهای نوع دیگر اختصاص داده شود. به عنوان مثال، در قطعه کد زیر، یک مقدار صحیح مانند بین المللیبه یک متغیر ممیز شناور از نوع اختصاص داده شده است شناور:
int i;شناور f;i = 10;f = i;

اگر در یک عملیات تکالیف مخلوط شوند سازگارانواع داده، سپس مقدار سمت راست عملگر تخصیص به طور خودکار به نوع مشخص شده در سمت چپ تبدیل می شود. بنابراین، در قطعه کد بالا، مقدار متغیر منابتدا به نوع تبدیل شد شناورو سپس به یک متغیر اختصاص داده می شود f.

سوال این است که آیا تبدیل نوع همیشه امکان پذیر است؟ چه زمانی پیام های خطا ظاهر می شوند، این موضوع چگونه بر قابلیت اطمینان برنامه های توسعه یافته تأثیر می گذارد؟

به دلیل تایپ قوی، همه انواع داده در C # کاملاً سازگار نیستند، و بنابراین، همه تبدیل‌های نوع به طور ضمنی مجاز نیستند.

به عنوان مثال، انواع bool و int ناسازگار هستند. درست است، تبدیل انواع ناسازگار هنوز می تواند توسط به ارمغان آوردن. قالباساساً به معنای تبدیل صریح آنهاست.

تبدیل خودکار نوع

هنگامی که داده های یک نوع به متغیری از نوع دیگر اختصاص داده می شود، تبدیل ضمنیانواع اتفاق می افتد بطور خودکارتحت شرایط زیر:
1) هر دو نوع سازگار هستند.
2) دامنه نمایش اعداد از نوع هدف گسترده تر از نوع اصلی است.
اگر هر دوی این شرایط برآورده شود، پس تبدیل گسترده.
مثلا نوع بین المللیبه اندازه کافی بزرگ که شامل تمام مقادیر معتبر نوع باشد بایتو علاوه بر این، هر دو نوع، بین المللیو بایت، انواع عدد صحیح سازگار هستند و بنابراین تبدیل ضمنی برای آنها کاملا امکان پذیر است.
انواع عددی، هر دو عدد صحیح و ممیز شناور، برای انجام تبدیل های گسترده با یکدیگر کاملاً سازگار هستند.

بیایید یک مثال را در نظر بگیریم:

با استفاده از سیستم؛ namespace ConsoleApplication1 (classProgram (خلأ استاتیک Main (Args رشته) (num1 کوتاه، num2؛ num1 = 10؛ num2 = 15؛ Console.WriteLine ("(0) + (1) = (2)"، num1، num2، مجموع ( num1، num2)؛ Console.ReadLine ();) staticintSum (int x، int y) (بازگشت x + y؛)))

توجه کن بهکه روش Sum () دو پارامتر int را انتظار دارد. اما در روش Main () در واقع از دو متغیر از نوع short عبور داده می شود. در حالی که ممکن است این یک عدم تطابق نوع به نظر برسد، برنامه بدون خطا کامپایل و اجرا می شود و همانطور که انتظار می رود عدد 25 را برمی گرداند.
دلیل اینکه کامپایلر این کد را از نظر نحوی صحیح می داند این است که از دست دادن داده در اینجا غیرممکن است.
از آنجایی که حداکثر مقدار (32767) که یک short می تواند نگه دارد به خوبی در محدوده یک int است (که حداکثر مقدار آن 2147483647 است)، کامپایلر به طور ضمنی هر short را به یک int گسترش می دهد.
به طور رسمی، اصطلاح "اکستنشن" برای اشاره به ریخته گری ضمنی به سمت بالا استفاده می شود. بازیگران رو به بالا) که منجر به از دست دادن اطلاعات نمی شود.

ریخته گری انواع ناسازگار

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

شکل کلی تایپ کست به صورت زیر است:
(نوع_هدف) عبارت
اینجا target_typeنشان دهنده نوعی است که می خواهید عبارت مشخص شده را به آن تبدیل کنید.

اگر ریخته گری منجر شود تغییر شکل باریک، ممکن است برخی از اطلاعات از بین برود. به عنوان مثال، در نتیجه ریخته‌گری از نوع long به نوع int، اگر مقدار نوع long بزرگتر از محدوده نمایش اعداد برای نوع int باشد، برخی از اطلاعات از دست می‌رود، زیرا مهم‌ترین بیت‌های این مقدار عددی هستند. دور ریخته می شوند.
هنگامی که یک مقدار ممیز شناور به یک نوع عدد صحیح ریخته می شود، بخش کسری این مقدار عددی در نتیجه برش از بین می رود. بنابراین، اگر مقدار 1.23 را به یک متغیر صحیح اختصاص دهید، در نتیجه تنها کل قسمت از عدد اصلی (1) در آن باقی می‌ماند و قسمت کسری آن (0.23) از بین می‌رود.

بیایید مثالی بزنیم:

با استفاده از سیستم؛ namespace ConsoleApplication1 (classProgram (خلأ استاتیک اصلی (آرگس رشته) (int i1 = 455, i2 = 84500؛ اعشاری dec = 7.98845m؛ // دو عدد int را به نوع کوتاه Console.WriteLine ((کوتاه) i1)؛ Console Writ. ((کوتاه) i2)؛ // ارسال یک اعشار به int Console.WriteLine ((int) dec؛ Console.ReadLine ();)))

نتیجه این برنامه خواهد بود:
455
18964
7

لطفاً توجه داشته باشید که متغیر i1 به درستی به نوع short تبدیل شده است مقدار آن در محدوده این نوع داده است. با تبدیل dec به int قسمت عدد صحیح آن عدد را برمی گرداند. تبدیل متغیر i2 برگردانده شد مقدار سرریز 18964 (یعنی 84500 - 2 * 32768).

نقش سیستم. کلاس تبدیل

در پایان مبحث تبدیل انواع داده شایان ذکر است که در فضای نام سیستموجود دارد تبدیل کلاس، که همچنین می تواند برای گسترش و محدود کردن داده ها استفاده شود:
مجموع بایت = Convert.ToByte (var1 + var2);

یکی از مزایای رویکرد کلاس محور System.Convertبه دلیل این واقعیت است که امکان تبدیل بین انواع داده ها را به روشی بی طرف می دهد.

با این حال، از آنجایی که C # دارای یک عملیات تبدیل صریح است، با استفاده از کلاس تبدیلتبدیل انواع داده ها معمولا سلیقه ای است.

یکی دیگر از اهداف مفید متدهای کلاس تبدیلشامل تبدیل یک متغیر رشته ای به یک متغیر عددی است. من اغلب از آن استفاده می کنم! در واقع، در یک برنامه کنسول، تنها ورودی رشته امکان پذیر است، و از آنجایی که عملگر Console.ReadLine ()رشته ای را برمی گرداند، سپس می توان آن را با استفاده از روش مناسب به عدد تبدیل کرد، به عنوان مثال:
int k = Convert.ToInt32 (Console.ReadLine ());
اگر تبدیل رشته به عدد غیرممکن باشد، یک استثنا رخ می دهد (از این پس استثنا - استثنا) که قابل پردازش نیز می باشد.

بیایید به یادگیری عملگرهای #C ادامه دهیم و با آن شروع می کنیم.

تبدیل ها را تایپ کنید

در برنامه نویسی غیر معمول نیست که مقادیر متغیرهای یک نوع به متغیرهای نوع دیگر اختصاص داده شود. به عنوان مثال، در قطعه کد زیر، یک int به یک float اختصاص داده شده است:

Int i; شناور f; i = 10; f = i; // یک مقدار صحیح به یک متغیر شناور اختصاص دهید

اگر انواع داده های سازگار در یک عملیات تخصیص مخلوط شوند، آنگاه مقدار سمت راست اپراتور تخصیص به طور خودکار به نوع نشان داده شده در سمت چپ آن تبدیل می شود. بنابراین در قطعه کد بالا مقدار i ابتدا به float تبدیل می شود و سپس به f اختصاص می یابد. با این حال، به دلیل کنترل دقیق نوع، همه انواع داده در C # کاملاً سازگار نیستند و بنابراین، همه تبدیل‌های نوع به طور ضمنی مجاز نیستند. به عنوان مثال، انواع bool و int ناسازگار هستند. درست است، تبدیل انواع ناسازگار هنوز می تواند توسط به ارمغان آوردن... Typecasting اساساً به معنای تبدیل آنها به صراحت است.

تبدیل خودکار نوع

هنگامی که داده های یک نوع به متغیری از نوع دیگر اختصاص داده می شود، تبدیل ضمنیانواع به طور خودکار تحت شرایط زیر رخ می دهد:

  • هر دو نوع سازگار هستند
  • دامنه نمایش اعداد نوع هدف گسترده تر از نوع اصلی است

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

انواع عددی، هر دو عدد صحیح و ممیز شناور، برای انجام تبدیل های گسترده با یکدیگر کاملاً سازگار هستند. بیایید یک مثال را در نظر بگیریم:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. فضای نام ConsoleApplication1 (برنامه کلاس (حذف استاتیک اصلی (رشته آرگ) (کوتاه num1, num2؛ num1 = 10؛ num2 = 15؛ Console.WriteLine ("(0) + (1) = (2)"، num1، num2، مجموع (num1، num2))؛ Console.ReadLine ();) int استاتیک مجموع (int x، int y) (بازگشت x + y؛)))

توجه داشته باشید که متد Sum () انتظار دارد دو پارامتر int وارد شود. اما در روش Main () در واقع از دو متغیر از نوع short عبور داده می شود. در حالی که ممکن است این یک عدم تطابق نوع به نظر برسد، برنامه بدون خطا کامپایل و اجرا می شود و همانطور که انتظار می رود عدد 25 را برمی گرداند.

دلیل اینکه کامپایلر این کد را از نظر نحوی صحیح می داند این است که از دست دادن داده در اینجا غیرممکن است. از آنجایی که حداکثر مقدار (32767) که یک short می تواند نگه دارد به خوبی در محدوده یک int است (که حداکثر مقدار آن 2147483647 است)، کامپایلر به طور ضمنی هر short را به یک int گسترش می دهد. به طور رسمی، اصطلاح "extension" برای نشان دادن یک ریخته گری ضمنی به سمت بالا استفاده می شود که منجر به از دست دادن داده نمی شود.

ریخته گری انواع ناسازگار

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

(نوع_هدف) عبارت

اینجا target_typeنشان دهنده نوعی است که می خواهید عبارت مشخص شده را به آن تبدیل کنید.

اگر ریخته گری منجر شود تغییر شکل باریک، ممکن است برخی از اطلاعات از بین برود. به عنوان مثال، در نتیجه ریخته‌گری از نوع long به نوع int، اگر مقدار نوع long بزرگتر از محدوده نمایش اعداد برای نوع int باشد، برخی از اطلاعات از دست می‌رود، زیرا مهم‌ترین بیت‌های این مقدار عددی هستند. دور ریخته می شوند. هنگامی که یک مقدار ممیز شناور به یک مقدار صحیح ریخته می شود، بخش کسری این مقدار عددی در نتیجه برش از بین می رود. بنابراین، اگر مقدار 1.23 را به یک متغیر صحیح اختصاص دهید، در نتیجه تنها کل قسمت از عدد اصلی (1) در آن باقی می‌ماند و قسمت کسری آن (0.23) از بین می‌رود. بیایید مثالی بزنیم:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. namespace ConsoleApplication1 (کلاس برنامه (حذف استاتیک اصلی (رشته آرگ) (int i1 = 455، i2 = 84500؛ اعشاری dec = 7.98845m؛ // دو عدد از نوع int // برای تایپ کوتاه Console.WriteLine ((کوتاه) i1 ارسال کنید ) ؛ Console.WriteLine ((کوتاه) i2)؛ // ارسال اعشاری // به int Console.WriteLine ((int) dec)؛ Console.ReadLine ();)))

نتیجه این برنامه خواهد بود:

لطفاً توجه داشته باشید که متغیر i1 به درستی به نوع short تبدیل شده است مقدار آن در محدوده این نوع داده است. با تبدیل dec به int قسمت عدد صحیح آن عدد را برمی گرداند. تبدیل متغیر i2 برگردانده شد مقدار سرریز 18964 (یعنی 84500 - 2 * 32768).

رهگیری تغییر شکل داده های باریک

در مثال قبلی، ریختن متغیر i2 به short قابل قبول نیست، زیرا ناشی می شود از دست رفتن داده ها... C# کلمات کلیدی مانند بررسی شدو بدون علامتتا اطمینان حاصل شود که از دست دادن داده ها بی توجه نمی ماند.

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

عیب این روش این است که حتی در صورت به کارگیری حداکثر تلاش، انسان همچنان یک فرد باقی می ماند و برخی از اشتباهات ممکن است از چشم او دور شود.

خوشبختانه C# کلمه کلیدی بررسی شده را ارائه می دهد. هنگامی که یک دستور (یا بلوک دستور) در یک زمینه بررسی شده محصور می شود، کامپایلر C# دستورات CIL اضافی را برای بررسی شرایط سرریز که می تواند از جمع، ضرب، تفریق یا تقسیم دو نوع داده عددی ناشی شود، تولید می کند.

اگر شرایط سرریز در زمان اجرا رخ دهد، یک استثنا ایجاد می شود System.OverflowException... بیایید به مثالی نگاه کنیم که در آن مقدار استثنا را به کنسول ارسال می کنیم:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. namespace ConsoleApplication1 (برنامه کلاس (حذف استاتیک اصلی (عرض رشته) (بایت var1 = 250؛ بایت var2 = 150؛ امتحان کنید (جمع بایت = بررسی شده ((بایت) (var1 + var2))؛ Console.WriteLine ("جمع: (0) ) "، sum);) catch (OverflowException ex) (Console.WriteLine (ex.Message); Console.ReadLine ();))))

نتیجه این برنامه:

یک بررسی در کل پروژه برای شرایط سرریز تنظیم کنید

اگر برنامه‌ای می‌سازید که در آن سرریز هرگز نادیده گرفته نمی‌شود، ممکن است متوجه شوید که با کلمه کلیدی علامت‌گذاری شده، تعداد زیادی از خطوط کد آزار دهنده است. در چنین حالتی، به عنوان یک جایگزین، کامپایلر C # پشتیبانی می کند پرچم / بررسی شد... هنگامی که این پرچم فعال می شود، تمام عملیات حسابی در کد به طور خودکار برای سرریزهای احتمالی بررسی می شود، بدون استفاده از کلمه کلیدی علامت زده شده برای هر یک از آنها. تشخیص سرریز نیز منجر به ایجاد استثنای مربوطه در زمان اجرا می شود.

برای فعال کردن این پرچم در ویژوال استودیو 2010، صفحه خصوصیات پروژه را باز کنید، به تب Build بروید، روی دکمه Advanced کلیک کنید و کادر گفتگوی باز شده را علامت بزنید. سرریز/سرریز حسابی را بررسی کنید:

توجه به این نکته ضروری است که C# کلمه کلیدی را ارائه می دهد بدون علامت، که به شما امکان می دهد در موارد فردی پرتاب یک استثناء سرریز را غیرفعال کنید.

بنابراین، برای خلاصه کردن استفاده از کلیدواژه‌های علامت‌دار و بدون علامت در سی #، توجه داشته باشید که به‌طور پیش‌فرض، سرریز حسابی در زمان اجرا دات‌نت نادیده گرفته می‌شود. اگر نیاز به پردازش اپراتورهای جداگانه دارید، باید از کلمه کلیدی علامت زده استفاده کنید، و اگر نیاز دارید همه خطاهای مربوط به سرریز را در برنامه ببینید، باید پرچم / علامت زده شده را فعال کنید. در مورد کلمه کلیدی بدون علامت، زمانی می توان از آن استفاده کرد که بلوکی از کد وجود داشته باشد که سرریز در آن قانونی است (و بنابراین نباید منجر به ایجاد استثنا در زمان اجرا شود).

مقالات مرتبط برتر