定义委托,相当于自定义委托声明的类。
委托可看出是一个函数的“容器”,将某一函数装入后,可把委托当作函数一样使用。
例一:
using System;
namespace Delegate0
{
//可以将方法动态的赋给参数,可避免在程序中大量使用if-else,或Switch语句。有更好灵活性和可扩展性。
public class operclass
{
//定义委托,注意委托的参数类型和返回值类型;参数类型为int,返回值类型为int;
//相当于自定义类,其生成的对象可以生成一切委托类型的函数名。
public delegate int Mydelegate(int x, int y);
//任何参数类型为两个int,返回值为int的函数名,都可作为第三个参数的实参
public int oper(int x, int y, Mydelegate mydelegate)
{
return mydelegate(x, y);
}
public int add(int x, int y) //两数相加方法
{
return x + y;
}
public int sub(int x, int y) //两数相加方法
{
return x - y;
}
}
class Program
{
static void Main(string[] args)
{
operclass myoperclass = new operclass();
Console.WriteLine("1+1={0}", myoperclass.oper(1, 1, myoperclass.add));
Console.WriteLine("1-1={0}",myoperclass.oper(1,1,myoperclass.sub));
}
}
}
输出:
add10
例二:
using System;
public delegate void greet(string s);//定义委托
public class greetclass
{
public greet greetdelegate;//实例化委托
public void Englisgreet(string name)
{
Console.WriteLine("Hello"+name);
}
public void Chinesegreet(string name)
{
Console.WriteLine("你好"+name);
}
public void greeting()
{
if (greetdelegate!=null)//绑定委托,则因此句触发。
{
greetdelegate("张三");
}
}
}
public class main
{
static void Main(string[] args)
{
greetclass greetclass = new greetclass();
greetclass.greetdelegate = greetclass.Englisgreet;
greetclass.greetdelegate = new greet(greetclass.Chinesegreet);//重新实例化委托greet
greetclass.greetdelegate += greetclass.Englisgreet;
greetclass.greetdelegate += greetclass.Chinesegreet;
greetclass.greetdelegate("hhhhhhhhhhhhhhhhh");
greetclass.greeting();
}
}