關於C# if語句中並列條件的執行

來源:互聯網
上載者:User

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找到~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.