C# (如何)可以绑定/重新绑定一个方法来处理具有不同签名的委托? 我是一个C++开发人员,使用C++中的信号和插槽,对我来说,它类似于C语言中的委托。在搜索“bind”提供的功能时,我发现自己不知所措,觉得自己肯定错过了什么 P>我觉得C++中可能有类似于C++的可能。下面是一些我将在c++中执行的psudo代码: Slot<void> someCallback; int foo(int i) { std::cout << "Value: " << i << "\n"; return i; } int main() { int i = 0; Slot<int> someCallback = bind( fun_ptr(foo), i ); ++i; // added to show that late evaluation would be a non-trivial difference int result = someCallback(); assert( result == 0 ); return 0; } Slot-someCallback; int foo(int i) { std::cout
尝试以下方法C# (如何)可以绑定/重新绑定一个方法来处理具有不同签名的委托? 我是一个C++开发人员,使用C++中的信号和插槽,对我来说,它类似于C语言中的委托。在搜索“bind”提供的功能时,我发现自己不知所措,觉得自己肯定错过了什么 P>我觉得C++中可能有类似于C++的可能。下面是一些我将在c++中执行的psudo代码: Slot<void> someCallback; int foo(int i) { std::cout << "Value: " << i << "\n"; return i; } int main() { int i = 0; Slot<int> someCallback = bind( fun_ptr(foo), i ); ++i; // added to show that late evaluation would be a non-trivial difference int result = someCallback(); assert( result == 0 ); return 0; } Slot-someCallback; int foo(int i) { std::cout,c#,delegates,callback,signals-slots,currying,C#,Delegates,Callback,Signals Slots,Currying,尝试以下方法 class Example { static void foo(int i) { Console.WriteLine(i); } public static void Main() { Action someCallback = () => foo(5); someCallback(); } } 或更接近C++计数器部分的某些内容 class Example { static void foo(int i) { Conso
class Example {
static void foo(int i) {
Console.WriteLine(i);
}
public static void Main() {
Action someCallback = () => foo(5);
someCallback();
}
}
或更接近C++计数器部分
的某些内容class Example {
static void foo(int i) {
Console.WriteLine(i);
}
static Action bind<T>(Action<T> action, T value) {
return () => action(value);
}
public static void Main() {
Action someCallback = bind(foo, 5);
someCallback();
}
}
类示例{
静态void foo(int i){
控制台写入线(i);
}
静态动作绑定(动作,T值){
返回()=>操作(值);
}
公共静态void Main(){
Action-someCallback=bind(foo,5);
someCallback();
}
}
解释。这里发生的事情是,我正在通过lambda表达式创建一个新委托。lambda是以()=>
。在这种情况下,它会创建一个不接受任何参数且不产生任何值的委托。它与C中的类型操作兼容。我们执行以下操作:
class Program {
static Action Curry<T>(Action<T> action, T parameter) {
return () => action(parameter);
}
static void Foo(int i) {
Console.WriteLine("Value: {0}", i);
}
static void Main(string[] args) {
Action curried = Curry(Foo, 5);
curried();
}
}
表示void
参数映射到参数
处评估的操作
<> >最后,在<代码>主< /代码>中,我们声明了一个实例:<代码>动作> <代码>代码> CurryEd/Cuth>,这是使用<代码> >代码> 5代码<代码> > <代码> > Foo<代码>的结果。在C++示例中,这与“代码>绑定(FunyPtR(FoO),5)< /C>)具有相同的作用。
最后,我们通过语法curried()
调用新形成的委托curried
。这与示例中的someCallback()
类似
这个词的意思是
作为一个更有趣的例子,考虑以下内容:
class Program {
static Func<TArg, TResult> Curry<TArg, TResult>(
Func<TArg, TArg, TResult> func,
TArg arg1
) {
return arg => func(arg1, arg);
}
static int Add(int x, int y) {
return x + y;
}
static void Main(string[] args) {
Func<int, int> addFive = Curry<int, int>(Add, 5);
Console.WriteLine(addFive(7));
}
}
在控制台上打印12
。Woah。很有趣。我在这里看到了什么?他正在使用lambda表达式创建一个新的委托。委托调用“foo(5)”。这就像在运行中创建一个新方法来调用foo(5)然后将其分配给someCallback委托。Action
是框架提供的委托。它是一个函数,只接受一个参数(类型为T),不返回任何内容(void)。他将匿名函数分配给该委托(他将其命名为someCallback
)。空的参数表示它不带参数,=>
后面的表达式是函数的主体。谢谢。这正是我想要的。考虑到您提供的这个示例,我不认为有通用绑定可以自动确定返回类型?@Catskul,不,C中没有。谢谢你的详细答案。我将另一个标记为已接受的答案,因为它更简洁,尽管它缺少了你所包含的一些重要细节。当然。我只希望额外的颜色有帮助。:-)非常有用的答案,这是。引入了一个精彩的概念,以易于理解的方式使用咖喱。这也肯定会增加我的思维lbox。
class Program {
static Func<TArg, TResult> Curry<TArg, TResult>(
Func<TArg, TArg, TResult> func,
TArg arg1
) {
return arg => func(arg1, arg);
}
static int Add(int x, int y) {
return x + y;
}
static void Main(string[] args) {
Func<int, int> addFive = Curry<int, int>(Add, 5);
Console.WriteLine(addFive(7));
}
}
Console.WriteLine(addFive(7));