委托可以认为是包含具有相同签名和返回值类型的有序方法的对象。
2、声明委托类型
委托是类型,和类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。
委托中所包含的方法必须与声明委托的返回值类型、签名相同。
例:delegate void HelloWord(string name);
委托类型声明与方法有两个不同:1以关键字delegate开头,没有方法主体“;”代替。
3、创建委托对象
委托是引用类型,因此有引用和对象。在委托类型声明之后,可以声明变量并创建类型的对象。
委托类型名 变量 方法
HelloWord chinese = Chinese;
HelloWord chinese = new HelloWord(Chinese);
方法可以使实例方法或静态方法都可以。
Program pro = new Program();
HelloWord english = pro.English;
4、赋值委托
由于委托是引用类型,我们可以通过赋值来改变包含在委托变量中的引用。
例:HelloWord chinese = Chinese;
HelloWord chinese = Chinese2;//上一个委托会被销毁
5、组合委托
委托可以使用运算符来组合创建新的委托。
HelloWord ChineseAndEnglish = chinese + english;
6、委托增加方法
HelloWord chinese += pro.English;
增加方法实际上是生成了一个新的委托,其调用列表是左边的委托加上右边的方法的组合。
方法是加在调用方法列表的最底部。
7、委托移除方法
HelloWord chinese -= pro.English;
和增加方法一样也是生成了一个新的委托,新的委托是旧的委托的副本,只是没有了被移除方法的引用。
移除委托的注意事项:
-=运算符从列表最后开始搜索并移除一个匹配的方法;
试图删除不存在方法没有效果;
试图删除空委托会抛出异常;
可以把委托和null比较判断委托的调用列表是否为空,为空则为null;
8、调用委托
用于调用委托的参数会被调用与列表的每一个方法(除非有一个参数是输出参数)
一个方法可以在列表中出现多次,每次调用到方法时都会被调用一次。
delegate void HelloWord(string name);
class Program
{
static void Chinese(string name)
{
Console.WriteLine("你好:" + name);
}
void English(string name)
{
Console.WriteLine("Hello:" + name);
}
static void Main(string[] args)
{
HelloWord chinese = Chinese;
Program pro = new Program();
HelloWord english = pro.English;
chinese("小明");
english("Alex");
}
}
后面的慢慢补充。
,