我理解的委托,C#

委托就是把方法当做一个参数来调用 (跟js里边的回调函数是一个道理)

DataTable数据表数据的处理中经常会这样写

string sql = "select id,name from table";
DataTable dt = DBHelper.GetTable(sql);
if (dt != null && dt.Rows.Count > 0)
{
	foreach (DataRow dr in dt.Rows)
	{
          .
          .
          .//一段对DataRow数据处理的方法,每次都不一样
	}
}

 写的次数多了就会发现,这里边有很多是重复,只是DataRow的处理方法不一样,但每次都要把这些查询、判断写一遍,很麻烦。这个是可以优化的,优化如下:

/// <summary>
/// 委托声明,传入参数是DataRow,返回参数是int(参数、返回值复合这个特征的方法,都能绑定到这个委托上)
/// 委托其实也是一个类型(方法的类型),或者叫类(Class)
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
public delegate int DealRow(DataRow dr);        
/// <summary>
/// DataRow处理方法2
/// </summary>
/// <param name="dr"></param>
public static int Method2(DataRow dr)
{
	Console.WriteLine(dr["id"].ToString()+"--method2");
	return 1;
}
/// <summary>
/// DataRow处理方法1
/// </summary>
/// <param name="dr"></param>
public static int Method1(DataRow dr)
{
	Console.WriteLine(dr["id"].ToString() + "--method1");
	return 0;
}
/// <summary>
/// 通用方法
/// </summary>
/// <param name="sql"></param>
/// <param name="RowDealMethod">委托方法,把方法作为参数传递</param>
public static void DealTable(string sql, DealRow RowDealMethod)
{
	DataTable dt = DBHelper.GetTable(sql);
	if (dt != null && dt.Rows.Count > 0)
	{
		foreach (DataRow dr in dt.Rows)
		{
			int num = RowDealMethod(dr);
			Console.WriteLine(num);
		}
	}
}

声明一个委托后,只要一个方法的参数返回值跟声明的委托是一样的(比如Method1、Method2和DealRow的参数返回值一样),那它们就是一个类型的,都能绑定到DealRow这个委托上。委托其实也是一个类型(方法的类型),或者叫类(Class)。 

下面是方法的调用,以后再遇到类似的场景,只用写SQL查询语句和DataRow的操作方法就行了。

static void Main(string[] args)
{

	string sql = "select top 10 id ,proname from keyproduce";
	/*第1次执行的语句*/
	DealTable(sql, Method2);
	DealTable(sql, Method1);

	/*第2次执行的语句*/
	DealRow delegate1 = new DealRow(Method1);
	delegate1 += Method2;
	DealTable(sql, delegate1);

	/*第3次执行的语句*/
	DealRow delegate2 = new DealRow(Method2);
	delegate2 += Method1;
	DealTable(sql, delegate2);
}

其他:这是我本地数据库的一个执行结果,这三个方法的执行结果基本一样,但后两种的返回值不一样,初步猜测两个委托方法应该是在“int num = RowDealMethod(dr)”这个地方先后执行的,而第二次的返回值覆盖了第一次的返回值,所以只能打印出来一个结果

很好的一篇文章:https://www.cnblogs.com/zfg_9/archive/2008/12/23/1360508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值