• C# 匿名委托、匿名方法、匿名对象、Lambda表达式


    C# 匿名委托、匿名方法、匿名对象、Lambda表达式

    一、匿名类型
    可通过使用 new 运算符和对象初始值创建匿名类型。
    示例:
    var v = new { Name = "Micro", Message = "Hello" };
    var v = new[] { 
        new { Name = "Micro", Message = "Hello" }, 
        new { Name = "Soft", Message = "Wold!" }
    };
    匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。
    var Query = from p in v select new { p.Name };
    foreach (var o in Query)
    {
        Console.WriteLine(o.Name);
    }
    可以查找对象
    IEnumerable<v> results = people.Where(delegate(v p) { return p.Name == "Micro"; }); 

    二、匿名方法
    要将代码块传递为委托参数 例如:
    点击事件
    button1.Click += delegate(System.Object o, System.EventArgs e)

        System.Console.WriteLine("Hello");
    };
    this.Loaded += delegate
    {
        InitializeEvent();
    };

    加载事件
    this.Loaded += (sl, el) =>
    {
        System.Console.WriteLine("Hello");
        this.button1.Click += (sender, e) =>
        {
            System.Console.WriteLine("Wold!");
        }
    }

    匿名方法与线程
    System.Threading.Thread thread = new System.Threading.Thread(delegate(j)
    {
        System.Console.WriteLine("Hello");
    });
    thread.Start();

    System.Threading.ThreadPool.QueueUserWorkItem((s) =>
    {
        Action f = () =>
        {
            System.Console.WriteLine("Wold!");
        };
    }

    使委托与匿名方法关联
    delegate void DEL(string s);
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        DEL p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };
        p("Hello");
    }

    三、Func,Func是有返回值的泛型委托
    Func<int> 表示无参,返回值为int的委托
    Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
    Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
    Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托
    Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

    匿名方法只能在使用委托的时候创建,事实上,它们通过delegate关键字创建。
    使用示例:
    var func = new Func<bool, int>(delegate(bool x) { return x ? 10 : 5; });
    int ret = func(true);

    四、匿名事件
    btn.Click += delegate(object o, EventArgs e) {  };

    五、Lambda 表达式,Func<T>委托
    MSDN中写道:“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。
    所有Lambda表达式都使用Lambda运算符=>
    左边是输入参数列表
    1.一个参数:param=>expr
    2.多个参数:(param-list)=>expr

    右边是表达式或语句块
    (参数列表)=>表达式或语句块 

    合法的Lambda表达式
    1、(x, y) => x * y                    //多参数,隐式类型=> 表达式  
    2、x => x * 5                        //单参数, 隐式类型=>表达式  
    3、x => { return x * 5; }            //单参数,隐式类型=>语句块  
    4、(int x) => x * 5                    //单参数,显式类型=>表达式  
    5、(int x) => { return x * 5; }     //单参数,显式类型=>语句块  
    6、() => Console.WriteLine()        //无参数 

    在编写Lambda表达式时,可以忽略参数的类型,因为编译器能够根据上下文直接推断参数的类型,示例代码如下。
    (x, y) => x + y                        //多参数,隐式类型=> 表达式 

  • 相关阅读:
    django计数器: form collections import Counter
    issubclass使用
    Python rpartition() 方法
    try...except...else高级用法
    FBV及CBV区别
    类属性及对象属性
    判断类或对象方法
    django md5
    @cached_property
    js Array 中的 map, filter 和 reduce
  • 原文地址:https://www.cnblogs.com/mathyk/p/9723786.html
Copyright © 2020-2023  润新知