首先我先介绍一个简单的小例子解释一下委托的用法;代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void
{
DelegateTest delegatetest = new DelegateTest();
delegatetest.test();
}
}
class DelegateTest
{
public DelegateTest()
{
}
public delegate void TheEvent(int a);
public void test()
{
TheEvent testdel1 = new TheEvent(del1);
testdel1(12);
}
public void del1(int x)
{
Console.WriteLine("output x : {0}", x);
}
}
}
下边是一个比较复杂的例子是事件加委托。举一个实际生活中例子 如在我公司里领导让我负责看管Z同志如果他玩游戏我就扣他的钱,
下边的例子来源于http://www.aspxboy.com/Files/71/67/281.Aspx
http://www.ddvip.net/program/c-/index1/116.htm
我和Z同事是两个对象,Z还有一个玩游戏的方法,和一个游戏事件,他一旦开始玩游戏,就触发游戏事件,而我就是那个处理事件的对象,负责扣他的钱。
所以委托要有以下几个要素
² 激发事件的对象:就是这里的Z同事
² 处理事件的对象:就是这里的我
² 定义委托:就是我要监视Z同事
下边是源代码
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharpConsole
{
// 定义委托处理程序
public delegate void PlayGameHandler(object sender, System.EventArgs e);
class Program
{
static void
{
Console.WriteLine("开始了....");
yangm yangming=new yangm();
Z zz=new Z();
// 指定监视
zz.PlayGame += new PlayGameHandler(yangming.扣钱);//在处理对象该函数中要与定义处理程序的参数相同
zz.玩游戏();
}
}
class yangm
{
public yangm()
{
Console.WriteLine("初始化yangm");
}
public void 扣钱(object sender, EventArgs e)
{
Z f = (Z )sender;//表明事件由谁来触发
f.钱= f.钱- 500;
Console.WriteLine("我可扣了Z同事的钱了");
Console.WriteLine(f.钱.ToString());
}
}
class Z
{
private int m_Money;
public Z()
{
Console.WriteLine("初始化Z");
m_Money = 1000;
}
//定义委托处理程序
// 先定义一个事件,这个事件表示“Z”在玩游戏。
public event PlayGameHandler PlayGame;
public int 钱// 此属性可以操作Z的钱。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("Z开始玩游戏了.....");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
PlayGame(this,e);
}
}
}
如果明白了,如何自己定义事件和委托。请继续看下边的另一个应用,这个应用是用在自动化测试上的,它的目的是把所有的测试案例联系在一起运行下边是源代码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace caselist
{
delegate void TestCase();
class Program
{
public void Run(string[] args)
{
Hashtable col = new Hashtable(200);
col.Add("1",new TestCase(Testcase13680.Execute));哈希表里的是一个委托的实例
col.Add("2",new TestCase(Testcase13681.Execute));
if (args.Length == 0)
foreach (DictionaryEntry entry in col)//遍历哈希表
{
RunTest((string)entry.Key, (TestCase)entry.Value);//
}
else
{
for (int i = 0; i < args.Length; ++i)
if (col.Contains(args[i]))
RunTest(args[i], (TestCase)col[args[i]]);
}
}
public void RunTest(string casenum, TestCase testcase)//
{
testcase();//调用委托实例所指向的方法
}
static void
{
string[] mergeTests =
{"1" ,"2"};
Program test = new Program();
if (args.Length != 0)
test.Run(args);
else
test.Run(mergeTests);
}
}
public class Testcase13680
{
public Testcase13680()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void Execute()
{
NotconnectedHidedetailswindow13680();
}
public static void NotconnectedHidedetailswindow13680()
{
Console.WriteLine("First Case");
}
}
public class Testcase13681
{
public Testcase13681()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void Execute()
{
NotconnectedHidedetailswindow13681();
}
public static void NotconnectedHidedetailswindow13681()
{
Console.WriteLine("Second Case");
}
}
}
浙公网安备 33010602011771号