委托可以在 C# 中包装 类 吗?

Can delegates wrap classes in C#?

在 C++ 中,我们有 std::function 类型,可用于包装 lambda、函数甚至自定义 classes。这是一个包含在 std::function 中的自定义 class 的示例:

#include <functional>

struct A {
    void operator()() {
    }
};

std::function<void()> a = A();

我虽然在 C# 中使用委托也是可能的,但是我无法让它工作:

class Program
{
    delegate void Foo();

    class Bar
    {
        public void Invoke()
        {

        }
    }

    static void Main()
    {
        new Foo(new Bar()); // CS0149: Method name expected
    }
}

我相信这一定是可行的,因为 delegate 运算符在内部创建了一个新的 class 继承自 System.Delegate 这表明我可以创建自己的类型以某种方式做同样的事情。

简单的答案是 'no',因为 C# 没有像 C++ 那样的 operator()

但是,lambda 不仅可以用来存储函数,还可以用来存储函数 特定对象

class Program
{
    delegate void Foo();

    class Bar
    {
        public void Invoke()
        {

        }
    }

    static void Main()
    {
        var f = new Foo(new Bar().Invoke); 
    }
}

不同之处在于,在 C# 中,您必须指定方法名称,而不是默认方法名称。

同样值得注意的是,与 C++ 类似,C# 具有泛型来帮助实现这一点,因此我们可以完全删除 Foo 声明:

var f = new Action(new Bar().Invoke);