仅限C#变量名称“_”(下划线)

问题描述 投票:17回答:3

我只是在C#中遇到一个小问题,这只是一个复制粘贴错误,但不知道C#是如何接受它的。

这段代码成功编译......怎么样

namespace DemoNS
{
    class DemoClass
    {
        String _ = new String('a', 1);        
    }
}

名为_的变量是否有任何默认值?

c# naming-conventions identifier
3个回答
39
投票

不,没有默认意义,_只是一个变量名称,就像其他任何名称一样。

我喜欢以与Prolog的匿名变量类似的方式使用它:当你创建一个忽略其中一个参数的lambda时,你可以将它命名为_

EventHandler handler = (_, e) => Console.WriteLine(e);

另一方面,我不会在其他任何地方使用它,你应该使用描述性名称。

编辑:请注意,在C#7.0中,_有时具有特殊含义。例如,即使您没有声明名为_ = new String('a', 1);的变量,也可以编写_


34
投票

如今,随着C#7.0,_有时具有重要意义。它成为新的out var功能的丢弃运营商。它在函数返回值时使用,并且您希望通知编译器您不会使用它 - 因此可以对其进行优化。或者在解构(另一个C#7.0功能)时,您可以使用它来忽略您不感兴趣的元组的一部分。

变量示例

void Test(out int i) => i = 1;

Test(out _); // _ was never declared, it will still compile in C# 7.0

var r = _;   // error CS0103: The name '_' does not exist in the current context

解构元组的示例

var Person = ("John", "Smith");

var (First, _) = Person; // '_' is not a declared

Debug.Print(First); // prints "John"
Debug.Print(_); // error CS0103: The name '_' does not exist in the current context

如果您声明自己的名为_的变量然后使用discard运算符会导致歧义,则会出现问题。这个问题已被报道Here

编辑上面的问题不是问题,因为@ maf-soft在评论中指出。如果宣布_它被视为常规变量,就像它在C#7.0之前一样。


6
投票

_是一个有效的字符,与ai相同,语法变量可以从_开始,因此单个字符名称_在语法上是完全正确的。不是一个非常好的选择,但将编译和工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.