<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于C# if語句中并列條件的執行

        來源:懂視網 責編:小采 時間:2020-11-27 22:42:26
        文檔

        關于C# if語句中并列條件的執行

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

        C#語言中也是如此。當多個條件進行邏輯與操作的時候,判定會從表達式左邊執行到右邊,遇到任何一個為假,后面就都不做了。這很聰明,然而如果后面的條件會拋出異常,就是個潛在的問題。一旦之前的條件為真,就會繼續執行,執行到拋出異常的條件時,程序就爆了,哈哈。
        我們可以寫個簡單的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();
        }

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

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

        其實,如果你仔細觀察,在輸入這段代碼的過程中,VS就已經提示if (false && ds.Tables[0].Rows.Count > 0)中,后者是不可達的。這是即時編譯的效果。既然即時編譯說后面的代碼不可達,就意味著不可達的代碼會在編譯期被切掉。因此,剛才我們在上面看到的編譯結果也就是自然的事情了。
        同樣,如果你直接把1 == 0, 1 == 1這樣的條件拼上去的話,編譯器也會發現的。所以我們要找一種不會被編譯器發現的寫法,要讓我們的條件判定代碼只能在運行時執行,而不是編譯時被調整。比如下面這種:
        代碼如下:

        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#的執行機制:

        寫這篇文章的意義,是為了讓大家在寫程序的時候,注意條件中可能發生異常的地方。比如我們模擬String.IsNullOrEmpty()。
        在or關系中,只要有一個true,整個表達式就是true了。但如果你讓可能引發異常的語句先于之后會返回true的語句執行,就會爆。
        比如這樣寫的話會爆,因為判斷Length的前提是得有個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找到~

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

        文檔

        關于C# if語句中并列條件的執行

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一本色道久久综合亚洲精品高清| 永久在线免费观看| 国产精品久久久久免费a∨| 亚洲中文字幕无码永久在线 | 亚洲精品精华液一区二区| 4444www免费看| 亚洲精品第一国产综合精品| 日韩免费无码一区二区三区| 亚洲精品卡2卡3卡4卡5卡区| 中文字幕a∨在线乱码免费看 | 国产免费午夜a无码v视频| 亚洲欧美第一成人网站7777| 97免费人妻无码视频| 97亚洲熟妇自偷自拍另类图片| 日韩电影免费在线观看| 亚洲av无码片在线播放| 亚欧免费一级毛片| 亚洲蜜芽在线精品一区| 免费观看激色视频网站bd| 亚洲综合一区二区| 免费成人激情视频| 亚洲男人天堂2022| 暖暖日本免费在线视频| 久久精品国产亚洲AV天海翼| 又黄又爽无遮挡免费视频| 日本一区二区三区在线视频观看免费 | 最近2019年免费中文字幕高清| 亚洲日本精品一区二区| 国产成人免费高清激情明星| 亚洲国产精品久久久久秋霞影院| 很黄很黄的网站免费的| 亚洲日韩精品无码专区加勒比| 日本二区免费一片黄2019| 无套内射无矿码免费看黄| 亚洲成aⅴ人片久青草影院| 99久久成人国产精品免费| 久久精品国产亚洲av麻豆小说| 成年人性生活免费视频| 免费一级毛片在线播放放视频| 亚洲va久久久噜噜噜久久男同| 最近中文字幕mv免费高清在线 |