我不应该得到一个编译器警告吗?我如何启用它?
比方说,我有MyMethod
隐藏(?)类上的myMessage
属性此我不应该得到一个编译器警告吗?我如何启用它?
public class MyClass
{
public string myMessage { get; set; }
void MyMethod()
{
string myMessage;
}
}
不应该我得到myMessage
警报?我没有得到任何东西,当我建立这种效果。我如何激活此检查?
我知道这种情况没有警告。在MyMethod()
之内,您可以使用this.myMessage
消除本地属性和类属性之间的歧义。
只是FYI,属性通常是TitleCased,而本地人是camelCased。使用该惯例可以防止像列出的那样命名冲突。
我正在转换一个旧的ASP页面,并试图将其全球化。我实际上并不希望两个版本的myMessage都可用。 – lincolnk 2010-08-25 14:52:38
结账Lexical Scoping。 MyMethod中的myMessage在新的范围中定义。在该方法中任何对myMessage的引用都将假定您引用了该范围中定义的变量。您可以使用this.myMessage访问在MyClass中定义的myMessage。
编辑: 鉴于这些信息,你可以看到为什么从编译器的角度来看这是完全有效的。是否应该给你一个警告是有趣的。正如Mitch Wheat在他的评论中指出的那样,像ReSharper这样的工具会警告你这些事情,但如果一个编译器应该警告你碰到某个与词法范围相关的事件时,这是值得商榷的。似乎更像是一种补充工具的工作。
我知道这是允许的,但感谢您提供一些很好的信息。 – 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")
。由于需要隐藏并且代码正确,我们不希望为隐藏产生警告。
在正面,ReSharper警告这个... – 2010-08-25 14:45:13
@Mitch小麦谢谢我会检查到这一点。 – lincolnk 2010-08-25 15:01:25