• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:42:26
    文檔

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

    關(guān)于C# if語句中并列條件的執(zhí)行:C#語言中也是如此。當(dāng)多個條件進(jìn)行邏輯與操作的時候,判定會從表達(dá)式左邊執(zhí)行到右邊,遇到任何一個為假,后面就都不做了。這很聰明,然而如果后面的條件會拋出異常,就是個潛在的問題。一旦之前的條件為真,就會繼續(xù)執(zhí)行,執(zhí)行到拋出異常的條件時,程序就爆了
    推薦度:
    導(dǎo)讀關(guān)于C# if語句中并列條件的執(zhí)行:C#語言中也是如此。當(dāng)多個條件進(jìn)行邏輯與操作的時候,判定會從表達(dá)式左邊執(zhí)行到右邊,遇到任何一個為假,后面就都不做了。這很聰明,然而如果后面的條件會拋出異常,就是個潛在的問題。一旦之前的條件為真,就會繼續(xù)執(zhí)行,執(zhí)行到拋出異常的條件時,程序就爆了

    C#語言中也是如此。當(dāng)多個條件進(jìn)行邏輯與操作的時候,判定會從表達(dá)式左邊執(zhí)行到右邊,遇到任何一個為假,后面就都不做了。這很聰明,然而如果后面的條件會拋出異常,就是個潛在的問題。一旦之前的條件為真,就會繼續(xù)執(zhí)行,執(zhí)行到拋出異常的條件時,程序就爆了,哈哈。
    我們可以寫個簡單的demo試試。下面的這段代碼是坑爹的,之后我會說明原因,但大家可以先從直觀的層面上理解一下,最后我會給出正確的測試方法。
    代碼如下:

    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();
    }

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

    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ì)觀察,在輸入這段代碼的過程中,VS就已經(jīng)提示if (false && ds.Tables[0].Rows.Count > 0)中,后者是不可達(dá)的。這是即時編譯的效果。既然即時編譯說后面的代碼不可達(dá),就意味著不可達(dá)的代碼會在編譯期被切掉。因此,剛才我們在上面看到的編譯結(jié)果也就是自然的事情了。
    同樣,如果你直接把1 == 0, 1 == 1這樣的條件拼上去的話,編譯器也會發(fā)現(xiàn)的。所以我們要找一種不會被編譯器發(fā)現(xiàn)的寫法,要讓我們的條件判定代碼只能在運(yùn)行時執(zhí)行,而不是編譯時被調(diào)整。比如下面這種:
    代碼如下:

    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();
    }

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

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

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

     

    這樣寫就正常:
    代碼如下:

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

    微軟是這樣寫的,碉堡了!
    代碼如下:

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

    上面這段代碼可以用reflector打開mscorlib中的System.String找到~

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    關(guān)于C# if語句中并列條件的執(zhí)行:C#語言中也是如此。當(dāng)多個條件進(jìn)行邏輯與操作的時候,判定會從表達(dá)式左邊執(zhí)行到右邊,遇到任何一個為假,后面就都不做了。這很聰明,然而如果后面的條件會拋出異常,就是個潛在的問題。一旦之前的條件為真,就會繼續(xù)執(zhí)行,執(zhí)行到拋出異常的條件時,程序就爆了
    推薦度:
    標(biāo)簽: 條件 語句 執(zhí)行
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品青青在线观看爽香蕉| 精品伦精品一区二区三区视频| 国产综合精品久久亚洲| 宅男在线国产精品无码| 亚洲AV日韩精品久久久久久久| 国产成人精品a视频一区| 国产三级精品三级在线专区1 | 国产免费久久精品丫丫| 2022国内精品免费福利视频| 亚洲精品无码日韩国产不卡?V| 国产精品秘入口福利姬网站| 91在线视频精品| 人妻精品久久久久中文字幕69| 蜜桃麻豆www久久国产精品| 四虎精品免费永久在线| 99久久99久久精品免费看蜜桃 | 欧美精品福利在线视频| 国产A∨国片精品一区二区| 99精品视频在线| 爽爽精品dvd蜜桃成熟时电影院| 蜜臀精品国产高清在线观看| 国产AV国片精品一区二区| 久久精品国产久精国产| 国产精品久久久久久久久免费| 囯产精品一品二区三区| 老司机亚洲精品影院| 亚洲国产精品va在线播放| 亚洲精品456播放| 青春草无码精品视频在线观| 久久精品成人影院| 国产午夜亚洲精品国产成人小说 | 国产精品九九久久免费视频| 久久伊人精品青青草原高清| 国产精品1024香蕉在线观看| 69久久夜色精品国产69| 69SEX久久精品国产麻豆| 国产精品高清一区二区三区| 18国产精品白浆在线观看免费| 热re99久久6国产精品免费| 亚洲国产精品VA在线观看麻豆| 亚洲AV无码国产精品麻豆天美|