Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:我什么时候应该使用TryParse?_C#_Exception_Exception Handling - Fatal编程技术网

C#:我什么时候应该使用TryParse?

C#:我什么时候应该使用TryParse?,c#,exception,exception-handling,C#,Exception,Exception Handling,我知道它不会引发异常,正因为如此,它可能会快得多,但同时,您最有可能使用它将输入转换为您可以使用的数据,因此我不认为它经常被用于在性能方面产生如此大的差异 无论如何,我看到的示例都是带有TryParse的if/else块,else返回错误消息。对我来说,这与使用try/catch块时catch返回错误消息基本相同 那么,我是不是遗漏了什么?在某些情况下,这确实有用吗?在可能的情况下,使用TryParse-使用它比抛出异常要便宜得多。除了您提到的性能方面之外,还有一个语义差异: 使用try/cat

我知道它不会引发异常,正因为如此,它可能会快得多,但同时,您最有可能使用它将输入转换为您可以使用的数据,因此我不认为它经常被用于在性能方面产生如此大的差异

无论如何,我看到的示例都是带有
TryParse
的if/else块,else返回错误消息。对我来说,这与使用try/catch块时catch返回错误消息基本相同


那么,我是不是遗漏了什么?在某些情况下,这确实有用吗?

在可能的情况下,使用
TryParse
-使用它比抛出异常要便宜得多。

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


使用try/catch适用于特殊情况。输入无效数据是您所期望的,而不是异常情况。

如果您需要在解析失败时设置默认值,TryParse和If是一种很好的方法。

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

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


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

每次您都要执行解析,因为它比异常使用成本低得多,而且您可以将其作为简单if语句的一部分,而不是一个大的try…catch块。

我不是猴子,但是

异常通过将处理转移到catch块来中断正常的代码流


TryParse将为您提供更多的控制(例如在文本框中突出显示错误),而不是依赖异常机制。

它非常简单,如下所示:如果遇到无效数据时需要异常,请使用
Parse
;如果没有,请使用
TryParse
。因此,你的问题似乎是:

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

异常应仅用于例外情况,无效数据可能不是例外情况。可能您正在编写一个数据清理程序,该程序期望获得无效数据,并在数据无效时尝试推断合理值。也许数据并不那么重要,你可以跳过包含它的记录


它取决于上下文,通过选择
Parse
TryParse
方法,您可以为自己选择合适的解析机制。

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

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

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;
}
public IEnumerable GetAllValidEntries(){
而(!logReader.Finished){
字符串nextLine=logReader.ReadLine();
下一次登录;
if(胰蛋白酶试剂盒(下一行,下一行))
收益率;
}
}
私有布尔TryParseLogEntry(字符串行,输出日志项){
logEntry=null;
if(string.IsNullOrEmpty(行))
返回false;
string[]cells=line.Split(“;”);
如果(单元格长度<3)
返回false;
日期时间;
十进制价格;
整数;
//我们只想把这行文本作为日志条目来读
//如果它是有效的,否则就没有理由抛出
//用户脸上的错误
如果(!DateTime.TryParse)(单元格[0],超时)||
!decimal.TryParse(单元格[1],输出价格)||
!int.TryParse(单元格[2],输出数量))
返回false;
日志条目=新日志条目(时间、价格、数量);
返回true;
}

由于上述代码的全部目的是从序列中提取有效项(可能会包含一些无效项),因此我认为
TryParse
方法在这种情况下比
Parse
方法更有意义,后者需要有效输入。

+1用于提及异常与验证。我最讨厌的一个!我只想补充一点,很多人可能会用if/else的方式使用它,在try/catch中使用.Parse一开始可能会抛出(请原谅这个双关语)一些人。如果你没有合理的方法来处理
TryParse
失败了怎么办…?值得记住的是,大多数代码示例(特别是在.Net文档中)与最佳实践相反,其目的是演示某些东西是如何工作的。您可以使用TryParse设置错误消息,但更现实的情况可能是在输入(可能来自用户)无效时指定默认值。