在这个问题的背面有点询问out参数的行为,但更关注的是为什么这些TryParse方法使用out而不是ref.
在某些情况下,您确实希望在解析之前初始化参数的值,并在解析失败时保留该值但不关心它是否失败.但是由于out参数,值被重置.
这种情况看起来像这样......
int arg = 123;
Int32.TryParse(someString, ref arg);
Run Code Online (Sandbox Code Playgroud)
但是由于out参数我们必须这样写,这更详细...
int arg;
if(!Int32.TryParse(someString, out arg)
{
arg = 123;
}
Run Code Online (Sandbox Code Playgroud)
我知道知道解析失败可能非常有用,但使用ref并不排除这一点.
那么为什么这些TryParse方法使用out而不是ref?
SLa*_*aks 13
因为正常使用模式与您所描述的完全相反.
人们应该能够写作
int arg;
if (!Int32.TryParse(someString, ref arg)) {
Waaah;
}
Run Code Online (Sandbox Code Playgroud)
如果TryParse采用ref参数,则需要无用的初始化.
真正的问题是为什么没有int? int.TryParse(string)方法.
您out用来表示该参数未被使用,仅用于设置.调用者需要在方法返回之前分配值:
int n;
if (Int32.TryParse("47", out n)) { // Works fine; `n` will be set to the
// .. // result of the parse.
}
Run Code Online (Sandbox Code Playgroud)
如果你使用过ref,你必须事先初始化这个值,这很愚蠢,因为无论如何它都会被覆盖:
int n;
if (Int32.TryParse("47", ref n)) { // Kablammo! `n` isn't initialized.
// ..
}
Run Code Online (Sandbox Code Playgroud)
这正是TryParse的要点:您可以保证在out参数中有一个值来表示解析尝试的输出.返回值true或false表示您是否应该关心结果或忽略它.