2011-09-28 89 views
7

我剛開始使用ReSharper,我試圖找出爲什麼它認爲這段代碼是錯誤的。ReSharper「可能的NullReferenceException」與FileInfo錯誤?

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

它將file.Directory突出顯示爲「Possible System.NullReferenceException」。我不知道這是如何實現的,因爲文件對象不能爲空,我也不知道從FileInfo對象返回的DirectoryInfo對象如何可以爲null。

回答

11

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 
} 
+1

此外:可以使用['file.DirectoryName'](http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx),它將返回「目錄的完整路徑」,還應該爲''c:\「'工作。 –

0

看看代碼。每個點表示鑽到另一個對象。正如你所說的「文件對象永遠不能爲空」(正確),在這個等式中還有什麼其他對象可能是空的。提示:它不是FullName。

+0

請閱讀帖子到最後,你會發現這個:「[...],我無法弄清楚從FileInfo對象返回的DirectoryInfo對象是如何爲空的。」所以OP意識到這一點。 – UrbanEsc

+0

更準確地說,'.'表示內存位置將被取消引用的時間,因爲它可能正在調用屬性,方法等。因此,無論何時您使用點符號,您都需要在嘗試對其進行解引用之前檢查該對象是否爲* something *。 – Yuck

+0

@UrbanEsc:那麼OP是不正確的,你可能會得到一個沒有有效目錄的文件。 –