2012-07-12 138 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

相关问题