你能给C#中的变量赋值吗?

你能给C#中的变量赋值吗?,c#,C#,我看到一个函数可以用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#中相同的方法定义函数吗。如果是的话,请用c#please给出一小段类似上面的函数定义。谢谢。F

我看到一个函数可以用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#中相同的方法定义函数吗。如果是的话,请用c#please给出一小段类似上面的函数定义。谢谢。

Func square=x=>x*x;
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);
//对于递归,变量必须完全 //因此,在它可以使用之前分配 //需要伪空赋值: Func阶乘=null; 阶乘=n=>n<3?n:n*阶乘(n-1);
以下任何更详细的形式也是可能的:(我使用
square
作为示例):

  • Func square=x=>{return x*x;}
    表达式将展开为语句块

  • Func square=(双x)=>{return x*x;}
    显式参数列表,而不仅仅是一个推断类型的参数

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


p.S.:
int
对于
factorial
等方法可能不是合适的返回类型。上述示例仅用于演示语法,因此请根据需要进行修改。

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

delegate int del(int number);
然后分配并使用它:

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

    int result= square (5);
或者,如前所述,您可以使用代理的“快捷方式”(由代理生成)并使用:

Func[methodName]=[inputValue]=>[returnValue]
例如:

Func square=x=>x*x
int结果=平方(5)

您还有两个其他快捷方式:
Func不带参数:
Func p=()=>8

Func有两个参数:
Func p=(a,b)=>a+b

作为旁注(每当它弹出时我都会这样说),在C#中,您通常会谈论方法,而不是函数。@严格来说,函数是这里正确的术语。将
Func
命名为
Func
@chibacity:
Func
并不是巧合,因为它代表了函数的概念,因此委托类型的命名是恰当的。然而,在C语言中,没有函数。您只能向委托订阅方法(即使它们是匿名的)。“函数”一词在C#的上下文中根本不合适。@stakx我不同意,它是语义上有用的术语。它嵌入了一个事实,即有一个返回值,并且像本例中那样纯粹,没有副作用。术语“方法”并不表示这一点。@stakx同意,我最初只是假设OP已经知道C#和JS中方法和函数的基本知识。不幸的是,术语过载。如果调用square(5),为什么会收到“字段初始值设定项无法引用非静态字段、方法或属性”错误?
   del square = delegate(int x)
    {
        return x * x;
    };

    int result= square (5);
Func<[inputType], [outputType]> [methodName]= [inputValue]=>[returnValue]