在编写简短的辅助函数时,我经常发现自己想要使用变量标识符"value"作为参数.当我这样做时,似乎Visual Studio编译这个很好,并且没有任何抱怨:
public void MyMethod(int value, bool option, string message)
{
value = 1;
// More code...
}
Run Code Online (Sandbox Code Playgroud)
但是,Visual Studio会在下面抱怨(正如预期的那样):
private int _myProperty;
public int MyProperty
{
get
{
return _myProperty;
}
set
{
int value = 0;
_myProperty = value;
}
}
Run Code Online (Sandbox Code Playgroud)
这使我相信"值"被视为关键字(或不是),具体取决于上下文.我是C#的新手,据我所知,我没有在其他语言中看到特定于上下文的关键字.
问题: 在属性设置器之外使用"value"作为变量名是否总是安全的?如果没有,何时可以安全地完成?而且,这通常被认为是不好的做法吗?
我很惊讶我无法在SO上找到这个问题,我怀疑有人之前曾问过这个问题.但是,搜索很困难,因为标题中有很多帖子有"变量"和"标识符".我无法在MSDN上找到有关此信息.
编辑:最后一个问题是要询问它是否经常或通常不赞成.它已经改变以反映这一点.
Mat*_*and 22
这是MSDN所说的:
set访问器类似于返回类型为void的方法.它使用名为value的隐式参数,其类型是属性的类型.
属性基本上是语法糖,避免你必须编写很多get_Bar和set_Bar方法(注意:还有一些其他优点,CLR知道它是一个属性).例如,如果您有这样的类:
public class Foo
{
private int _bar;
public int Bar
{
get { return _bar; }
set { _bar = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
它会生成IL(对于setter)看起来像这样:
.method public hidebysig specialname
instance void set_Bar(int32 'value') cil managed
{
//
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: stfld int32 Program/Foo::_bar
IL_0008: ret
} // end of method Foo::set_Bar
Run Code Online (Sandbox Code Playgroud)
这里要注意的是该set_Bar方法采用一个名为的参数value.因此,它不仅"类似"一个方法,其返回类型为void,并且调用了一个参数value,实际上就是这样.
value显然,你不能在setter中使用其他东西.
你应该在其他地方使用它吗?这取决于.如果你在使用它的上下文中明确指出它是什么,那么肯定.如果value在特定上下文中含糊不清,则使用更明确的内容.
来自MSDN:
contextual关键字值在普通属性声明中的set访问器中使用.
它没有提到value被认为是关键字的任何其他上下文,因此除了setter 或其他可能已经定义的地方之外,你应该没问题value.这是不好的做法吗?不作为一项规则,不超过任何其他可能含糊不清的变量名称.
编辑:我认为value作为一个名字的地方真的有问题的地方将是一个类中的字段(或更糟糕的属性).例如:
public class Foo
{
private int value;
public int Value
{
get { return value; }
set { value = value; } // which `value` are you setting? and to what?
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以删除这里的歧义this.value = value,但它仍然很丑,我觉得更好的方法就是为你使用不同的名字.
它是细使用value作为标识符的任何地方外set访问器.该(连接旧版本)C#语言规范说:
由于set访问器隐式地具有名为的参数
value,因此对于具有该名称的set访问器中的局部变量或常量声明,它是编译时错误.
Word value不是(也绝不是)C#中的完整关键字,即使它自从C#1以来在setter中有这种特殊用途.
有关更多信息,请参阅value(C#参考).
当然,如果您有一个字段(类级变量),value并且您想从set访问者中访问它,请使用this.value(或NameOfYourType.value用于static字段).
有关真实关键字和上下文"关键字"的列表,请参阅C#关键字.