C# C“变量名”_&引用;(下划线)仅限

C# C“变量名”_&引用;(下划线)仅限,c#,naming-conventions,identifier,C#,Naming Conventions,Identifier,我刚刚在C#中遇到了一个小问题,这只是一个复制粘贴错误,但不知道C#如何接受它 这段代码编译成功了…如何 namespace DemoNS { class DemoClass { String _ = new String('a', 1); } } 名为\uu的变量是否有默认意义?不,没有默认意义,\u只是一个变量名,与其他变量名一样 我喜欢以类似于Prolog的匿名变量的方式使用它:当您创建忽略其参数之一的lambda时,您可以将其命名

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

这段代码编译成功了…如何

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

名为
\uu
的变量是否有默认意义?

不,没有默认意义,
\u
只是一个变量名,与其他变量名一样

我喜欢以类似于Prolog的匿名变量的方式使用它:当您创建忽略其参数之一的lambda时,您可以将其命名为
\u

EventHandler handler = (_, e) => Console.WriteLine(e);
另一方面,我不会在其他地方使用它,您应该使用描述性名称


编辑:请注意,在C#7.0中,
有时有特殊含义。例如,您可以编写
\=新字符串('a',1)
,即使您没有声明名为
\uu
\u
的变量也是有效字符,与
a
i
相同,从语法上讲,变量可以以
\u
开头,因此
\u
的单个字符名在语法上是完全正确的。这不是一个很好的选择,但编译和工作都很好。

如今,在C#7.0中,
\uuu
有时确实很重要。它成为新的
out var
功能的丢弃运算符。当一个函数返回一个值,并且您希望通知编译器您将不使用它时,可以使用它,这样就可以对它进行优化。或者在解构(另一个C#7.0特性)时,您可以使用它忽略您不感兴趣的元组部分

示例 输出变量

示例 解构元组

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
如果您确实声明了自己的名为
\uu
的变量,然后使用discard运算符,则会出现问题,这将导致歧义。这一问题已有报道

编辑 正如@maf soft在评论中指出的,上述问题不是问题。如果声明了
,它将被视为一个正则变量,就像C#7.0之前一样

编辑2021有点过期

在c#8.0中也成为开关表达式中的catch-all运算符,正式命名为

示例放弃运算符

var moreThan20 = val switch
{
    >20 => "Yes",
    >50 => "Yes - way more!",
    _ => "No",
};

discard运算符在没有其他模式匹配时指定一个值,但要注意:不要使用它。lambdas中的惯用用法是不关心参数。这里有一个标识符规范供参考(尽管有点过时):@Justin:呃,我做了很多函数编程(OCaml等)这可能是一个习惯。下划线在Python中也是惯用的,当您不关心参数/参数/值时。正如svick所指出的,它与任何其他名称一样有效。然而,调用变量
\uuu
可能是非常糟糕的做法。我想问一下,为什么您认为它会或不应该工作?当然,我没有使用“\uu”作为变量名。我只是在不知情的情况下给它命名。我想补充一点,如果您声明一个名为
\uuuuu
的变量,它会像以前一样使用,所以旧代码不会中断(您的答案中没有完全清楚)。这对我来说没关系,但也许一个警告是好的。我不确定丢弃操作符是否真的属于
out var
功能(是的,你的源链接给人留下了这样的印象)。@maf soft你是对的。另一个有趣的参考:-有趣的是,对于discard操作符的其他想法是使用
void
关键字:)这非常出乎意料。它不像C#。这对C不再有效#
var moreThan20 = val switch
{
    >20 => "Yes",
    >50 => "Yes - way more!",
    _ => "No",
};