2017-06-05 111 views
1

在C#中,當你聲明,但不使用內置類或結構,你得到一個「聲明,但從未使用過」警告,即使該變量賦值,如下面的代碼:爲什麼用戶定義的類沒有「聲明但未使用」警告?

string myStr; 
myStr = "foo"; 
return; 

但是你沒有得到一個用戶定義的類或結構相同的警告:

Bar myBar; 
myBar = new Bar(); 
return; 

爲什麼會出現在後一種情況下,沒有警告?如果構造函數存在副作用,那麼可以說new Bar();,並且分配操作符過載時,分配的副作用的唯一方法是。但是,Visual Studio可以檢查這一點,如果操作符沒有超載,則發出警告,但事實並非如此。有沒有技術上的原因,爲什麼它不這樣做?

+0

我認爲這隻適用於值類型。 – Transcendent

+0

賦值運算符不能被重載,儘管您可以定義隱式轉換運算符。順便說一下,運行時間不是編譯時間。並非所有的東西都可以在編譯時確定。所以不要期望編譯器提供超級智能建議 –

+0

是的,運行時間與編譯時間是答案。除非您編寫它,否則您不知道類將在運行時執行什麼操作。編譯器沒有寫它 - 它應該怎麼知道你沒有在構造器中做一些時髦的東西,或者DI系統不會自動實例化你的類型,或者你沒有需要初始化的靜態構造函數,以便即使沒有使用返回值,new Blah()也是有用的? – Charleh

回答

4

resharper會顯示問題 - 請參閱Value assigned is not used in any execution path - C#

代碼分析也會顯示問題 - https://msdn.microsoft.com/library/ms182278.aspx。至於爲什麼它現在沒有顯示給你(無代碼分析或Resharper),請參見https://stackoverflow.com/a/10629031/34092https://github.com/dotnet/roslyn/issues/15695(基本上是'按設計')。

+1

嘿,偉大的設計基於愚蠢的開發人員被「激怒」。 – Jez

+0

公平起見,臨時變量對於查看函數調用的返回值非常有幫助。 IDE確實可以讓你以其他方式獲取這些信息,但是一個變量確實使它變得非常容易。所以權衡是合理的 - 特別是當他們提供其他方式(例如代碼分析)來執行它,如果你真的想。 – mjwills

+0

他們是,但在這一點上發出警告是完全合適的。當你完成調試時,你*應該*清理你的無意義的變量賦值,或者至少來提交你的代碼。 – Jez

相關問題