2010-08-25 89 views
1

比方說,我有MyMethod隱藏(?)類上的myMessage屬性此我不應該得到一個編譯器警告嗎?我如何啓用它?

public class MyClass 
{ 
    public string myMessage { get; set; } 

    void MyMethod() 
    { 
     string myMessage; 
    } 
} 

不應該我得到myMessage警報?我沒有得到任何東西,當我建立這種效果。我如何激活此檢查?

+4

在正面,ReSharper警告這個... – 2010-08-25 14:45:13

+0

@Mitch小麥謝謝我會檢查到這一點。 – lincolnk 2010-08-25 15:01:25

回答

6

我知道這種情況沒有警告。在MyMethod()之內,您可以使用this.myMessage消除本地屬性和類屬性之間的歧義。

只是FYI,屬性通常是TitleCased,而本地人是camelCased。使用該慣例可以防止像列出的那樣命名衝突。

+0

我正在轉換一箇舊的ASP頁面,並試圖將其全球化。我實際上並不希望兩個版本的myMessage都可用。 – lincolnk 2010-08-25 14:52:38

2

結賬Lexical Scoping。 MyMethod中的myMessage在新的範圍中定義。在該方法中任何對myMessage的引用都將假定您引用了該範圍中定義的變量。您可以使用this.myMessage訪問在MyClass中定義的myMessage。

編輯: 鑑於這些信息,你可以看到爲什麼從編譯器的角度來看這是完全有效的。是否應該給你一個警告是有趣的。正如Mitch Wheat在他的評論中指出的那樣,像ReSharper這樣的工具會警告你這些事情,但如果一個編譯器應該警告你碰到某個與詞法範圍相關的事件時,這是值得商榷的。似乎更像是一種補充工具的工作。

+0

我知道這是允許的,但感謝您提供一些很好的信息。 – lincolnk 2010-08-25 14:56:39

0

這實際上是按照私人領域的一個命名模式,雖然我更喜歡_fieldName自己:

public class MyClass 
{ 
    private string myMessage; 

    public MyClass(string myMessage) 
    { 
     this.myMessage = myMessage; 
    } 
} 
8

這裏的問題是,我們有沒有隱藏的一個有效的,需要的情況下,區分的方式一個意外的隱藏案例。我們嘗試爲以下情況保留警告:(1)代碼爲幾乎可以肯定錯誤;(2)有一種直接的方法來重寫代碼,以便在實際需要代碼的情況下消除警告。

這往往是因爲這個希望的情況下:

class Frog 
{ 
    private string name; 
    public Frog(string name) 
    { 
     this.name = name; 

你不想改變字段「名」到別的東西,因爲它是完全描述性的原樣。您不希望將參數「name」更改爲其他名稱,因爲您希望能夠在C#4或Visual Basic中執行new Frog(name: "Kermit")。由於需要隱藏並且代碼正確,我們不希望爲隱藏產生警告。

相關問題