Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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