在C#中使用"value"作为标识符

Mat*_*tin 29 c#

在编写简短的辅助函数时,我经常发现自己想要使用变量标识符"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上找到有关此信息.

编辑:最后一个问题是要询问它是否经常通常不赞成.它已经改变以反映这一点.

Jes*_*olt 22

在属性设置器中,value保留变量名称.它用作可以分配给支持字段的变量的名称.

问题:在属性设置器之外使用"value"作为变量名是否总是安全的?如果没有,何时可以安全地完成?而且,这被认为是不好的做法吗?

它只保留在属性设置器中.它是一个非常通用的名称,但它通常可以是您正在使用的变量的最佳描述.

MSDN信息


Mat*_*and 22

这是MSDN所说的:

set访问器类似于返回类型为void的方法.它使用名为value的隐式参数,其类型是属性的类型.

属性基本上是语法糖,避免你必须编写很多get_Barset_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,但它仍然很丑,我觉得更好的方法就是为你使用不同的名字.

  • @MattBurland显然MS认为[该参数应该被称为`d`](https://msdn.microsoft.com/en-us/library/system.math.sqrt(v = vs.110).aspx)(大概是为了"double")...但是他们使用`value`来表示其他函数[比如Abs](https://msdn.microsoft.com/en-us/library/f2yzeea2(v = vs.110).aspx) (2认同)

Jep*_*sen 8

它是细使用value作为标识符的任何地方外set访问器.该(连接旧版本)C#语言规范说:

由于set访问器隐式地具有名为的参数value,因此对于具有该名称的set访问器中的局部变量或常量声明,它是编译时错误.

Word value不是(也绝不是)C#中的完整关键字,即使它自从C#1以来在setter中有这种特殊用途.

有关更多信息,请参阅value(C#参考).

当然,如果您有一个字段(类级变量),value并且您想从set访问者中访问它,请使用this.value(或NameOfYourType.value用于static字段).


有关真实关键字和上下文"关键字"的列表,请参阅C#关键字.