FileInfo的空对象模式

4
我有一个方法,它返回一个 FileInfo 对象。在调用该方法后,会调用 fooFile.FullName
一切都很好,但是有一种情况,FileInfo 可能为 null,但我不想在调用该方法时进行(丑陋的)空检查。
我需要的是一种空的 FileInfo(Null-Object-Pattern)。当调用 fooFile.FullName 时返回一个空字符串就足够了。不幸的是,new FileInfo(string.Empty) 不起作用。
在 Stack Overflow 上搜索这个 java 问题,但回答并没有帮助我。
是否有一种方法可以将 FileInfo 与 Null-Object-Pattern 结合使用?

1
如果一个对象可能为null,那么null检查并不丑陋。但你也可以使用Try模式:FileInfo fi; if(TryGetFile(path,out fi)){} - Tim Schmelter
@Tim Schmelter:感谢您的建议,Tim。我的方法在许多地方都有使用,因此我不想为每个调用实现(冗余的)null检查。TryGetFile很有意思,但是同样存在问题。 - Micha
2个回答

4
您可以使用??运算符,在需要的地方使用默认的FileInfo,其中静态变量表示默认文件信息是什么:
public void MyMethod(FileInfo fi)
{
    // use default fileinfo if null is passed to this method
    fi = fi ?? DefaultFileInfo.Value;

    // method code...
    // do something with the fileinfo, it is not null for sure now.
}

默认的文件信息类:

public static class DefaultFileInfo
{
    public static readonly FileInfo Value = new FileInfo("null");
}

如果你想让默认文件可读,当然需要指定一个有效的文件名。

谢谢!这让我找对了方向。我尝试过 new FileInfo(string.Empty); 但是你的 new FileInfo("null"); 就像我需要的那样工作。给你点赞。 - Micha

3

空检查的问题是什么?我没有看到您的观点...... 如果您确实想避免这个空检查,您可以使用扩展方法,但我不建议您这样做......

public static class Extensions
{
    public static string GetFullName(this FileInfo fInfo)
    {
        if (fInfo == null)
        {
            return String.Empty;
        }
        return fInfo.FullName;
    }
}

然后

FileInfo fInfo = // ... ;
string fullName = fInfo.GetFullName();

谢谢你的回答(+1)。我不想要这些空值检查,因为每次我(或其他人)使用该方法时,都必须考虑到空值检查是必要的。如果我(或其他人)忘记了它,可能会导致运行时异常。 - Micha
你不必每次都进行检查!检查已在扩展方法中完成。 - Mones
FileInfo fInfo = null; string fullName = fInfo.GetFullName() <-- 没有空值检查,也没有异常抛出 - Bidou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接