首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“TryParse”或“TryGetValue”的示例实现

“TryParse”或“TryGetValue”的示例实现
EN

Stack Overflow用户
提问于 2010-10-03 15:56:56
回答 3查看 26.5K关注 0票数 28

你能给我一个实现.NET 'try‘模式的例子吗?

编辑:

我不是指“尝试-捕获”语句,而是指尝试模式,如TryParse()TryGetObjectByKey()方法中使用的模式。

最具体地说,如何处理自定义“try”模式方法中引发的异常。我应该记录它,我应该忽略它。有人知道这些方法的做法是什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-03 16:02:29

下面是一个使用TryXxx方法的示例:

代码语言:javascript
复制
string s = Console.ReadLine();
int x;
if (int.TryParse(s, out x))
{
    Console.WriteLine("You entered the valid integer {0}", x);
}
else
{
    Console.WriteLine("Invalid input!");
}

下面是定义该方法的一个示例:

代码语言:javascript
复制
bool TryParse(string s, out int x)  // out parameter for result
{
    if (!allCharactersAreValid(s))
    {
        x = 0;
        return false;
    }

    // More checks...
    // Parse the string...

    x = 42;
    return true;
}

异常处理

最具体地说明如何处理自定义“try”模式方法中上升的异常

您的方法可能应该避免抛出任何异常--如果您的用户需要异常,他们将使用非尝试版本。因此,您应该尽量避免调用在实现TryXxx时可能抛出的方法。然而,有些异常是不可避免的,可能会被抛出您的控制之外-例如OutOfMemoryExceptionStackOverflowException等.对此您无能为力,您不应该试图捕获这些异常,只要让它们传播到调用方即可。不要吞下它们,不要记录它们--这是来电者的责任。

这方面的一个例子是Dictionary<TKey, TValue>.TryGetValue,当为该方法提供的键对象在调用GetHashCode时抛出异常时。然后,结果异常不会在TryGetValue方法中捕获--调用者将看到异常。此代码演示了这种情况的发生:

代码语言:javascript
复制
using System;
using System.Collections.Generic;

class Foo
{
    public override int GetHashCode()
    {
        throw new NotImplementedException();
    }
}

class Program
{
    public static void Main()
    {
        Dictionary<object, object> d = new Dictionary<object, object>();
        d["bar"] = 42;

        object s;
        Foo foo = new Foo();
        if (d.TryGetValue(foo, out s))   // results in NotImplementedException
        {
            Console.WriteLine("found");
        }
    }
}
票数 40
EN

Stack Overflow用户

发布于 2010-10-03 16:14:00

我希望实现在每种情况下都非常类似于“抛出”版本--除非抛出版本中有“抛出新FormatException”语句,否则就会有“返回假”.在成功路径的末尾,有一个输出参数的赋值和“返回真”。

在某种程度上,您可以从非抛出版本中模拟抛出版本(尽管就性能而言,您不能做相反的操作)--如果它返回false,您可以调用TryParse并抛出异常。但是,这意味着异常将不包含解析失败的详细信息。

您能够完成的代码重用的确切数量--同时在Try版本中仍然具有良好的性能,以及抛出版本中的详细异常--将取决于手头的确切任务。

票数 10
EN

Stack Overflow用户

发布于 2010-10-03 16:04:24

我猜你指的是类似于Int32.TryParseDictionary<TKey, TValue>.TryGetValue方法的东西。这些方法的存在是为了避免代价高昂的异常抛出,并通过其他方法让调用者知道失败--这种情况下的布尔返回值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3850486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档