2011-05-14 23 views
6

我犯了這個錯誤的次數 - 當我快速工作,並使用代碼完成它發生。我最終得到如下代碼:爲什麼沒有關於身份分配的警告?

public class Model : IModel 
{ 
    public PropertyNames PropertyNames { get; set; } 
    public Model(PropertyNames propertyNames) 
    { 
     PropertyNames = PropertyNames; 
    } 
} 

然後,測試失敗的方式稍微不明顯,我感到失望。

我只是好奇,如果有一個有效的理由來寫這樣的代碼,如果沒有,那麼它是否是一個很好的候選人產生警告?

+0

我同意這種行爲是很瘋狂的。我覺得,至少,代碼完成應該更聰明。 – Domenic 2011-05-14 23:29:59

+0

在一個側面說明,我通常儘量避免在那裏我結束了與它的類型相同的名稱屬性的情況。例如'public PropertyNames Names {get;組; }' – 2011-05-14 23:36:00

+1

您可能想要閱讀http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx – 2011-05-15 00:02:14

回答

2

使用的FxCop(又名代碼分析),它會給你一個警告:

警告3 CA1801:Microsoft.Usage:參數'propertyNames 'Model.Model(串)' 中從未使用過。刪除參數或在方法體中使用它。

+0

不錯的主意,謝謝 – 2011-05-14 23:32:44

+0

我對這個答案的投票規則有點鬆散,因爲它對我來說是最有用的答案,即使採取從字面上它回答我的問題,不是我的問題:)希望這就好了。 – 2011-05-16 16:43:01

3

除了「它被視爲一條有效的指令」以外,沒有理由使用它。也就是說,這也沒有錯:它符合賦值的語法。

如果您正在編寫代碼驗證程序,那麼這是一個很好的警告候選,儘管它當然不應妨礙實際編譯;字節碼優化,在不執行任何控制邏輯和不實際修改寄存器的指令被刪除期間大多數編譯器已經趕上這樣的操作。

+0

偏離主題......這種類型的財產分配並不能保證在一般情況下是一個nop:吸氣人員可以觸發各種副作用行爲,並且班級作者可以使用'P = P'作爲一個從構造函數中觸發這些動作的(瘋狂的,迂迴的,容易出錯的)方式賦值。 – LukeH 2011-05-14 23:46:19

+0

@LukeH:不是題外話題,其實這就是問題所在。 – 2011-05-15 00:04:34

+0

@LukeH,當然是你的權利 - 我只能說它讓我想起了一些我認爲在我的c/C++時代引發了一些警告的事情,而且它的一般警告類是「如果寫起來容易由於錯誤和99%的時間它真的是一個錯誤,然後生成一個警告「..我能想到的最簡單的事情是,如果你把一個賦值在表達式中,single =而不是== ...該語言允許它但開發者很少打算這麼做。 – 2011-05-16 16:40:26

5

我,如果有寫這樣的代碼的正當理由,永遠

取決於你如何看待只是好奇,可惜是的,有。因爲我們正在談論的標識符是一個屬性,分配屬性的屬性聽起來像無操作,但它實際上調用方法,getter和二傳手,而這些方法可能有副作用。

一個很常見的特定情況是,如果setter執行了類似於屬性通知或調用觀察者的事情,但是當您調用getter或setter時可能發生任何事情。這就是爲什麼代碼不會產生警告:因爲這種編碼風格實際上是有用的,在生產代碼中使用。

編輯:

通過對比,如果該標識符是字段,而不是一個屬性,它生成這樣的警告:

警告CS1717:輸入分配到相同的變量製成;你的意思是分配別的東西嗎?

相關問題