'TryParse'或'TryGetValue'的示例实现

时间:2010-10-03 15:56:56

标签: c# design-patterns

您能举例说明.NET'try'模式的实现吗?

修改

我不是指“try-catch”语句,我的意思是尝试模式,如TryParse()TryGetObjectByKey()方法中使用的模式。

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

3 个答案:

答案 0 :(得分:33)

以下是使用 TryXxx方法的示例:

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!");
}

以下是定义方法的示例:

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'模式方法中的上升异常

您的方法可能应避免抛出任何异常 - 如果您的用户需要例外,他们将使用非Try版本。因此,您应该尽量避免调用在实现TryXxx时可能抛出的方法。但是有些例外情况是不可避免的,可能会被你的控制权所取代 - 例如OutOfMemoryExceptionStackOverflowException等......你无能为力,你不应该试图捕捉这些例外情况,让他们传播给来电者。不要吞下它们,不要记录它们 - 这是来电者的责任。

当提供给此方法的密钥对象在调用Dictionary<TKey, TValue>.TryGetValue时抛出异常时,此示例为GetHashCode。然后,导致的异常是{em> not 在TryGetValue方法中捕获 - 调用者将看到异常。此代码演示了这种情况:

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");
        }
    }
}

答案 1 :(得分:10)

我希望实现看起来非常像每个案例中的“抛出”版本 - 除非在抛出版本中有“抛出新的FormatException”语句,有“返回false”......并且最后在成功路径中,有一个对输出参数的赋值和“return true”。

某些范围,你可以模拟非投掷版本的投掷版本(虽然在性能方面你不能反过来) - 你可以只是如果返回false,则调用TryParse并抛出异常。但是,这意味着该异常不会包含有关解析失败原因的详细信息。

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

答案 2 :(得分:2)

我猜您的意思是Int32.TryParseDictionary<TKey, TValue>.TryGetValue方法。这些方法可以避免代价高昂的异常抛出,让调用者通过其他方式知道失败 - 在这种情况下是布尔返回值。