【问题标题】:ReSharper "Possible NullReferenceException" wrong with FileInfo?ReSharper“可能的 NullReferenceException”与 FileInfo 错误?
【发布时间】:2011-09-28 22:50:50
【问题描述】:

我刚开始使用 ReSharper,我正试图找出它认为这段代码错误的原因。

var file = new FileInfo("foobar");
return file.Directory.FullName;

它将file.Directory 突出显示为“可能的 System.NullReferenceException”。我不确定这是怎么可能的,因为文件对象永远不会为空,而且我无法弄清楚从FileInfo 对象返回的DirectoryInfo 对象怎么可能为空。

【问题讨论】:

    标签: c# .net resharper


    【解决方案1】:

    Directory 属性确实可以是null。属性的实现大致是

    public DirectoryInfo Directory {
        get {
            string directoryName = this.DirectoryName;
            if (directoryName == null) {
                return null;
            }
            return new DirectoryInfo(directoryName);
        }
    }
    

    绝对可以返回null。这是一个具体的例子

    var x = new FileInfo(@"c:\");
    if (x.Directory == null) {
      Console.WriteLine("Directory is null");  // Will print
    }
    

    【讨论】:

    • 另外:可以使用file.DirectoryName,它将返回“目录的完整路径”,并且也适用于"c:\"
    【解决方案2】:

    看一下代码。每个点代表钻到另一个对象。正如您所说的“文件对象永远不能为空”(正确),在这个等式中其他对象可能为空。提示:它不是全名。

    【讨论】:

    • 请把帖子读到最后,你会发现:“[...] 而且我不知道从 FileInfo 对象返回的 DirectoryInfo 对象怎么可能为空。”所以OP意识到了这一点。
    • 更准确地说,. 表示将取消引用内存位置的时间,因为它可能正在调用属性、方法等。因此,每当您使用点符号时,您都需要在尝试取消引用之前检查该对象是否为 something
    • @UrbanEsc:那么 OP 不正确,因为您可能会得到一个没有有效目录的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多