我不应该为此收到编译器警告吗?我该如何启用它?

时间:2010-08-25 14:41:29

标签: c# visual-studio-2010 compiler-warnings

让我说我有这个

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

    void MyMethod() 
    {
        string myMessage;
    }
}

我不应该在myMessage隐藏(?)类中的MyMethod属性时收到关于myMessage的提醒吗?我建立时,我没有得到任何效果。我如何激活此检查?

4 个答案:

答案 0 :(得分:8)

这里的问题是我们无法区分有效的,理想的隐藏案例和意外的隐藏案例。我们尝试在以下情况下保留警告:(1)代码几乎肯定错误;(2)有一种直接的方法来重写代码,以便在所述代码所在的情况下消除警告事实上。

由于这个原因,这通常是一个理想的案例:

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

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

答案 1 :(得分:6)

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

仅供参考,属性通常是TitleCased,而本地人则是camelCased。使用该约定可以防止命名冲突,例如您列出的冲突。

答案 2 :(得分:2)

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

编辑: 鉴于这些信息,您可以从编译器的角度看出为什么这是完全有效的。它是否应该给你一个警告很有意思。正如Mitch Wheat在他的评论中指出的那样,像ReSharper这样的工具会警告你这些事情,但是如果编译器应该警告你因为词法范围处理它的事情而发生冲突,这是值得商榷的。对于补充工具来说,似乎更像是一份工作。

答案 3 :(得分:0)

这实际上与私有字段的一种命名模式一致,但我更喜欢_fieldName:

public class MyClass
{
    private string myMessage;

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