你能在C#中将一个函数分配给一个变量吗?

21

我看到一种在JavaScript中定义函数的方式:

var square = function(number) {return number * number};

并且可以像这样调用:

square(2);

var factorial = function fac(n) {return n<3 ? n : n*fac(n-1)};
print(factorial(3));

C# 代码

MyDelegate writeMessage = delegate ()
                              {
                                  Console.WriteLine("I'm called");
                              };

我想知道在C#中是否可以以同样的方式定义函数,如果可以,请给出一个简短的函数定义示例。谢谢。


顺便提一下(每次出现这种情况我都会这么说),在C#中,你通常会说方法,而不是函数。 - stakx - no longer contributing
3
@stakx 严格来说,这里的正确术语是函数。Func 被命名为 Func 并非巧合。 - Tim Lloyd
1
@chibacity: Func 作为委托类型的命名很恰当,因为它代表了一个函数的概念。然而,在C#语言中,并不存在函数。您只能向委托订阅方法(即使它们是匿名的)。在C#的上下文中,“函数”这个术语并不恰当。 - stakx - no longer contributing
@stakx 我不同意,这是语义上有用的术语。它嵌入了有一个返回值的事实,并且像这个例子中一样纯净,没有副作用。术语“方法”并没有表明这一点。 - Tim Lloyd
@chibacity:我需要退一步来解释。我之所以首先提到这个术语建议的原因是为了让OP认识到JavaScript和C#语言之间的区别,并且几乎总是错误地将方法称为“函数”。但你是对的:虽然作为一种语言,C#没有函数(作为一种语法结构),但我承认函数的概念或思想仍然可以被表示,例如使用Func委托。 - stakx - no longer contributing
1
@stakx同意,我最初只是假设OP已经了解C#和JS中方法和函数的基础知识。不幸的是,这个术语具有多重含义。 - Tim Lloyd
2个回答

28

你可以创建委托类型声明:

delegate int del(int number);

然后赋值并使用它:

   del square = delegate(int x)
    {
        return x * x;
    };

    int result= square (5);

或者像之前所说,你可以使用委托的“快捷方式”(由委托组成),并使用:

Func<[inputType], [outputType]> [methodName]= [inputValue]=>[returnValue]
例如:

示例:

Func<int, int> square = x=>x*x;
int result=square(5);

您也可以使用其他两个快捷方式:
没有参数的 Func:Func<int> p=()=>8;
带有两个参数的 Func:Func<int,int,int> p=(a,b)=>a+b;


如果我调用square(5),为什么会收到“字段初始值设定项不能引用非静态字段、方法或属性”的错误? - paraJdox1

26
Func<double,double> square = x => x * x;

// for recursion, the variable must be fully
// assigned before it can be used, therefore
// the dummy null assignment is needed:
Func<int,int> factorial = null;
factorial = n => n < 3 ? n : n * factorial(n-1);
任何以下更冗长的形式也是可行的,(我以square作为示例):
  • Func<double,double> square = x => { return x * x; };
    表达式被展开成一个语句块。

  • Func<double,double> square = (double x) => { return x * x; };
    显示参数列表而不仅仅是一个带有推断类型的参数。

  • Func<double,double> square = delegate(double x) { return x * x; };
    这个使用了较老的“匿名委托”语法,而不是所谓的“lambda表达式” (=>)。

P.S.: int可能不是一种适当的返回类型,例如factorial方法。上面的示例仅用于演示语法,因此根据需要进行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接