发生故障时,“out”参数应该是什么

本文关键字:参数 是什么 out 故障 | 更新日期: 2023-09-27 18:30:37

我已经阅读了这个相关问题:使用不成功的 TryXX() 方法应该将 out 值设置为什么?

但是,该问题涉及原始类型,例如整数等。

我正在实现一个类似的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的值应该是多少?理想情况下,我希望它是空的,因为这对我来说最有意义。

编辑:在这里使用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();
    }

发生故障时,“out”参数应该是什么

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

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

bool TrySomething(out Result result)模式早于语言中的可为空结构,恕我直言,不应将新代码用于新代码,因为它使调用者不方便(因为大多数时候需要声明一个额外的变量)。
使用可为 null 的结构作为返回值对调用方来说要好得多,并且不需要在代码中返回无意义的值。

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

您可以简单地使用 default(FileStruct) .

这将为您提供具有默认值的FileStruct。但是您不会关心它,因为您仅在返回false时才执行此操作,因此调用方不应使用此值。