写下这篇文章的时候已经是工作三年,突然发现自己从始至终都没有学习过任何东西,突然想学点东西又不知道从何而写那只能一个个基础重新学习。

委托

什么是委托?

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。(百度告诉我的)

自己又想了想委托不就是把方法当成一个类型传到方法中吗

通过下面这个例子我们来回顾下委托。

string[] strs = { "abcdEfG","Hjklwer"};

/// 1)一个字符串数组,将字符转换成小写
/// 2)一个字符串数组,将字符转换成大写
/// 3)一个字符串数组,将字符前后加双引号

首先说下:我是个程序员届的小学生,如有错误或者不地道的地方请谅解

我们看下这三个方法怎么实现

public static void ToLower(string[] str)
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] = str[i].ToLower();
  }
}
public static void ToUpper(string[] str)
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] = str[i].ToUpper();
  }
}
public static void ToSYH(string[] str)
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] = "\"" + str[i] + "\"";
  }
}

通过上面的这三个方法我们发现三个方法很相似只有一处是不同的。

str[i] = str[i].ToLower();

str[i] = str[i].ToUpper();

str[i] = "\"" + str[i] + "\"";

只是这三个方法不同如果我们能将str[i].ToLower()、str[i].ToUpper()、"\"" + str[i] + "\"" 当成方法传进一个方法多好。

首先我们重新写个方法将原来的方法干掉。

public static void ToZhuanHuan(string[] str,'')
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] ='';
  }
}

我们就差把方法传进来了

我们再定义一下str[i]='';传进来的方法;

我们发现只不过是传进来三个方法:将一个string转换成大写、小写、加双引号。

public static string ToLower(string str)
{
  return str.ToLower();
}
public static string ToUpper(string str)
{
  return str.ToUpper();
}
public static string ToSyh(string str)
{
  return "\"" + str + "\"";
}

好,三个方法都定义好了,现在我们就差将方法传进来了。我们可以像以下的方法传

public static void ToZH(string[] str)
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] = ToLower(str[i]);
  }
}

str[i] = ToLower(str[i]);这样传实现是实现了但是要三个转换就又要写三个方法,这样也太不智能了。不行我要是能把方法当成参数传进去该有多好。就像string[] str一样。

那么委托来了

首先我们要定义一个委托

public delegate string DelZhuanHuan(string str);

定义委托时关键词delegate,类型要和你的方法类型一样

public static string ToLower(string str)
{
  return str.ToLower();
}

那么你的委托也只能是string 你的ToLower方法也是传入string 那你定义的委托也要是委托

委托定义好了那么我们现在将委托传入你刚才写的ToZH方法吧

public static void ToZH(string[] str,DelZhuanHuan del)
{
  for (int i = 0; i < str.Length; i++)
  {
    str[i] = del(str[i]);
  }
}

下面我们要调用这个新方法看看打印出来什么玩意吧

static void Main(string[] args)
{
  string[] strs = { "abcdEfG","Hjklwer"};
  ToZH(strs,ToLower);
  foreach (var item in strs)
  {
    Console.WriteLine(item);
  }
  Console.ReadKey();
}

abcdefg

hjklwer

成功是成功了但是发现方法没变少啊!

那么下面我们从另一个例子看下

例:传入两个参数求两个参数之和

public static int Add(int a,int b)
{
  return a + b;
}

我们用委托写下

public delegate int DelAdd(int a,int b);

static void Main(string[] args)
{
  DelAdd dell = new DelAdd(Add);
  dell(1,2);
  Console.WriteLine(c);
}

我们现在不想要写Add方法了

干掉

那我们这样写既然我们不想写Add了,那我们要运行一个方法返回两个值的和那就直接写这个方法吧。

static void Main(string[] args)
{
  DelAdd dell = new DelAdd(Add);
  dell(1,2);
  DelAdd del = new DelAdd(delegate(int a,int b) { return a + b; });
  int c= del(1,4);
  Console.WriteLine(c);
}

我们在实例化这个委托的时候 我们直接写了这个方法

DelAdd del = new DelAdd(delegate(int a,int b) { return a + b; });

其实这个写法和下面这个写法一样的

DelAdd del1 = delegate (int a, int b) { return a + b; };

这就是匿名委托

不用再写Add方法了

但是还是没有优化啊 我特么也不想写委托 每次都写烦死了

微软大大想了想。好吧给你们几个通用的委托吧 这就创造了泛型委托Action,Func

我们看下func的标签

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

微软给我们自动定义了一个泛型委托

那我们不用自己定义委托了那么接下来怎么写呢

Func<int, int, int> func1 = delegate (int a,int b) { return a + b; };

我们来看下lambda怎么写

