---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值(通俗的讲:委托就是一个方法的容器)所有定义的委托类都继承于MulticastDelegate类又继承与Delegate类
1)简单-代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region 委托的简单概述:
private void btnDelegate_Click(object sender, EventArgs e)
{
//委托实例格式:委托名 实例名=new 委托名(参数) 【这里的参数就是方法名,只是没有带括号】
SayHi sayHiObj = new SayHi(SayHiCN); //创建一个委托对象sayHiObj(通俗的说委托就是一个装方法的容器)
sayHiObj += SayHiUS; //用运算符"+="向委托对象添加方法,也可以用"-="运算符移除方法
sayHiObj += StaticMethod; //也可以添加静态方法
sayHiObj(); //如同调用方法一样调用委托
}
//创建两个方法,并且方法的签名都和委托一样(返回值类型,有无参数或参数类型顺序一样)
void SayHiCN() //中国人说汉语的方法1
{
MessageBox.Show("你好!,我是中国人,说汉语的!");
}
void SayHiUS() //美国人说英语的方法2
{
MessageBox.Show("Hello,I'm American,Speak English!");
}
static void StaticMethod()
{
MessageBox.Show("我是静态方法!");
}
#endregion
}
/*委托是一种引用类型,它存储了方法的引用
委托类的定义格式:[修饰符] delegate 返回值类型/void 委托名([参数类型 参数]); */
delegate void SayHi(); //定义一个委托类
2)委托作为参数
代码:
class Program
{
static void Main(string[] args)
{
Test test = new Test(); //实例一个Test类的test对象
string s = "调用委托"; //定义一个字符串
DeShow ds = new DeShow(test.Show); //实例一个委托ds对象
ds += Show1; //使用运算符"+="添加Show1方法到委托对象中
ds(s); //调用委托
MethodShow(test.Show); //调用包含委托为参数的方法,并且把test.Show方法传入
Console.ReadKey();
/*结果:
调用委托
字符串的长度:4
显示一个普通方法!
----------------------------------
字符串的长度:34
-----------委托作为参数-----------
字符串的长度:28
----------------------------------
字符串的长度:34
*/
}
/// <summary>
/// 定义一个包含委托为参数的方法
/// </summary>
static void MethodShow(DeShow deShow) //传入字符串的方法,且委托作为参数
{
deShow("----------------------------------");
deShow("-----------委托作为参数-----------");
deShow("----------------------------------");
}
static void Show1(string str1)
{
Console.WriteLine("显示一个普通方法!");
}
}
public class Test
{
public void Show(string Msg) //显示方法
{
Console.WriteLine(Msg);
Console.WriteLine("字符串的长度:{0}",Msg.Length);
}
}
public delegate void DeShow(string str); //定义一个委托类
3)泛型委托为参数的方法
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//创建人的数组
person[] persones =
{
new person(){Name="刘诗诗",Age=25},
new person(){Name="范冰冰",Age=32},
new person(){Name="景甜",Age=23},
new person(){Name="全智贤",Age=31}
};
//调用委托时,传入一个数组和一个方法,获取一个最大和最小元素的返回值
person getMax = GetMax<person>(persones, GetPer);
person getMin = GetMin<person>(persones, GetPer);
MessageBox.Show(getMax.Name+"-"+getMax.Age.ToString()+"岁"+"|"+getMin.Name+"-"+getMin.Age+"岁"); //输出元素的名字和年龄
}
#region 定义一个比较方法
int GetPer(person x, person y)
{
if (x.Age > y.Age)
{
return 1;
}
else if (x.Age < y.Age)
{
return -1;
}
return 0;
}
#endregion
#region 定义一个泛型类型且委托为参数的方法
/// <summary>
/// 获得数组里最大和最小的元素
/// </summary>
/// <typeparam name="T">泛型参数</typeparam>
/// <param name="arrT">泛型数组</param>
/// <param name="decom">用来比较两个元素的方法</param>
/// <returns></returns>
T GetMax<T>(T[] arrT1, DeCompare<T> decomMax) //获取最大元素的泛型方法
{
T Max = arrT1[0];
for (int i = 1; i < arrT1.Length; i++)
{
//如果委托返回1,说明arrT[i]>Max
if (decomMax(arrT1[i], Max) == 1)
{
Max = arrT1[i];
}
}
return Max;
}
T GetMin<T>(T[] arrT2, DeCompare<T> decomMin) //获取最小元素的泛型方法
{
T Min = arrT2[0];
for (int i = 1; i < arrT2.Length; i++)
{
//如果委托返回-1,说明arrT[i]< Min
if (decomMin(arrT2[i], Min) == -1)
{
Min = arrT2[i];
}
}
return Min;
}
#endregion
}
#region 定义人的类,包含名字和年龄字段
public class person
{
public string Name;
public int Age;
}
#endregion
/// <summary>
/// 泛型委托 -- 返回值为int类型,如果 t1>t2,则返回1 ,t1=t2 返回0 , t1<t2 返回-1
/// </summary>
public delegate int DeCompare<T>(T t1,T t2);
事件通俗说就是对委托的约束 声明格式:修饰符 event 事件类型 事件名; (其中事件类型是委托类型)
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
person per = new person();
per.deEvent += SayHiCN; //为事件添加方法
per.deEvent += SayHiUS;
per.TestEvent();
}
public void SayHiCN() //中国人说汉语的方法1
{
MessageBox.Show("你好!,我是中国人,说汉语的!");
}
public void SayHiUS() //美国人说英语的方法2
{
MessageBox.Show("Hello,I'm American,Speak English!");
}
static void StaticMethod()
{
MessageBox.Show("我是静态方法!");
}
}
public class person
{
public event DeEventPer deEvent; //定义事件
//创建事件就相当于 创建了:
//1.一个私有的委托对象
//2.一组事件属性方法:add 和 remove 方法,并且这两个方法都直接操作 第一步创建的委托对象
public void TestEvent()
{
deEvent(); //调用事件
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
public delegate void DeEventPer(); //定义一个委托类型
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------