2013-11-28 49 views
3

我有一個返回FileInfo對象的方法。調用方法fooFile.FullName後調用。FileInfo的空對象模式

所有罰款,但有一種情況下,FileInfo可以null,但我不想(醜)空檢查方法調用。

我neet是某種null-FileInfo(Null-Object-Pattern)。撥打fooFile.FullName返回空字符串就足夠了。 不幸的是new FileInfo(string.Empty)不起作用。

搜索SO帶來這個java-question,但答案並沒有幫助我。

有沒有辦法將FileInfo與空對象模式結合使用?

+1

如果一個對象可以爲null,則空值檢查並不難看。但是你也可以使用'Try'-pattern:'FileInfo fi; if(TryGetFile(path,out fi)){}'。 –

+0

@Tim Schmelter:感謝您的輸入Tim。我的方法被用在很多地方。所以我不要爲每個調用實施(冗餘)空檢查。 'TryGetFile'很有趣,但同樣的問題。 – Micha

回答

4

您可以使用??操作使用默認FileInfo在需要的地方,用一個靜態變量的地方代表的是默認的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"); 
} 

如果你什麼來使默認文件讀取,當然你需要指定一個有效的文件名。

+0

謝謝!這使我以正確的方式。我嘗試'新的FileInfo(string.Empty);'但你的'新的FileInfo(「null」);'按需要工作。 +1。 – 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(); 
+0

感謝您的回答(+1)。我不希望這個空檢查,因爲每次我(或其他人)使用該方法時,我必須認爲空檢查是必要的。如果我(或其他人)忘記它,它可能會導致我運行時異常。 – Micha

+0

你不必每次都檢查!該檢查在擴展方法中完成。 – Mones

+0

'FileInfo fInfo = null;字符串fullName = fInfo.GetFullName()'< - 沒有null檢查,沒有例外 – Bidou