我在C#7阅读新出的可变功能在这里.我有两个问题:
它说
我们允许"丢弃"作为输出参数,以a的形式
_,让你忽略你不关心的参数:Run Code Online (Sandbox Code Playgroud)p.GetCoordinates(out var x, out _); // I only care about x
问:我想这只是一个信息而不是C#7的新功能,因为我们也可以在C#7.0之前这样做:
var _;
if (Int.TryParse(str, out _))
...
Run Code Online (Sandbox Code Playgroud)
或者我在这里遗失了什么?
当我在同一博客中提到时,我的代码会出错:
~Person() => names.TryRemove(id, out *);
Run Code Online (Sandbox Code Playgroud)
*不是有效的标识符.Mads Torgersen的疏忽我猜?
Dav*_*rno 97
C#7中的丢弃可以在声明变量的任何地方使用,顾名思义 - 丢弃结果.因此丢弃可以与变量一起使用:
p.GetCoordinates(out var x, out _);
Run Code Online (Sandbox Code Playgroud)
它可以用来丢弃表达式结果:
_ = 42;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,
p.GetCoordinates(out var x, out _);
_ = 42;
Run Code Online (Sandbox Code Playgroud)
没有变量_,正在引入.只有两种使用丢弃的情况.
但是,如果_范围中存在标识符,则不能使用丢弃:
var _ = 42;
_ = "hello"; // error - a string cannot explicitly convert from string to int
Run Code Online (Sandbox Code Playgroud)
例外情况是将_变量用作out变量.在这种情况下,编译器会忽略该类型或var将其视为丢弃:
if (p.GetCoordinates(out double x, out double _))
{
_ = "hello"; // works fine.
Console.WriteLine(_); // error: _ doesn't exist in this context.
}
Run Code Online (Sandbox Code Playgroud)
请注意,只有在这种情况下out var _或out double _使用时才会出现这种情况.只需使用out _然后它被视为对现有变量的引用_,如果它在范围内,例如:
string _;
int.TryParse("1", out _); // complains _ is of the wrong type
Run Code Online (Sandbox Code Playgroud)
最后,*在关于丢弃物的讨论的早期提出了这种符号,但_由于后者是其他语言中更常用的符号而被放弃了.
Cyb*_*ogs 22
_C#7中Discard运算符的另一个例子是模式匹配语句中的类型变量,object该switch语句最近在C#7中添加:
码:
static void Main(string[] args)
{
object x = 6.4;
switch (x)
{
case string _:
Console.WriteLine("it is string");
break;
case double _:
Console.WriteLine("it is double");
break;
case int _:
Console.WriteLine("it is int");
break;
default:
Console.WriteLine("it is Unknown type");
break;
}
// end of main method
}
Run Code Online (Sandbox Code Playgroud)
此代码将匹配类型并丢弃传递给的变量case ... _.
Sid*_*Sid 12
请考虑以下代码段
static void Main(string[] args)
{
//....
int a;
int b;
Test(out a, out b);
Test(out _, out _);
//....
}
private static void Test(out int a, out int b)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
这就是发生的事情:
...
13: int a;
14: int b;
15:
16: Test(out a, out b);
02340473 lea ecx,[ebp-40h]
02340476 lea edx,[ebp-44h]
02340479 call 02340040
0234047E nop
17: Test(out _, out _);
0234047F lea ecx,[ebp-48h]
02340482 lea edx,[ebp-4Ch]
02340485 call 02340040
0234048A nop
...
Run Code Online (Sandbox Code Playgroud)
正如你在幕后看到的那样,这两个电话正在做同样的事情.
正如@ServéLaurijssen指出的那样,很酷的事情是,如果您对某些值不感兴趣,则不必预先声明变量.
关于第一个问题
我想这只是一个信息而不是C#7的新功能,因为我们也可以在C#7.0之前这样做.
Run Code Online (Sandbox Code Playgroud)var _; if (Int.TryParse(str, out _)) // ...
新颖性是你不必_在表达式内外声明,你只需键入即可
int.TryParse(s, out _);
Run Code Online (Sandbox Code Playgroud)
尝试在C#7之前做一个班轮:
private void btnDialogOk_Click_1(object sender, RoutedEventArgs e)
{
DialogResult = int.TryParse(Answer, out _);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23153 次 |
| 最近记录: |