2012-02-05 67 views

回答

10

爲什麼容易;想到你寫的居然是這樣的:

object o = null; 
Console.WriteLine(("Is null: " + o) == null); // returns false 

這是測試"Is null: " + onull,這將永遠是false。這是由於運算符優先級的規則,其中+==之前。

你應該明確應用括號,以確保它的工作像你想:

Console.WriteLine("Is null: " + (o == null)); // returns true 

正如Jim Rhodes在評論中指出:

這是幾個原因,你應該總是用一個括號並且從不依賴編譯器優先級規則。

我注意到自己,我同意;我甚至不想嘗試自己記住運營商優先規則,而是始終明確與parens。我進一步建議,這也是在依賴隱式類型轉換和/或具有多個重載的方法時要非常小心的一個原因。

我還想指出,我真的很喜歡 their answer中指出;關於爲什麼只打印「False」,而不是你想要打印的全部文本。

+3

這是你爲什麼總是使用圓括號而不依賴於編譯器優先規則的幾個原因之一。 – 2012-02-05 14:36:45

+1

@JimRhodes確實;我甚至不想自己記住運營商優先規則。如果它可能*是一個問題,我明確指出我的代碼中的優先順序。這個例子也是*一個例子,顯示依賴顯式類型轉換可能導致混淆。 – 2012-02-05 14:39:48

11

運算符優先級。

嘗試

Console.WriteLine("Is null: " + (o == null)); 

在代碼中,首先o被添加到字符串"Is null: "中,然後檢查是否爲空。當然不是,所以它被評估爲錯誤。您的來電是一樣的,如果你只是寫

Console.WriteLine(false.ToString()); 

這就是爲什麼只有「假」打印,即使沒有你的字符串。

+0

好的補充說明它如何只顯示「False」,而不是「False」 – 2012-02-05 16:16:44

8

其他答案已正確診斷問題:連接的運算符優先級高於相等。然而,沒有人解決過你的程序中最基本的錯誤,那就是你正在進行連接。編寫代碼的更好方法是:

Console.WriteLine("is null: {0}", obj == null); 

現在不可能存在運算符優先級問題,因爲所討論的表達式只有一個運算符。

一般來說,在執行輸出時,應該避免字符串連接,並支持字符串替換。它更容易做到,它更加靈活,更易於本地化使用這種技術編寫的程序,等等。

+0

但是,如果連接不包含表達式(只有變量,甚至可能是常量)並且它很簡短嗎?在許多情況下,級聯更短,更清晰並且性能更好。你對這些論點有什麼看法? – Konstantin 2012-02-07 11:14:46