让我说我有这个
public class MyClass
{
public string myMessage { get; set; }
void MyMethod()
{
string myMessage;
}
}
我不应该在myMessage
隐藏(?)类中的MyMethod
属性时收到关于myMessage
的提醒吗?我建立时,我没有得到任何效果。我如何激活此检查?
答案 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;
}
}