仅在可以正确创建对象时返回对象

时间:2012-07-12 08:27:35

标签: c# .net object

我对C#编程很陌生,而且我在使用OOP时遇到了一些麻烦。

我创建了一个类,该方法分析文本文件并根据其内容创建对象。我希望此函数仅在文本文件格式正确时才返回包含文本文件中某些信息的对象。

我调用函数来分析文本文件,如下所示:

        pokerHand newHand;
        newHand = new pokerHand();

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

        newHand = AnalyzePokerHand.getAnalyzedHand;

如果text.txt不是扑克手历史文件,或者格式错误等,我不希望newHand填充有关手牌的垃圾信息。

如果我想将路径传递给文本文件并且仅在函数成功时返回包含有关手的信息的对象,那么正确的方法是什么?

感谢您一看!

5 个答案:

答案 0 :(得分:3)

如果要表明没有可用数据,则返回null是最佳方法。 此方法的另一个优点是,如果您尝试访问成员变量,它将抛出空指针异常。

答案 1 :(得分: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

答案 2 :(得分:1)

在这种情况下通常有两个选项:在发生故障时返回null,或者使用带有out参数的TryParse样式方法(例如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;
}

答案 3 :(得分:0)

这样的逻辑就足够了

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

答案 4 :(得分:0)

如果垃圾数据可能是特殊情况,那么您可以throw an Exception指示错误。这会导致程序跳转到您定义的某些错误处理代码,因此您可以提醒用户或正常处理错误。

例如:

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