Scope变量与输出参数
实施例:Scope变量与输出参数
我有以下代码块:
if (!int.TryParse("123", out var parsedNumber))
{
return;
}
Console.WriteLine(parsedNumber);
在控制台的输出是:123
问题:
那怎么可能呢,那行Console.WriteLine(parsedNumber);
知道parsedNumber
?
据我了解,parsedNumber
应该只在if-block
中可用,应该不是吗?
如果我试试这个:
foreach (var data in dataList)
{
data += "something";
}
Console.WriteLine(data);
Console.WriteLine(data);
找不到data
。
我认为,解决方案是out参数,但我不确定。有人可以解释这个吗?
是的,因为你怀疑区别在于“out”修饰符。
,它在C#7,使您可以在您想要使用它作为参数点声明变量增加了一个功能。
这可能是方便,否则你就必须在方法调用之前声明parsedNumber
。
你可以在这里阅读更多关于它的信息,在“输出变量”下。
https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
编辑
至于为什么变量仍然在范围,如果外面,那肯定会引起混乱,但实现这个的时候,专门为它设计的选择“如果“的情况下,并确切地说,它可以用于”尝试“的方法。
您可以参考此评论(其实你可以在整个讨论看看,看的角度有关于如何实现这一不同点)。
https://github.com/dotnet/roslyn/issues/12939#issuecomment-255650834
此前C#7.0
out关键字被用来传递一个方法参数的参考。在变量作为out参数传递之前,必须声明它。
var parsedNumber;
if (!int.TryParse("123", out var parsedNumber))
{
return;
}
Console.WriteLine(parsedNumber);
在C#7.0
您可以直接在方法定义一个方法的输出参数。新的代码看起来像
if (!int.TryParse("123", out var parsedNumber))
{
return;
}
Console.WriteLine(parsedNumber);
参考:
谢谢你的例子 –
我觉得他/她问的是,为什么会出如果(){},我们仍然可以访问到parsedNumber – EntryLeveDeveloper
@CodeContributor:是的,这也是有道理的,为我的答案添加了一个编辑来涵盖 – eugenioy
谢谢你的好解释。 –