您的位置:首页 > 编程语言 > C#

C# 委托的发展,变化

2009-09-22 17:53 127 查看
委托的发展变化是随着C#版本的变化发展而发展的,委托在Windows程序设计中的重要使用,理解了委托才算是C#入门。本篇文章主要介绍一下委托的发展。
含义:委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
格式:类似方法的定义,但没有方法体,定义的委托名前要加上关键字delegate。
作用域:可以在定义类的任何地方定义委托,既可以在另一个类的内部定义委托,也可以在所有类的外部定义委托,还可以在命名空间中把委托定义为顶层对象。根据定义的可见性,可以在委托定义上添加一般的访问修饰符:public、private和protected等
优势:1、简化调用方法。2、提升应用程序的性能
下面显示委托在各版本中的不同写法:
1、vs2003, 对应的C# 1.1

delegate int HandlerAdd(int a, int b);

static int NumberAdd(int a, int b)
{
int num = a + b;
Console.WriteLine(num);
return num;
}

static void Main(string[] args)
{
HandlerAdd operate = new HandlerAdd(NumberAdd);
operate(10,20);
}

2、vs2005,对应的C#2.0版本,这个版本下明显的特点是可以使用匿名委托

delegate int HandlerAdd(int a, int b);

static void Main(string[] args)
{
//匿名委托
HandlerAdd operate = delegate(int a, int b) { return a + b; };
int num = operate(10,20);
Console.WriteLine(num);
}

3、vs2008,对应的c#3.5版本(3.0版本就已经有了),拉姆达(lamaba expression)表达式的引入,赋予委托极具变化的特征

delegate int HandlerAdd(int a, int b);
static void Main(string[] args)
{
HandlerAdd operate = (a, b) => { return a + b; };
int num = operate(10,20);
Console.WriteLine(num);
}

C#3.5版本中,引进了一个泛型委托Func , 我们看下面的系统定义:

namespace System
{
public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3 TResult>(T1 arg1, T2 arg2, T3 arg2);
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
} 该泛型委托必须要有返回值TResult,否者会报错。既然已经定了我们直接拿过来使用就可以:

static void Main(string[] args)
{
int number = 0;
Func<int> function1 = () => { return 1; };
Func<int,int> function2 = (int a) => { return a; };
Func<int,int,int> function3 = (int a,int b) => { return a + b; };
Func<int,int,int,int> function4 = (int a,int b,int c) => { return a + b+ c; };
Func<int,int,int,int,int> function5 = (int a,int b,int c,int e) => { return a + b+ c + e; };

number = function1();
number = function2(1);
number = function3(1,2);
number = function4(1,2,3);
number = function5(1,2,3,4);

//这些写法都是相同的
Func<int, int, int, int, int> function6 = Count;
}

public static int Count(int a, int b, int c, int d)
{
return a + b + c + d;
}

可以看出Func这个委托,仅仅适用有返回值的情况,那么我们会问,为什么必须要有返回值呢?没有返回值也是可以的呀。显然Func有非常特殊的用法,而且这个特殊的用法必须要有返回值才可以,我们看下面的代码:

static void Main(string[] args)
{
//定义一个委托 FindValue 判断字符串中是否有包括 "a" 这个值
Func<string, bool> FindValue = (string a) => { return a.IndexOf("a") != -1 ; };

//构造一个数组
List<string> arr = new List<string>();
arr.Add("aaaa");
arr.Add("bbbb");

//把 FindValue 传递到 Where 方法中
var result = arr.Where(FindValue).ToList();

Console.WriteLine(result.Count); //值是 1
}

上面代码中, 把委托FindValue传递给Where方法。其实就是让Where方法去调用FindValue这个委托来进行判断,如果没有一个bool的返回值,就无法判断。所以Func委托必须要有返回值。这也是Lambda表达式的特殊的地方,中心就是调用Func委托方法进行相关的判断。
从委托的发展,我们可以看出c#是越来越美,编写的代码也是越来越少。所以有人说:下一代编程语言最有可能会从C#中产生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: