我已阅读此相关问题: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();
}
答案 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
时这样做,因此调用者不会使用这个值。