I was just hit with a minor issue in C#, it was just a copy-paste mistake but don't know how开发者_如何学Python C# accept it.
This code gets compiled successfully...HOW
namespace DemoNS
{
class DemoClass
{
String _ = new String('a', 1);
}
}
Is there any default significance of variable named _
?
Nowadays with C# 7.0 the _
does have significance sometimes. It became the discard operator for the new out var
feature. It is used when a function returns a value and you want to notify the compiler that you won't be using it - so it can be optimized out. Or when deconstructing (Another C# 7.0 feature) you can use it to ignore part of the tuple that you are not interested in.
Example 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
Example deconstructing a Tuple
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
A problem arises if you do declare your own variable named _
and then use the discard operator it will cause ambiguity. This issue has been reported Here.
EDIT
Above problem is not a problem as @maf-soft points out in comments. If _
was declared it is treated like a regular variable like it was pre C# 7.0.
EDIT 2021 A little overdue
In c# 8.0 _
also became the catch all operator in a switch expression, officially named the discard operator
Example discard operator
var moreThan20 = val switch
{
>20 => "Yes",
>50 => "Yes - way more!",
_ => "No",
};
The discard operator assigns a value when no other pattern matches
No, there is no default significance, _
is just a variable name like any other.
I like to use it in similar way to Prolog's anonymous variables: when you're creating a lambda that ignores one of its parameters, you can name it _
:
EventHandler handler = (_, e) => Console.WriteLine(e);
On the other hand, I wouldn't use it anywhere else, you should use a descriptive name instead.
EDIT: Note that in C# 7.0, _
sometimes has special meaning. For example, you can write _ = new String('a', 1);
, even if you didn't declare a variable named _
.
The previous answers were all useful, but I think they missed a use case.
If you don't want to work with a function's return value, you can use the _
character, i.e.:
instead of
int returnvalue = RandomFunction();
you can do
_ = RandomFunction();
Its a discards, which is a placeholder variable and unused. It tells compiler that not interested in output value. Example: Created a File handing class. Constructor will initiate the process. And, we have Copy, Delete operation. Suppose, one particular class has the responsibility to initiate the process but no need to worry about other operations. Then I will declare like _ = new FileListener(); I will not worry about output. Other class can have instantiate FileListener obj = new FileListener(); or can call other operation as FileListener.CopyFile()
Sample:
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()
{ }
}
_
is a valid character the same as a
or i
and syntactically variables can start with _
so a single character name of _
is perfectly syntactically correct. Not a really good choice but will compile and work fine.
精彩评论