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

标签 c# naming-conventions identifier

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

此代码已成功编译...HOW

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

_ 变量有默认意义吗?

最佳答案

如今在 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 之前的版本一样。

EDIT 2021 有点晚了

在c# 8.0中,_也成为了switch表达式中的catch all操作符,正式命名为discard operator

示例丢弃运算符

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

丢弃运算符在没有其他模式匹配时分配一个值

关于仅限 C# 变量名称 "_"(下划线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308078/

相关文章:

c# - 找出有多少字符串匹配

c# - Container<ImplementerOfIInterface> 不是 Container<IInterface>。为什么不?

c# - 如何获得从对象到空间映射的距离

c# - 内部类和属性同名

java - 如何使用 Hibernate 实现自定义字符串序列标识符生成器

javascript - 是否有规范将元素的 id 设置为全局变量?

swift - 使用未解析的标识符 'result' swift 3

c# - Xamarin IDE 访问路径被拒绝

naming-conventions - 为什么 C 和 C++ 程序员用 "g"和 "k"前缀变量?

java - 如何在java中访问单例并为其命名?