C# 匿名函数

1、匿名函数

没有名字的函数,主要是配合委托和事件进行使用,脱离委托和事件是不会使用匿名函数的

2、基本语法

delegate (参数列表){
      //函数逻辑
};

何时使用?

(1)函数中传递委托参数时

(2)委托和事件赋值时

3、使用

(1)无参无返回

Action a = delegate () {
    Console.WriteLine("匿名函数");
};
a();

(2)有参 

Action a = delegate (int value) {
    Console.WriteLine(value);
};
a(100);

(3)有返回值

直接return,返回值自动识别

Func a = delegate () {
    return "返回值匿名函数";
};
Console.WriteLine(a());

(4)一般情况会作为函数参数传递,或者作为函数返回值

class Test {
    public Action action;

    // 作为参数传递
    public void DoSomeThing(int a, Action action) {
        Console.WriteLine(a);
        action();
    }

    // 作为返回值 
    public Action GetFun() {
        return TestRet;
    }

    public void TestRet() {

    }

    // 或者一步到位
    public Action GetFun2() {
        return delegate () {
            Console.WriteLine("作为返回值的匿名函数");
        };
    }
}

作为参数传递的调用

Test t = new Test();
// 方式一
t.DoSomeThing(100, delegate () {
    Console.WriteLine("作为参数传递的匿名函数");
});

// 方式二
Action ac = delegate () {
    Console.WriteLine("作为参数传递的匿名函数");
};
t.DoSomeThing(100, ac);

作为返回值的调用

// 方式一
Action ac = t.GetFun2();
ac();
// 方式二
t.GetFun2()();

4、匿名函数的缺点

添加到委托或事件容器中后,无法单独移除,只能直接清空

 注意!!!匿名函数会改变变量的生命周期,例如:

static Func TestFun(int v) {
    return delegate (int i) {
        return i * v;
    };
}

然后进行调用

Func fun = TestFun(2);
Console.WriteLine(fun(3))

可以发现,v的生命周期在TestFun()结束时没有停止

你可能感兴趣的:(c#)