2012-07-12 69 views
1

我對C#編程非常陌生,而且我正在爲OOP苦苦掙扎。只有在可以正確創建對象的情況下才返回對象

我已經創建了一個類,它具有分析文本文件並根據其內容創建對象的方法。我希望此功能只在文本文件的格式正確時才返回包含文本文件中某些信息的對象。

我調用該函數來分析文本文件是這樣的:

 pokerHand newHand; 
     newHand = new pokerHand(); 

     AnalyzePokerHand.importHand("c:\\text.txt"); 

     newHand = AnalyzePokerHand.getAnalyzedHand; 

的text.txt如果不是一手牌歷史文件,或者是在錯誤的格式等等,我不想newHand將被填充關於手的垃圾信息。

如果我想將路徑傳遞到文本文件中,並且僅在函數成功時才返回包含有關手的信息的對象,那麼正確的方法是什麼?

感謝您的光臨!

回答

3

如果您想指出沒有數據可用,則返回null是最好的方法。 這種方法的另一個優點是,如果您嘗試訪問成員變量,它會拋出空指針異常。

+0

當然!非常感謝! :) – 2012-07-12 08:31:45

0

邏輯比如這應該是足夠

newHand = AnalyzePokerHand.importHand("c:\\text.txt"); 
if(newHand == null) 
{ 
    // Message to your user about invalid file.... 
} 
0

如果垃圾數據很可能是一個特殊的情況,那麼你可以throw an Exception指示錯誤。這會導致程序跳轉到您定義的某些錯誤處理代碼,因此您可以提醒用戶或者優雅地處理錯誤。

例如:

try { 
    newHand = AnalyzePokerHand.importHand("c:\\text.txt"); 
} catch(HandException he) { 
    Console.WriteLine("Invalid hand!"); 
} 
1

通常有在該情況下兩種選擇:在故障的情況下返回null,或使用TryParse風格方法用out PARAM(作爲一個例子看DateTime.TryParse):

public static bool TryLoad(string filePath, out PokerHand pokerHand) 
{ 
    pokerHand = null; 
    ... 
    if (fileNotLoadable) return false; 
    ... 
    pokerHand = loadedPokerHand; 
    return true; 
} 

可用,像這樣:

PokerHand pokerHand; 
if (AnalyzePokerHand.TryLoad("c:\\text.txt", out pokerHand)) 
{ 
    // Use pokerHand here; 
} 
2

您有幾個選項:
我假設您有一個pokerHand Parse(string path)方法,其中path是文本文件的位置。
你既可以返回null,像這樣:

if(!filePresent || incorrectFormat) 
    return null; 

或者,你可以使用一個TryParse一種辦法。將方法的簽名更改爲:bool TryParse(string path, pokerHand result)
如果文件有效,則將result設置爲輸出,並返回true。如果不是,則返回false。你這樣調用它:

pokerHand p; 
if(!TryParse(@"C:\t.txt", p)) 
    //parse failed 
else 
    //parse was successful, p is the result 


P.S - 在C#中,我們通常使用CamelCase類的名稱 - 因此,按照慣例,類實際上應該叫做PokerHand

相關問題