zoukankan      html  css  js  c++  java
  • c# 匿名方法(委托)

    概念了解

    1、什么是匿名委托(匿名方法的简单介绍、为什么要用匿名方法)

    2、匿名方法的【拉姆达表达式】方法定义

    3、匿名方法的调用(匿名方法的参数传递、使用过程中需要注意什么)

    什么是匿名方法?

    匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数。

    C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。也不能在匿名方法外部使用的ref和out参数

    通过使用匿名方法,可以不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。例如,如果创建方法所需的系统开销是不必要的,则指定代码块(而不是委托)可能非常有用。

    什么时候该使用匿名方法

    1.需要一个临时方法,该方法使用次数极少;
    2.这个方法的代码很短,甚至可能比方法声明都短的情况下使用。
     
    匿名方法的声明、调用
      

    C#3.0之后匿名方法可以使用λ表达式来进行定义

    无论是拉姆达(lambda)表达式(匿名函数、是匿名类) ,都能归属到一种叫闭包的东西上面。

    左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号。右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加。

    这是λ表达式的简单实现↓

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    delegate string MyDelegate(string message);
     
    string str1 = "str1";
     
    string str2 = "str2";
     
    MyDelegate my1 = param => param + str1 + str2;
     
    MyDelegate my2 = (string param)=>{return param + str1 + str2;};
     
    Console.WreiteLine(my("param"))
     
    Console.WreiteLine(my2("param"));
     
    class Program
     
    {
     
      delegate void MyDelegate(string message);
     
      static void Main(string[]  args)
     
      {
     
        1.一般的调用命名方法
     
        MyDelegate mydelegate = Write;
     
        //委托
     
        mydelegate += delegate(string m)
     
        {
     
          Console.WriteLine("{0} this is using delegate",m);
     
        };
     
        //拉姆达
     
        mydelegate += (string m)=>
     
        {
     
          Console.WriteLine("{0} this is using  lambda",m);
     
        }
     
        mydelegate("C#");
     
      
     
      
     
      
     
      static   void  Write(string message)
     
      {
     
        Console.WriteLine("{0} this is using named method", message);
     
      }
     
    }

    使用c# 自带的委托:Action、Action<T>、Func<T>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Func<String> func1 = () => { return "Func1"; };
    //Func<String> func1 = delegate { return "Func1"; };
    Console.WriteLine(func1());
    Func<String, String> func2 = m => { return m; };
    //Func<String, String> func2 = delegate(string m) { return m; };
    Console.WriteLine(func2("Func2"));
    Func<String, int, String> func3 = (string m, int i) => { return m + i; };
    //Func<String, int, String> func3 = delegate(string m, int i) { return m + i; };
    Console.WriteLine(func3("Func", 3));

    Func泛型示意图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    delegate TResult Func<out TResult>();
    Func<TResult>
    Func<T, TResult>
    Func<T1, T2, TResult>
    Func<T1, T2, T3, TResult>
    Func<T1, T2, T3, T4, TResult>
    Func<T1, T2, T3, T4, T5, TResult>
    Func<T1, T2, T3, T4, T5, T6, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>
    Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>

    一个将匿名方方法用于多线程的实例实现参数传递

    string[] Arr = new string[] { "Thread1", "Thread2", "Thread3", "Thread4" };
    Thread[] Multithreading=new Thread[Arr.Length];
    for (int i = 0; i < Arr.Length; i++)
    {
        Multithreading[i] = new Thread(new ThreadStart(() =>
        {
            Console.WriteLine(Arr[i]);
        }));
        Multithreading[i].Start();
    }

    使用Action<T>拓展自己的ForEach

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public static IEnumerable<T> Foreach<T>(this IEnumerable<T> source, Action<T> func)
    {
        foreach (var item in source)
        {
            func(item);
        }
        return source;
    }
     
     
    IEnumerable<News> news = db.News.Select(p => p.ID>10).Foreach(p =>
    {
        p.ID = p.ID + 3;
        Console.WriteLine(p.ID);
    });
  • 相关阅读:
    Springboot配置文件解析器
    ThreadLocal的简单使用和实现原理
    hashCode()方法对HashMap的性能影响
    Thread中的join()方法
    Windows使用MongoDB,以及索引创建
    Android--我的Butterknife黄油刀怎么找不到控件了!!!
    Android--RecyclerView的封装使用
    Android--自定义加载框
    Android--Retrofit+RxJava的简单封装(三)
    Android--Retrofit+RxJava(二)
  • 原文地址:https://www.cnblogs.com/ruiati/p/2869427.html
Copyright © 2011-2022 走看看