2012-02-01 15 views
4

整個程序在.NET Web的應用程序的Web表單:價值分配,從來沒有使用過,但沒有編譯器消息

namespace WebApplication1 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string x = ""; 
     string y = String.Empty; 
    } 
    } 
} 

如果我構建應用程序,編譯器強調X,

變量x被分配到,但it's值永遠不會使用

對於Y,我沒有得到任何下劃線。爲什麼不? (VS 2008,NET 3.5的)

+1

[C#編譯器應該給出警告但不是?]的可能的重複(http://stackoverflow.com/questions/2740885/c-sharp-compiler-should-give-warning-but-doesnt) – 2012-02-01 16:28:47

回答

9

我回答你的問題在這裏詳細:

https://stackoverflow.com/a/2741281/88656

簡單:編譯器檢測到本地寫入,但流量分析過程中不讀。如果寫入本地的值是非常數,它故意壓制警告。 String.Empty不是一個常量,它是一個只讀字段,很奇怪。但空字符串文字一個常量。這就是爲什麼你看到字面的警告,而不是字面的警告。

編譯器推理您可能會將表達式的值分配給未讀本地以便於調試程序。我們不希望每次引入解釋變量以幫助調試時都不得不關閉「警告是錯誤」。在這種情況下,顯然你沒有使用該變量來檢查輸出String.Empty在編譯器上丟失了;它不知道字段引用的語義是什麼。

+0

「String.Empty不是一個常量,它是一個只讀字段,奇怪的是」這是一個設計決定還是一個錯誤? – 2012-02-01 18:13:53

+1

@lukas:這是一個問答網站;如果你有問題,請發表問題!但在這種情況下,它已經發布了很多次。 http://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant – 2012-02-01 18:20:04

+0

爲什麼編譯器會導致我使用該變量以便於調試?我個人喜歡String.Empty,因爲它使程序更具可讀性。而且我更希望得到一個未使用的變量的警告,因爲這經常發生。 – AGuyCalledGerald 2012-02-01 18:51:31

5

編譯強調X,

沒有,編譯器不。編輯強調。編譯器沒有能夠繪製線條的輸出通道。

對於y,我沒有強調。爲什麼不?

因爲它被使用?

不要誤解我的意思,但如果沒有完整的代碼與變量作用域相關,那麼根本就沒有辦法說這是否是這樣。

整個程序:

謊言。這不是整個程序;)它甚至不是完整的類。而且你不能在類之外的C#中使用變量。

+0

整個程序我寫了;) – AGuyCalledGerald 2012-02-01 08:37:44

+1

@ Jan-FrederikCarl:當然,並不是整個程序都被編譯。一個簡短但完整的程序肯定會有所幫助。 – 2012-02-01 08:38:31

+3

回覆:「編輯強調」 - 這是一個分裂的區別。 **編譯器告訴編輯器要強調的內容**。你可以這麼說,不,編輯沒有強調下劃線,Windows圖形例程做下劃線,不,下劃線不劃線,監視器上的像素做下劃線。 – 2012-02-01 16:30:43

-2

如果我理解了文章我讀正確,編譯器不知道的String.Empty是什麼,因爲它是一個只讀字段。 String.Empty在運行時分配。所以在構建程序時我沒有任何警告。

The article

+0

好的,有什麼不對? – AGuyCalledGerald 2012-02-01 10:25:09

+1

你說的是真實的,但是沒有提供真正的答案給你的問題,你已經成功地將'String.Empty'與''''區分開來了,但是錯誤*應該仍然適用,因爲錯誤會是做出一個真實的陳述:「變量'y'被賦值,但它的值永遠不會被使用'」仍然適用。請參閱http://stackoverflow.com/a/2741281。 – Brian 2012-02-01 17:09:51