【问题标题】:How can I pass a function as a parameter? [closed]如何将函数作为参数传递? [关闭]
【发布时间】:2011-11-23 04:22:24
【问题描述】:

我想知道是否有任何方法可以将一个函数传递给另一个函数来处理它的 try/catch。我正在处理没有任何异常处理的现有代码库。

【问题讨论】:

标签: c# exception-handling anonymous-methods


【解决方案1】:

注意:此答案针对的是问题的文本而不是标题,因为问题似乎与将函数作为参数传递无关。

确切地知道您要做什么有点困难,但您当然可以在自己的 try…catch 块中调用公共方法。

public void ExistingMethod()
{
    // bad code
    // bad code
    throw new NullReferenceException("The previous developers are always the problem.");
}

…

public void MyMethod(ComponentFromOldCode component)
{
    try
    {
        component.ExistingMethod();
    }
    catch (NullReferenceException nre)
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }
}

你不能做的*是将错误处理添加到对该函数的现有调用。

您也许可以添加一些高级错误处理,至少让您有机会记录异常并向您的用户展示更优雅的失败体验。

*不合理

【讨论】:

  • 很棒的异常文本,先生。 A+。
【解决方案2】:
【解决方案3】:

查看Actions。它们将允许您将匿名方法作为参数传递。

但是,我认为这不会帮助您解决问题。您可能想要重构代码库以进行适当的异常处理。

【讨论】:

    【解决方案4】:

    您可以使用 Lambda 表达式

    class Program
    {
    private static int Sum(int a, int b)
    {
        return a + b;
    }
    
    private static int Multiply(int a, int b)
    {
        return a * b;
    }
    
    
    private static int GetResult(Func<int, int, int> solver, int a, int b)
    {
        try {
          return solver(a, b);
        } catch {
        }
        return 0; // your default return
    }
    
    static void Main(string[] args)
    {
        var a = 2;
        var b = 3;
    
        var sum = GetResult(Sum, a, b);
        var multiply = GetResult(Multiply, a, b);
    }
    

    更多信息在

    Lambda 表达式(C# 编程指南)

    http://msdn.microsoft.com/en-us/library/bb397687.aspx

    函数代理

    http://msdn.microsoft.com/en-us/library/bb549151.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2021-11-14
      • 2021-10-06
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多