函数调用中的C#委托

时间:2013-01-10 15:48:24

标签: c# delegates

我已经定义了这样一个委托:

   delegate void processRecord(int a, int b);

现在我想用它来创建一个匿名方法来提供函数调用。该函数定义如下:

   void someFunction(processRecord fcn);

我希望用匿名方法调用someFunction,但我无法做对:

   someFunction(new processRecord(a, b) {
       // do stuff
   });

这样的事情的正确语法如何?

5 个答案:

答案 0 :(得分:6)

使用processRecord参数声明对方法的调用的正确语法是:

someFunction(delegate (int a, int b) {
    // use a and b here
});

您可以利用lambda语法调用someFunction,因为processRecordAction<int,int>兼容,如下所示:

someFunction((a, x) => Console.WriteLine(a + "; " + x));

但是在.net框架中,已存在自Action以来的通用委托.NET 3.5,您可以使用它而不是创建自己的委托void someFunction(Action<int, int> fcn) {}

所以你可以简单地将你的函数定义为

someFunction( (a,b) => /*use a and b here*/ );

然后致电

{{1}}

答案 1 :(得分:1)

您可以这样称呼它:

someFunction(delegate( int a, int b) {
   // do stuff
});

C#编译器会发现您正在从呼叫的上下文中创建delegate processRecord

答案 2 :(得分:1)

如果您在someFunction

中使用委托,则可以使用它
   someFunction(delegate( int a, int b) {
       // do some stuff
    });

这是DEMO

答案 3 :(得分:0)

以下是一些选项,所有这些选项都有效地完成了同样的事情:

someFunction((a,b) => DoStuff());

someFunction(delegate(int a, int b){ doStuff(); });

someFunction(new processRecord((int a, int b) => 
{
    doStuff(); doMoreStuff(); 
}));

答案 4 :(得分:0)

processRecord t = (q,w) =>
        {
            int n = q+w;
        };
        someFunction(t);