Func<int, int, int> func2 = (int a, int b)=>{ return a + b; };

我们不想要定义的类型 ,因为泛型会自动给我们转成对于的类型继续优化

Func<int, int, int> func3 = (a, b) => { return a + b; };

我不想要return了

Func<int, int, int> func4 = (a, b) => a + b;

如果请求参数只是一个值的时候 我们还可以更加省略

Func<int, int> func5 = a => a * 2;

是不是很简单了

来我们再回头看下之前的那个转换成小写和大写的那个方法

刚才就看他不爽了我们能不能用泛型进行优化呢

我们先用匿名函数写下

public delegate void DelTo(string[] str);

DelTo del = delegate(string[] str1) {
  for (int i = 0; i < str1.Length; i++)
  {
    str1[i] = str1[i].ToLower();
  }
};

我们不想定义委托了那么我们就使用泛型吧

Action<string[]> action1 = (string[] str1) => {
  for (int i = 0; i < str1.Length; i++)
  {
    str1[i] = str1[i].ToLower();
  }
};
总结:lambda就是从匿名委托而来

从委托到Lambda的更多相关文章

  1. 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

    本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...

  2. 使用匿名委托,Lambda简化多线程代码

    使用匿名委托,Lambda简化多线程代码   .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...

  3. 转载 C#匿名函数 委托和Lambda表达式

    转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...

  4. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  5. 委托与Lambda表达式

    ~,先不急说委托和Lambda表达式,先看两个例子再说: 1. 通过委托,为一个数字加10,如下代码: class Program { private delegate int JiSuan(int ...

  6. 系统预定义委托与Lambda表达式

    NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式   开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Fun ...

  7. C#函数式程序设计之函数、委托和Lambda表达式

    C#函数式程序设计之函数.委托和Lambda表达式 C#函数式程序设计之函数.委托和Lambda表达式   相信很多人都听说过函数式编程,提到函数式程序设计,脑海里涌现出来更多的是Lisp.Haske ...

  8. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  9. 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  10. 委托、Lambda表达式、事件系列07,使用EventHandler委托

    谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用 ...

随机推荐

  1. 数组循环:循环多个li 每个li 固定N条数据

    PHP代码: $arr = array(1,2,3,4,5,6,7); $x = 1; $y = 0; foreach($arr as $k => $v){ $data[$y][] = $v; ...

  2. CCI4.4/LintCode Balanced Binary Tree, Binary Tree, Binary Search Tree

    Binary Tree: 0到2个子节点; Binary Search Tree: 所有左边的子节点 < node自身 < 所有右边的子节点: 1. Full类型: 除最下面一层外, 每一 ...

  3. ased

    1.document.write(""); 输出语句 2.JS 中的注释为 // 3. 传统的 HTML 文档顺序是 :document->html->(head,bo ...

  4. fastjson解析json,model字段有顺序要求吗

    解决办法已经写到我的公众号,二维码在下面,欢迎关注,谢谢. 本人联系方式: 更多精彩分享,可关注我的微信公众号: 若想给予我分享更多知识的动力,请扫描下面的微信打赏二维码,谢谢!: 微信号:Weixi ...

  5. linux文件目录权限详解(20170101)

    linux目录权限与文件权限是不同的,二者要相互配合,这是基础. 比如要读文件:目录至少要有x,文件至少要有r. 要写文件:目录至少要有x,文件至少要有rw. 要执行文件:目录至少要有x,文件至少要有 ...

  6. IIs安装&发布&解决遇到的问题

    IIS安装: IIS发布: 1.添加网站: 2.将发布的文件,copy到该网站的目录下 3. 刷新,文件显示出来,将其"转换为应用程序” => 4.在应用程序池中找到该网站相应的程序池 ...

  7. USACO 2015 December Contest, Gold Problem 2. Fruit Feast

    Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...

  8. 在指定的div中搜索内容,并滚动显示到当前搜索到的内容处

    我想要的是页面中有个带滚动条的div对象,里面有很多内容,想要用js搜索到div中的某个字符串内容,然后将div的滚动条滚动到搜索到的内容处显示,自动定位.先是查找页面中的内容,然后将找到的内容创建t ...

  9. 怎么样修改PHPStorm中文件修改后标签和文件名的颜色与背景色

    自从最近在PHPstrom里引入Git,并且使用MONOKAI_SUBLIME主题之后 ,当文件在PHPstrom中进行编辑,文档内容变化时,左侧项目文件列表中的文件名颜色以及右侧编辑区域标签卡的文件 ...

  10. Nagios监控平台之一:在Centos上安装Nagios服务

    1.安装依赖包 #yum install httpd httpd-devel php openssl-devel #yum install gcc glibc glibc-common #yum in ...