委托就是把方法当做一个参数来调用 (跟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