在声明点使用变量作为 out 参数

本文关键字:out 参数 变量 声明 | 更新日期: 2023-09-27 18:11:59

在阅读答案的评论时,我看到了以下结构来声明和初始化变量:

int variable = int.TryParse(stringValue, out variable) ? variable : 0;

这在 C# 中是否允许、正确且定义良好?引擎盖下会发生什么?是否会发生以下情况?

  1. variable首先初始化为零吗?
  2. 然后传递给int.TryParse(分配一个值(?
  3. 然后可以选择读取(如果int.TryParse返回true(?
  4. 然后,再次分配/初始化?

在声明点使用变量作为 out 参数

是的,你适合执行。您还可以查看此处生成的 MSIL

C# 代码

 string stringValue = "5";
 int variable = int.TryParse(stringValue, out variable) ? variable : 0;

生成的 MSIL

1.  IL_0000:  nop    
2.  IL_0001:  ldstr      "5" // load string
3.  IL_0006:  stloc.0
4.  IL_0007:  ldloc.0
5.  IL_0008:  ldloca.s   variable
6.  IL_000a:  call       bool [mscorlib]System.Int32::TryParse(string, int32&)
7.  IL_000f:  brtrue.s   IL_0014
8.  IL_0011:  ldc.i4.0
9.  IL_0012:  br.s       IL_0015
10. IL_0014:  ldloc.1
11. IL_0015:  stloc.1
12. IL_0016:  ret

这澄清了它在幕后做什么。

语句 5 将变量分配到堆栈上。语句 6 正在调用该方法。语句 7,8,9 实际上是在执行布尔表达式。

这是一个恰好有效的技巧,因为它只是对普通 if 语句的重写。此代码等效于以下内容:

int variable;
if (int.TryParse(stringVariable, out variable))
    variable = variable;
else
    variable = 0;

顺序如下:

调用int.TryParsevariable在此之前未初始化,但也不必初始化。out参数不需要明确的赋值变量。作为方法执行的一部分,将给variable一个值,int.TryParse将返回truefalse

如果该方法返回true表达式的结果将被variable,因此我们将基本上执行variable = variable

如果该方法返回false表达式的结果将改为0,并且variable现在将被赋予值0,而不管它作为int.TryParse的一部分给出什么。但是,在这种情况下,这不会更改变量,因为int.TryParse在返回false时已经为variable提供了一个默认值,该默认值也恰好是0

这基本上是一种将所有内容都放在一条线上的方法。

就个人而言,我会像这样编写这段代码:

int variable;
int.TryParse(stringValue, out variable);

>int variable声明variableout variable必然初始化它。这两件事都必须在任何地方使用variable之前发生,并且由于out声明,这是正确的。

正如 Lasse V. Carlsen 在 TryParse 文档中指出的那样,如果转换失败,TryParse默认情况下会为其分配 0 的值:

此方法返回时,[ return ] 包含 32 位有符号整数值,如果转换成功,则包含与 s 中包含的数字等效的值,如果转换失败,则包含零。 (我的(

如果将三元函数展开,您将看到:

int variable;
if (int.TryParse(stringValue, out variable))
    variable = variable;
else
    variable = 0;

这本身就是一种法律表达。两条路径是:

  • TryParse 将值分配给 variable 并返回 true,从而导致将variable分配给自身
  • TryParsevariable初始化为 0 并返回 false,导致三元条件将variable赋值为零

不过,这不是特别清晰的代码,我不建议这样做。

我还没有打开Visual Studio来尝试这个,但是是的,这是允许的。

这一切都取决于"stringValue"变量。 如果可以解析为整数,则int.TryParse将返回 true,并且 [变量] 将具有整数值。 否则,variable将设置为 0。

这是否有助于代码的可读性? 显然不是。