C# 什么';这是不更新out变量的正确方法

C# 什么';这是不更新out变量的正确方法,c#,C#,我为类MinMax实现了TryParse函数,如下所示: public static bool TryParse(string s, out MinMax result) { var parts = s.Split(' '); if (parts.Length != 2) { return false; } float min; float max;

我为类
MinMax
实现了
TryParse
函数,如下所示:

    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;

但是这一行会发出警告。

不更新out变量的唯一正确方法是抛出异常。将
out
更改为
ref

通过ref:

public static bool TryParse(string s, ref MinMax result) 
这意味着您必须确保
结果
参数已初始化


更新:最好坚持众所周知的
TryParse
语义。(我有时会因为回答真正的问题而受到批评,而不是被问到的问题!在这种情况下,情况正好相反!)

鉴于out参数甚至不需要由调用方初始化,您真的需要对它做些什么


您可以改为使用ref参数,这些参数不需要您在函数中触摸它们。

假设MinMax是引用类型,只需将其赋值为null即可。就像任何其他TryParse方法一样

查看此代码:

    string s = "12dfsq3";
    int i = 444;
    int.TryParse(s, out i);
    Console.WriteLine(i);

我将被设置为0,而不是保持在444。

我不喜欢这些答案告诉您使用
ref
参数,因为它会更改方法的语义,并要求调用方传递初始化值

result
设置为
MinMax
的默认值,如果是引用类型,则为
null
,或者使用
default
运算符

result = default(MinMax);

您必须设置
out
变量的值。您可以像其他答案所建议的那样使用
ref
,但我不推荐使用它-这不是标准
TryParse
模式的工作原理。此外,这是丑陋的和不必要的

失败案例中的
result
包含什么并不重要,因为返回的
bool
指示解析是否成功。只需返回
新的最小值(0,0)
或者,如果您愿意,
默认值(最小值)


好的,我最初希望
result
在解析失败时保持它的值,但是如果所有其他
TryParse
方法分配
null
,我想最好遵循这种模式,改为适应代码的客户机。将在三分钟内接受;)当然不是?这会更改调用的语义,并建议调用方可以为
result
提供一个值。事实上,编译器将要求它们这样做
ref
应该非常、非常、非常节省地在IMHO中使用,而不是在这里使用。@batwad:海报上说“我希望能够使用该函数,以便在解析失败时,传递到该函数中的参数保持不变”,如果MinMax是
class
它的引用类型,并且如果您不喜欢它的设置值(即在您的情况下)正如米奇·麦特(Mitch Wheat)所说,你不应该把它作为
传递出去。
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;
}