Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Variable Name "_" (underscore) only

I was just hit with a minor issue in C#, it was just a copy-paste mistake but don't know how 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 _?

like image 491
Samy Avatar asked Jun 10 '11 14:06

Samy


2 Answers

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

like image 96
MotKohn Avatar answered Sep 22 '22 15:09

MotKohn


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 _.

like image 36
svick Avatar answered Sep 19 '22 15:09

svick