C# 使用;“价值”;作为C语言中的标识符#
在编写简短的助手函数时,我经常发现自己想要使用变量标识符“value”作为参数。当我这样做时,Visual Studio似乎很好地编译了这篇文章,并且没有任何抱怨:C# 使用;“价值”;作为C语言中的标识符#,c#,C#,在编写简短的助手函数时,我经常发现自己想要使用变量标识符“value”作为参数。当我这样做时,Visual Studio似乎很好地编译了这篇文章,并且没有任何抱怨: public void MyMethod(int value, bool option, string message) { value = 1; // More code... } 但是,Visual Studio抱怨如下(如预期的那样): 这让我相信“值”被视为一个关键字(或不是),这取决于上下文。我对C#相当
public void MyMethod(int value, bool option, string message)
{
value = 1;
// More code...
}
但是,Visual Studio抱怨如下(如预期的那样):
这让我相信“值”被视为一个关键字(或不是),这取决于上下文。我对C#相当陌生,据我所知,我还没有在其他语言中看到上下文特定的关键字
问题是:
在属性设置器之外使用“value”作为变量名是否总是安全的?如果没有,何时才能安全完成?而且,这经常被认为是不好的做法吗
我很惊讶我没能发现这个问题已经被问到了,我怀疑以前有人问过。然而,这是很难搜索,因为这么多的职位有“变量”和“标识符”的标题。我无法在MSDN上找到有关此的信息
编辑:最后一个问题的意思是问人们是否经常或通常对它皱眉。它已被更改以反映这一点。在属性设置器中,变量名
值
是保留的。它用作可分配给支持字段的变量的名称
问题是:在属性设置器之外使用“value”作为变量名是否总是安全的?如果没有,何时才能安全完成?那么,这被认为是不好的做法吗
它只在属性设置程序中保留。这是一个非常通用的名称,但它通常是您正在使用的变量的最佳描述
由于“其他已应答”值是为属性保留的,但“值”并不是专门为方法保留的,因此,您可以在除“属性设置器”之外的任何地方为变量使用值 但是,如果在get中设置值,它将正常工作 好 不好
public int MyProperty { get { ... } set { int value = 0; _MyProperty = value }}
下面是我所说的:
集合访问器类似于返回类型为void的方法。它使用一个名为value的隐式参数,其类型是属性的类型
这些属性基本上是语法上的糖分,避免了编写大量的get\u-Bar
和set\u-Bar
方法(注意:CLR知道这是一个属性,还有其他一些优点)。例如,如果您有这样一个类:
public class Foo
{
private int _bar;
public int Bar
{
get { return _bar; }
set { _bar = value; }
}
}
.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
它将生成如下所示的IL(用于setter):
public class Foo
{
private int _bar;
public int Bar
{
get { return _bar; }
set { _bar = value; }
}
}
.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\u Bar
方法采用一个名为value
的参数。因此,它不仅“类似于”一个返回类型为void的方法,还带有一个名为value
的参数,实际上就是这样
显然,您不能在setter中使用value
现在你应该在其他地方使用它吗?视情况而定。如果在您使用它的上下文中它所指的内容很明显,那么请确定。如果value
在特定上下文中不明确,则使用更明确的内容
发件人:
上下文关键字值在普通属性声明的集合访问器中使用
它没有提到将value
视为关键字的任何其他上下文,因此除了setter或其他可能已经定义了它的地方之外,您应该可以使用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#有两种类型的关键字:全局关键字和上下文关键字
全局关键字永远不能用作标识符。上下文关键字仅在某些情况下保留。例如,当编译器发现代码不是查询时,可以使用大多数LINQ关键字作为变量或方法名
值仅在属性设置器中保留为参数名。在其他任何地方,您都可以使用它作为标识符,而且它通常是有意义的。我认为这个关键字的上下文不太可能扩展,因为很多程序都将它用作参数名,没有人喜欢破坏更改。在
集合
访问器之外的任何地方使用值
作为标识符都是可以的。报告说:
由于集合访问器隐式具有名为value
的参数,
这是局部变量或常量的编译时错误
集合访问器中的声明,以使用该名称
单词value
在C#中不是(也从来不是)完整的关键字,即使它从C#1开始就在setter中有这种特殊用途
更多信息,请参阅
当然,如果您有一个名为value
的字段(类级别变量),并且您希望从集合
访问器中访问它,请使用this.value
(或者类型的名称.value
用于静态
字段)
有关真实关键字和上下文“关键字”的列表,请参见。C#。在新版本的语言中使用它们的主要原因是避免破坏现有编译代码的更改。上下文关键字允许它们添加新的语义,而不会破坏以前有效的代码
正如Eric的文章中提到的,您可以始终使用
@
作为前缀,以便能够使用关键字作为标识符。我认为这样做的主要优点是能够使用不同的关键字集与其他CLR语言中开发的其他LIB进行互操作,其中C#关键字(保留或上下文)可能不是该其他语言中的关键字。value
已经定义,所以不能在属性设置器中重新定义它。这不是一个关键词,而是