我为类TryParse
实现了MinMax
函数,如下所示:
public static bool TryParse(string s, out MinMax result)
{
var parts = s.Split(' ');
if (parts.Length != 2)
{
return false;
}
float min;
float max;
if (!float.TryParse(parts[0].Trim(), out min) || !float.TryParse(parts[1].Trim(), out max))
{
return false;
}
result = new MinMax(min, max);
return true;
}
然而,由于显然需要编写out参数,因此无法编译。解决这个问题的正确方法是什么?我希望能够使用该函数,以便在解析失败时,传递给它的参数保持不变。我想一种方法是添加类似的东西:
result = result;
但是此行会发出警告。
答案 0 :(得分:3)
通过参考:
public static bool TryParse(string s, ref MinMax result)
这意味着您必须确保初始化result
参数。
更新:最好坚持使用TryParse
的众所周知的语义。 (我有时因为回答真正的问题而被批评,而不是被问到的问题!在这种情况下,情况正好相反!)
答案 1 :(得分:2)
鉴于out参数甚至不需要由调用者初始化,你真的必须对它做一些事情。
您可以使用ref参数,这些参数不需要您在函数中触摸它们。
答案 2 :(得分:2)
假设MinMax是引用类型,只需为其指定null。就像任何其他TryParse方法一样。
查看此代码:
string s = "12dfsq3";
int i = 444;
int.TryParse(s, out i);
Console.WriteLine(i);
我将被设置为0而不是保留在444。
答案 3 :(得分:1)
不更新out变量的唯一正确方法是抛出异常。将out
更改为ref
。
答案 4 :(得分:1)
我不喜欢这些答案,告诉您使用ref
参数,因为它会更改方法的语义,并且需要调用者传递初始值。
将result
设置为MinMax
的默认值,如果它是引用类型,则为null
,或使用default
运算符。
result = default(MinMax);
答案 5 :(得分:0)
您必须设置out
变量的值。您可以使用ref
作为其他答案的建议,但我不建议这样做 - 这不是标准TryParse
模式应该如何工作的。此外,这是丑陋和不必要的。
失败案例中result
包含的内容并不重要,因为您返回的bool
表示解析是否成功。只需返回new MinMax(0, 0)
,或者,如果您愿意,可以default(MinMax)
:
public static bool TryParse(string s, out MinMax result)
{
string[] parts = s.Split(' ');
if (parts.Length == 2)
{
float min, max;
if (float.TryParse(parts[0].Trim(), out min)
&& float.TryParse(parts[1].Trim(), out max))
{
result = new MinMax(min, max);
return true;
}
}
result = default(MinMax); // or just use "result = new MinMax(0, 0);"
return false;
}