在声明点使用变量作为 out 参数
本文关键字:out 参数 变量 声明 | 更新日期: 2023-09-27 18:11:59
在阅读答案的评论时,我看到了以下结构来声明和初始化变量:
int variable = int.TryParse(stringValue, out variable) ? variable : 0;
这在 C# 中是否允许、正确且定义良好?引擎盖下会发生什么?是否会发生以下情况?
variable
首先初始化为零吗?- 然后传递给
int.TryParse
(分配一个值(? - 然后可以选择读取(如果
int.TryParse
返回true
(? - 然后,再次分配/初始化?
是的,你适合执行。您还可以查看此处生成的 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.TryParse
,variable
在此之前未初始化,但也不必初始化。out
参数不需要明确的赋值变量。作为方法执行的一部分,将给variable
一个值,int.TryParse
将返回true
或false
。
如果该方法返回true
则表达式的结果将被variable
,因此我们将基本上执行variable = variable
。
如果该方法返回false
则表达式的结果将改为0
,并且variable
现在将被赋予值0
,而不管它作为int.TryParse
的一部分给出什么。但是,在这种情况下,这不会更改变量,因为int.TryParse
在返回false
时已经为variable
提供了一个默认值,该默认值也恰好是0
。
这基本上是一种将所有内容都放在一条线上的方法。
就个人而言,我会像这样编写这段代码:
int variable;
int.TryParse(stringValue, out variable);
>int variable
声明variable
,out 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
分配给自身 -
TryParse
将variable
初始化为0
并返回 false,导致三元条件将variable
赋值为零
不过,这不是特别清晰的代码,我不建议这样做。
我还没有打开Visual Studio来尝试这个,但是是的,这是允许的。
这一切都取决于"stringValue"变量。 如果可以解析为整数,则int.TryParse
将返回 true,并且 [变量] 将具有整数值。 否则,variable
将设置为 0。
这是否有助于代码的可读性? 显然不是。