zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# 从函数到委托

c# 函数 委托
2023-09-14 09:02:10 时间


这个程序有一点点呆,很明显程序的前半部分和后半部分拥有类似的结构,只是控制i的循环变量的终值不同。因此我们可以提取出一个函数:




这个程序和那个Sum函数的结构还是类似的,我们能不能写出一个通用的函数呢?有的人不假思索地这么写:



这样type传1就可以累加所有的数字,传2只累加偶数。

那么现在要累加奇数怎么办呢?再加一个type=3吧。如果要累加质数呢?……你开始抱怨,需求怎么能这么多呢。

我们再仔细看下代码,我们发现,这些需求虽然都有差异,但是程序中唯一变化的只有循环体中的判断。我们有没有办法将这个判断作为参数传进去呢?如果可以,那么问题似乎就解决了。

委托就是这样一种类型,它这种类型代表一段代码,使得我们可以将它作为参数传给函数,函数将它放入那个需要变化的地方执行,从而允许我们作为调用者来自定义函数的一些行为。




当我们传入foo2,那么Sum只累加偶数,如果传入foo1,那么Sum全部累加。如果只累加奇数呢?我们只要定义一个函数:




即可。
请注意,foo1 foo2 foo3虽然和 Sum 写在一起,但是在这里,我们将它视为函数的调用者定义的,而不是编写Sum的那个人定义的。我们可以无限扩展。编写出foo4 foo5……,从而实现各种不同的需求。

fooN 这个函数有什么特点呢?它们是为了给Sum提供参数而临时定义的,事实上,我们也不打算在别的地方再利用它,那么这个函数的函数名作为实参其实没有什么用,所以C#提供了一种更简单的写法:




在这里,我们将foo2这个函数的定义合并到了对Sum的调用中,它看上去更像一个参数。

还不够简单?也许你觉得已经很简单了,但是的确C#提供了更简单的写法,那就是Lambda表达式:它的写法是

(参数列表) =  { 语句体 }

当语句体中的语句只有1行,并且是 return 表达式; 这样的形式的时候,我们可以省略花括号,直接写表达式。更cool的是,Lambda可以自动推定参数的类型,于是int n中的int也省下了。




C#还特别规定,当参数只有1个的时候,括号也可以省略,所以上面的代码的最终形式可以表示成:


C#-委托 看到项目有使用委托,一直都搞不明白是怎么回事,看了好几遍才略懂一二,关于c#接触时间时间短,目前工作有用到c#进行开发,实际工作中写的更多的是业务代码,一些技巧性的东西,还是得下去找时间研究一下,不然还是一知半解,不知所云……
C#委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。 有四种表现形态:delegate、Action、Func、predicate 委托定义要和作为其参数的方法形式一样,也就是说,参数、返回值及其他都是相同