1

我对 C# 编程很陌生,我在 OOP 方面有点挣扎。

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

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

        pokerHand newHand;
        newHand = new pokerHand();

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

        newHand = AnalyzePokerHand.getAnalyzedHand;

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

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

感谢您的关注!

4

5 回答 5

3

如果您想指示没有数据可用,则返回 null 是最好的方法。这种方法的另一个优点是,如果您尝试访问成员变量,它将引发空指针异常。

于 2012-07-12T08:29:39.757 回答
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


PS - 在 C# 中,我们通常使用CamelCase类名 - 所以,按照惯例,你的类实际上应该被称为PokerHand.

于 2012-07-12T08:34:38.783 回答
1

在这种情况下通常有两种选择:null在失败时返回,或者使用TryParse带有 out 参数的样式方法(例如查看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;
}
于 2012-07-12T08:31:51.273 回答
0

这样的逻辑就足够了

newHand = AnalyzePokerHand.importHand("c:\\text.txt");
if(newHand == null)
{
     // Message to your user about invalid file....
}
于 2012-07-12T08:31:07.883 回答
0

如果垃圾数据很可能是异常情况,那么您可以抛出异常来指示错误。这会导致程序跳转到您定义的一些错误处理代码,因此您可以提醒用户或优雅地处理错误。

例如:

try {
    newHand = AnalyzePokerHand.importHand("c:\\text.txt");
} catch(HandException he) {
    Console.WriteLine("Invalid hand!");
}
于 2012-07-12T08:31:24.993 回答