C# checked和unchecked的使用小結(jié)
一、概述
checked 和 unchecked 語句指定整型類型算術(shù)運(yùn)算和轉(zhuǎn)換的溢出檢查上下文。
當(dāng)發(fā)生整數(shù)算術(shù)溢出時(shí),溢出檢查上下文將定義發(fā)生的情況。
- 在已檢查的上下文中,引發(fā) System.OverflowException;
- 如果在常數(shù)表達(dá)式中發(fā)生溢出,則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。
- 在未檢查的上下文中,會(huì)通過丟棄任何不適應(yīng)目標(biāo)類型的高序位來將操作結(jié)果截?cái)唷?/li>
二、語句
checked和unchecked語句指定整型類型算術(shù)運(yùn)算和轉(zhuǎn)換的溢出檢查上下文。
具體使用見下面案例:
static void Main(string[] args)
{
uint a = uint.MaxValue;
//【一】檢查代碼段 unchecked{ }
unchecked
{
Console.WriteLine(a + 1); // output: 0
}
try
{
checked
{
Console.WriteLine(a + 1);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: 算術(shù)運(yùn)算導(dǎo)致溢出。
}
//由上可知,當(dāng)我們使用checked的時(shí)候會(huì)做溢出檢查,會(huì)拋出異常
// 當(dāng)我們使用unchecked的時(shí)候不會(huì)做溢出檢查,不會(huì)有異常
三、表達(dá)式
- 若要為表達(dá)式指定溢出檢查上下文,還可以使用 checked 和 unchecked 運(yùn)算符
具體使用見下面案例:
//【二】檢查表達(dá)式 unchecked()
double d = double.MaxValue;
int i = unchecked((int)d);
Console.WriteLine(i); // output: -2147483648
try
{
i = checked((int)d);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: 算術(shù)運(yùn)算導(dǎo)致溢出。
}
Console.ReadLine();
}
四、本地函數(shù)與 Checked
- checked 和 unchecked 語句和運(yùn)算符僅影響以文本形式存在于語句塊或運(yùn)算符括號(hào)內(nèi)的操作的溢出檢查上下文
具體使用見下面案例:
static void Main(string[] args)
{
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
}
internal class Program
{
static void Main(string[] args)
{
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply2(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply2(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
}
private static int Multiply2(int a, int b)
{
return a * b;
}
}
注意,在前面的示例中:
- 有一個(gè)本地函數(shù)
Multiply,一個(gè)正常的私有函數(shù)Multiply2 - 當(dāng)使用
Console.WriteLine(Multiply2(factor, int.MaxValue));這樣的方式調(diào)用 本地函數(shù)Multiply或私有函數(shù)Multiply2,checked 語句不會(huì)引發(fā)任何異常。 - 當(dāng)使用
Console.WriteLine(Multiply2(factor, factor * int.MaxValue));這樣的方式調(diào)用 本地函數(shù)Multiply或私有函數(shù)Multiply2,由于第二個(gè)參數(shù) 的表達(dá)式 會(huì)引起 checked 語句的上下文檢查,因此會(huì)引發(fā)異常。
static void Main(string[] args)
{
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
unchecked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
unchecked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue)); // output: -4
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
}
- unchecked 則都不會(huì)引發(fā)異常。
參考資料:
到此這篇關(guān)于C# checked和unchecked的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# checked unchecked 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 使用SharpZipLib生成壓縮包的實(shí)例代碼
SharpZipLib是一個(gè)C#的類庫,主要用來解壓縮Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式實(shí)現(xiàn),可以方便的應(yīng)用于其他的項(xiàng)目之中。本文通過一個(gè)實(shí)例代碼給大家介紹了C# 使用SharpZipLib生成壓縮包的方法,感興趣的朋友跟隨小編一起看看吧2018-09-09
C# Telnet協(xié)議實(shí)現(xiàn)與源碼解析
本文主要介紹了C# Telnet協(xié)議實(shí)現(xiàn)與源碼解析,包括創(chuàng)建Socket連接、命令交互、數(shù)據(jù)傳輸和異常處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05
C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了如何利用C#調(diào)用OutLokk實(shí)現(xiàn)發(fā)送郵件的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
C#使用itextsharp打印pdf的實(shí)現(xiàn)代碼
提到打印,恐怕對(duì)于很多人都不會(huì)陌生,無論是開發(fā)者,還是非計(jì)算機(jī)專業(yè)的人員都會(huì)接觸到打印,?在.NET中實(shí)現(xiàn)PDF打印的組件比較多,例如PDFsharp、Report.NET、sharpPDF、itextSharp等等,今天主要簡(jiǎn)單的介紹itextSharp組件,需要的朋友可以參考下2024-04-04

