婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 關(guān)于C# if語(yǔ)句中并列條件的執(zhí)行

關(guān)于C# if語(yǔ)句中并列條件的執(zhí)行

熱門標(biāo)簽:陜西人工外呼系統(tǒng)哪家好 地圖標(biāo)注多個(gè)行程 云南外呼電銷機(jī)器人系統(tǒng) 山西防封卡電銷卡套餐 海外地圖標(biāo)注門市標(biāo) 銅川小型外呼系統(tǒng)運(yùn)營(yíng)商 浙江外呼系統(tǒng)怎么安裝 廈門商鋪地圖標(biāo)注 上海楊浦怎么申請(qǐng)申請(qǐng)400電話
C#語(yǔ)言中也是如此。當(dāng)多個(gè)條件進(jìn)行邏輯與操作的時(shí)候,判定會(huì)從表達(dá)式左邊執(zhí)行到右邊,遇到任何一個(gè)為假,后面就都不做了。這很聰明,然而如果后面的條件會(huì)拋出異常,就是個(gè)潛在的問(wèn)題。一旦之前的條件為真,就會(huì)繼續(xù)執(zhí)行,執(zhí)行到拋出異常的條件時(shí),程序就爆了,哈哈。
我們可以寫(xiě)個(gè)簡(jiǎn)單的demo試試。下面的這段代碼是坑爹的,之后我會(huì)說(shuō)明原因,但大家可以先從直觀的層面上理解一下,最后我會(huì)給出正確的測(cè)試方法。
復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
DataSet ds = null;
if (false ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("Fuck");
}
else
{
Console.WriteLine("Shit");
}
if (true ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}

這段代碼乍看沒(méi)問(wèn)題,并且在運(yùn)行時(shí)也給出了我們期望的結(jié)果,即第一段語(yǔ)句輸出Shit,不拋出異常(當(dāng)前面為false,后面會(huì)拋異常的ds.Tables[0].Rows.Count > 0就不做),而第二段語(yǔ)句因?yàn)橹笆莟rue,所以要執(zhí)行對(duì)dataset的判斷,所以拋出異常。但如果用reflector反編譯程序集,就會(huì)發(fā)現(xiàn),編譯器已經(jīng)把上面的代碼優(yōu)化成了下面這種形式,我們的if語(yǔ)句中寫(xiě)死的true和false已經(jīng)被閹割掉了,所以并不能說(shuō)明if語(yǔ)句執(zhí)行的問(wèn)題。
復(fù)制代碼 代碼如下:

private static void Main(string[] args)
{
DataSet ds = null;
Console.WriteLine("Shit");
if (ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}

其實(shí),如果你仔細(xì)觀察,在輸入這段代碼的過(guò)程中,VS就已經(jīng)提示if (false ds.Tables[0].Rows.Count > 0)中,后者是不可達(dá)的。這是即時(shí)編譯的效果。既然即時(shí)編譯說(shuō)后面的代碼不可達(dá),就意味著不可達(dá)的代碼會(huì)在編譯期被切掉。因此,剛才我們?cè)谏厦婵吹降木幾g結(jié)果也就是自然的事情了。
同樣,如果你直接把1 == 0, 1 == 1這樣的條件拼上去的話,編譯器也會(huì)發(fā)現(xiàn)的。所以我們要找一種不會(huì)被編譯器發(fā)現(xiàn)的寫(xiě)法,要讓我們的條件判定代碼只能在運(yùn)行時(shí)執(zhí)行,而不是編譯時(shí)被調(diào)整。比如下面這種:
復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
DataSet ds = null;
int i = 0;
int j = 1;
if (i + j == 0 ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("Fuck");
}
else
{
Console.WriteLine("Shit");
}
if (i + j == 1 ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}

我們?cè)賮?lái)執(zhí)行,發(fā)現(xiàn)這次的結(jié)果是真正意義的滿足了我們的目的,說(shuō)明了當(dāng)多個(gè)條件進(jìn)行邏輯與的時(shí)候,C#的執(zhí)行機(jī)制:

寫(xiě)這篇文章的意義,是為了讓大家在寫(xiě)程序的時(shí)候,注意條件中可能發(fā)生異常的地方。比如我們模擬String.IsNullOrEmpty()。
在or關(guān)系中,只要有一個(gè)true,整個(gè)表達(dá)式就是true了。但如果你讓可能引發(fā)異常的語(yǔ)句先于之后會(huì)返回true的語(yǔ)句執(zhí)行,就會(huì)爆。
比如這樣寫(xiě)的話會(huì)爆,因?yàn)榕袛郘ength的前提是得有個(gè)string:
復(fù)制代碼 代碼如下:

public static bool IsNullOrEmpty(string str)
{
if (str.Length == 0 || str == null)
{
return true;
}
return false;
}

 

這樣寫(xiě)就正常:
復(fù)制代碼 代碼如下:

public static bool IsNullOrEmpty(string str)
{
if (str == null || str.Length == 0)
{
return true;
}
return false;
}

微軟是這樣寫(xiě)的,碉堡了!
復(fù)制代碼 代碼如下:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}

上面這段代碼可以用reflector打開(kāi)mscorlib中的System.String找到~
您可能感興趣的文章:
  • C#條件語(yǔ)句、循環(huán)語(yǔ)句(if、while)
  • C#中if語(yǔ)句使用概述
  • c#入門之分支語(yǔ)句使用方法(三元運(yùn)算符、if語(yǔ)句、switch語(yǔ)句)
  • 利用C#9.0新語(yǔ)法如何提升if語(yǔ)句美感

標(biāo)簽:孝感 朔州 許昌 西雙版納 自貢 信陽(yáng) 常州 萊蕪

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于C# if語(yǔ)句中并列條件的執(zhí)行》,本文關(guān)鍵詞  關(guān)于,語(yǔ)句,中,并列,條件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《關(guān)于C# if語(yǔ)句中并列條件的執(zhí)行》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于關(guān)于C# if語(yǔ)句中并列條件的執(zhí)行的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 绥滨县| 清水县| 高唐县| 湘阴县| 大安市| 玉龙| 本溪市| 正阳县| 大洼县| 香格里拉县| 南投市| 垦利县| 土默特左旗| 义乌市| 客服| 钦州市| 汉阴县| 九寨沟县| 渭源县| 杭锦旗| 永定县| 满洲里市| 安义县| 吴堡县| 都安| 赞皇县| 乌海市| 瓮安县| 平邑县| 东宁县| 金平| 鲁山县| 分宜县| 平塘县| 绥芬河市| 古蔺县| 江孜县| 碌曲县| 宁南县| 广西| 昆明市|