如果失败,“out”参数应该是什么?

时间:2016-01-17 00:18:36

标签: c# .net null software-design

我已阅读此相关问题:What should the out value be set to with an unsuccessfull TryXX() method?

然而,这个问题涉及原始类型,如整数等。

我正在实施类似的TryXXX,该问题的答案表明,当方法不成功时,out的默认值应为null。但是,我的方法中的out类型是一个不可为空的值类型。

以我的代码为例:

    public bool TryParseFileLine(string fileLine, out FileResult result)
    {
        if(!string.IsNullOrWhiteSpace(fileLine))
        {
            result = null;
            return false;
        }
        // Logic here for if the string wasn't empty etc.
    }

    public struct FileResult
    {
        public bool IsValid;
        public string Value;
    }

result = null行无法编译,因为Cannot convert null to 'FileResult' because it is a non-nullable value type

所以在我的情况下,当方法失败时,result的值应该是多少?理想情况下,我希望它为null,因为这对我来说是最有意义的。

编辑:在这里使用Nullable<FileResult>是个好主意吗?例如:

        public bool TryParseFileLine(string fileLine, out Nullable<FileResult> result)
    {
        if(!string.IsNullOrWhiteSpace(fileLine))
        {
            result = null;
            return false;
        }
        // Logic here for if the string wasn't empty etc.
        result = new FileResult();
    }

2 个答案:

答案 0 :(得分:3)

根据经验,使用default(FileStruct)(并确保值具有某种意义 - 它相当于值类型的new FileStruct()),或者更好, scratch完全使用out参数并返回可为空的FileStruct?值。

public FileResult? TryParseFileLine(string fileLine)
{
    if (string.IsNullOrWhiteSpace(fileLine))
        return null;

    ...
}

bool TrySomething(out Result result)模式早于langugage中的可空结构,并且IMHO不应该用于新代码,因为它使调用者不方便(因为需要在大多数时间声明一个额外的变量) 。
使用可空结构作为返回值对调用者来说更好,并且不要求您在代码中返回无意义的值。

答案 1 :(得分:2)

  

当方法失败时,结果的值应该是多少?

您只需使用default(FileStruct)

这将为您提供具有默认值的FileStruct。但是你不会关心它,因为你只在返回false时这样做,因此调用者不会使用这个值。