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

标签 c#

在编写简短的辅助函数时,我经常发现自己想使用变量标识符“value”作为参数。当我这样做时,Visual Studio 似乎可以很好地编译它,并且没有任何提示:

public void MyMethod(int value, bool option, string message)
{
    value = 1;
    // More code...
}

但是,Visual Studio 会提示以下内容(如预期的那样):

private int _myProperty;
public int MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        int value = 0;
        _myProperty = value;
    }
}

这让我相信“值(value)”是否被视为关键字取决于上下文。我是 C# 的新手,据我所知,我还没有在其他语言中看到特定于上下文的关键字。

问题: 在属性 setter 之外使用“值”作为变量名总是安全的吗?如果不能,什么时候可以安全地完成?而且,这通常被认为是不好的做法吗?

令我惊讶的是,我无法在 SO 上找到已经问过的这个问题,而且我怀疑之前有人问过它。但是,很难搜索,因为很多帖子的标题中都有“变量”和“标识符”。我无法在 MSDN 上找到关于此的信息。

编辑: 最后一个问题是要询问它是否经常通常 不受欢迎。它已被更改以反射(reflect)这一点。

最佳答案

这是MSDN说:

The set accessor resembles a method whose return type is void. It uses an implicit parameter called value, whose type is the type of the property.

这些属性基本上是语法糖,可以避免您编写大量的 get_Barset_Bar 方法(注意:还有一些其他优点,CLR 知道它是属性(property))。例如,如果您有这样一个类:

public class Foo
{
    private int _bar;
    public int Bar
    {
        get { return _bar; }
        set { _bar = value; }
    }
}

它将生成如下所示的 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

这里要注意的是 set_Bar 方法接受一个名为 value 的参数。因此,它不仅“类似于”返回类型为 void 且带有名为 value 的参数的方法,而且实际上就是这样。

因此,很明显,您不能将 value 用于 setter 中的其他内容。

现在您应该在其他地方使用它吗?这取决于。如果在您使用它的上下文中很明显它指的是什么,那么可以肯定。如果 value 在特定上下文中不明确,则使用更明确的内容。

来自 MSDN :

The contextual keyword value is used in the set accessor in ordinary property declarations.

它没有提及将 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?
    }
 }

现在您可以使用 this.value = value 消除歧义,但它仍然很丑陋,对我来说最好为您的字段使用不同的名称。

关于c# - 在 C# 中使用 "value"作为标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31391991/

相关文章:

c# - WriteableBitmap 错误地呈现 PNG

c# - System.Threading.Timer 中的回调过程中的 FOR 循环导致它仅触发一次

c# - Listbox 手动 DrawItem 大字体

c# - Android RatingBar的MvvmCross实现

c# - 如何抑制 stylecop 错误 SA1650(拼写错误的单词)

c# - 是否可以创建一个在创建对象时调用的扩展方法?

c# - 如何在我的在线站点中引入在线数据库

c# - 调用AzureInformationProtection Powershell命令时出现C#Microsoft InformationProtection解密错误

c# - 将变量读入 GridView asp.net 4 c# 中 TemplateField 中的 NavigateUrl

c# - Console.WriteLine 与打印