代码之家  ›  专栏  ›  技术社区  ›  zxcvbnm

C:我什么时候应该用胰蛋白酶?

  •  14
  • zxcvbnm  · 技术社区  · 16 年前

    我知道它不会抛出异常,因为它可能更快,而且,您最有可能使用它将输入转换为您可以使用的数据,所以我认为它不会经常用于在性能方面产生如此大的差异。

    总之,我看到的示例都是沿着if/else块的行 TryParse ,否则返回错误消息。对我来说,这基本上和在catch返回错误消息时使用try/catch块是一样的。

    那么,我错过什么了吗?在这种情况下,这是否真的有用?

    10 回复  |  直到 16 年前
        1
  •  12
  •   Greg Beech    16 年前

    它非常简单:使用 Parse 如果您希望在遇到无效数据时出现异常,请使用 TryParse 如果你没有,那么你的问题似乎是:

    如果数据无效,为什么不希望出现异常?

    异常只能用于异常情况,无效数据可能不是异常情况。也许你正在写一个数据清理程序,它期望得到无效的数据,并试图推断出当数据无效时合理的值是什么。也许数据并不那么重要,您可以跳过包含它的记录。

    它取决于上下文,并且可以选择 解析 三分法 方法允许您为自己的方法选择适当的解析机制。

        2
  •  23
  •   Mark Byers    16 年前

    除了您提到自己的性能方面之外,还有一个语义差异:

    使用Try/Catch是为了特殊情况。输入无效数据是您所期望的,而不是异常的。

        3
  •  7
  •   Oded    16 年前

    如果可能,使用 TryParse -使用它比抛出异常要便宜得多。

        4
  •  2
  •   Dan Tao    16 年前

    假设您正在读取日志文件:

    public IEnumerable<LogEntry> GetAllValidEntries() {
        while (!logReader.Finished) {
            string nextLine = logReader.ReadLine();
            LogEntry nextEntry;
    
            if (TryParseLogEntry(nextLine, out nextEntry))
                yield return nextEntry;
        }
    }
    
    private bool TryParseLogEntry(string line, out LogEntry logEntry) {
        logEntry = null;
    
        if (string.IsNullOrEmpty(line))
            return false;
    
        string[] cells = line.Split(';');
        if (cells.Length < 3)
            return false;
    
        DateTime time;
        decimal price;
        int quantity;
    
        // We just want to read this line of text as a LogEntry
        // IF it is valid; otherwise, there's no reason to throw
        // an error in the user's face
        if (!DateTime.TryParse(cells[0], out time) ||
            !decimal.TryParse(cells[1], out price) ||
            !int.TryParse(cells[2], out quantity))
            return false;
    
        logEntry = new LogEntry(time, price, quantity);
        return true;
    }
    

    因为上述代码的全部目的是从一个序列中提取有效项(该序列可能包含一些 无效 项目),我想 TryParse 方法制作 许多 在这种情况下比 Parse 方法,需要有效输入。

        5
  •  1
  •   kmontgom    16 年前

    如果需要在解析失败时设置一个默认值,则可以使用if和triparse来完成此操作。

        6
  •  1
  •   BenAlabaster    16 年前

    好吧,int.triparse返回一个bool,允许您测试它是否成功,而不是捕获异常。我通常在成功翻译信息的情况下使用它,我想使用它,但如果不是,这并不重要,我可以忽略失败,因为我想使用默认值,除非我得到一个有意义的值,在这种情况下,我将覆盖它,但如果值没有意义,我将保留默认值。

    该理论认为异常本身就很昂贵,因此您不应该使用它们来指示程序流。您应该在语义错误的地方捕获它们,而不是在可能被解释为数据流的地方。

        7
  •  0
  •   mrjoltcola    16 年前

    对于不介意在失败的分析(可能是无效的输入)中将值设置为0的情况,或者您希望简洁的情况,typarse的返回代码允许这样做。

        8
  •  0
  •   Will Marcouiller    16 年前

    每次你有一个解析要执行,因为它比一个异常要便宜得多,而且你可以使它成为一个简单的 如果 语句而不是大的try…catch块。

        9
  •  0
  •   gbn    16 年前

    我不是猴子,但…

    异常通过将处理传输到catch块来中断正常的代码流。

    台盼将给您更多的控制(例如突出显示文本框中的错误),而不是依赖于异常机制。

        10
  •  0
  •   Austin Salonen gmlacrosse    16 年前

    如果您正在表单上验证输入,则可以在控件(或MessageBox或其他通知)返回false时在该控件上设置ErrorProvider。这并不是一个例外,因为正如其他人所说,你应该为它做计划。

    推荐文章