委托可以在 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);
在 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);