不更新out变量的正确方法是什么

时间:2010-11-16 10:22:17

标签: c#

我为类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;

但是此行会发出警告。

6 个答案:

答案 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;
}