我不应该得到一个编译器警告吗?我如何启用它?

问题描述:

比方说,我有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

我知道这种情况没有警告。在MyMethod()之内,您可以使用this.myMessage消除本地属性和类属性之间的歧义。

只是FYI,属性通常是TitleCased,而本地人是camelCased。使用该惯例可以防止像列出的那样命名冲突。

+0

我正在转换一个旧的ASP页面,并试图将其全球化。我实际上并不希望两个版本的myMessage都可用。 – lincolnk 2010-08-25 14:52:38

结账Lexical Scoping。 MyMethod中的myMessage在新的范围中定义。在该方法中任何对myMessage的引用都将假定您引用了该范围中定义的变量。您可以使用this.myMessage访问在MyClass中定义的myMessage。

编辑: 鉴于这些信息,你可以看到为什么从编译器的角度来看这是完全有效的。是否应该给你一个警告是有趣的。正如Mitch Wheat在他的评论中指出的那样,像ReSharper这样的工具会警告你这些事情,但如果一个编译器应该警告你碰到某个与词法范围相关的事件时,这是值得商榷的。似乎更像是一种补充工具的工作。

+0

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

这实际上是按照私人领域的一个命名模式,虽然我更喜欢_fieldName自己:

public class MyClass 
{ 
    private string myMessage; 

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

这里的问题是,我们有没有隐藏的一个有效的,需要的情况下,区分的方式一个意外的隐藏案例。我们尝试为以下情况保留警告:(1)代码为几乎可以肯定错误;(2)有一种直接的方法来重写代码,以便在实际需要代码的情况下消除警告。

这往往是因为这个希望的情况下:

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

你不想改变字段“名”到别的东西,因为它是完全描述性的原样。您不希望将参数“name”更改为其他名称,因为您希望能够在C#4或Visual Basic中执行new Frog(name: "Kermit")。由于需要隐藏并且代码正确,我们不希望为隐藏产生警告。