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

时间:2011-06-10 14:52:25

标签: c# naming-conventions identifier

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

此代码已成功编译...如何

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

名为_的变量是否有任何默认重要性?

5 个答案:

答案 0 :(得分:39)

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

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

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

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

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

答案 1 :(得分:28)

现在有了C#7.0,_有时会有意义。它成为新out var功能的 discard operator 。它在函数返回值时使用,并且您希望通知编译器您不会使用它 - 因此可以对其进行优化。或者在解构(另一个C#7.0特性)时,您可以使用它来忽略您不感兴趣的元组部分。

示例 out var

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之前一样。

答案 2 :(得分:6)

_是与ai相同的有效字符,语法变量可以以_开头,因此_的单个字符名称是完美的语法正确。不是一个非常好的选择,但会编译并正常工作。

答案 3 :(得分:0)

之前的答案都很有用,但我认为他们错过了一个用例。 如果要处理函数的返回值,可以使用 _ 字符,即:

代替

int returnvalue = RandomFunction();

你可以做到

_ = RandomFunction();

答案 4 :(得分:0)

它是一个丢弃,它是一个占位符变量并且未使用。它告诉编译器对输出值不感兴趣。 示例: 创建了一个文件处理类。构造函数将启动该过程。而且,我们有复制、删除操作。假设,一个特定的类有责任启动进程但不需要担心其他操作。然后我会声明像 _ = new FileListener(); 我不会担心输出。 其他类可以实例化 FileListener obj = new FileListener(); 或者可以调用其他操作作为 FileListener.CopyFile()

示例:

    class Program
        {
            static void Main(string[] args)
            {
   /// Ignore the instance value but initialized the operation by instantiation
                _ = new FileListener();
                
                Console.WriteLine("Hello World!");
            }
        }
        
        public class FileListener 
        {
            public FileListener()
            {
                /// Logic to listen external file changes
            }
            public static void DeleteFile()
            { }
            public static void CopyFile()
            { }
        }