我只是在C#中遇到一个小问题,这只是一个复制粘贴错误,但不知道C#是如何接受的。
此代码已成功编译...如何
namespace DemoNS
{
class DemoClass
{
String _ = new String('a', 1);
}
}
名为_
的变量是否有任何默认重要性?
答案 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)
_
是与a
或i
相同的有效字符,语法变量可以以_
开头,因此_
的单个字符名称是完美的语法正确。不是一个非常好的选择,但会编译并正常工作。
答案 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()
{ }
}