.NET中几个最有用的委托

在.NET中,在使用委托前,需要使用delegate关键字来定义委托,然后在实例化,再执行之。

在每次使用前,都需要定义该委托类型,稍嫌麻烦和多余。

在.NET 4.0中,有了如下的几个泛型委托,就省去了您定义委托的麻烦了。

分别有:

public delegate void Action();
public delegate void Action<in T>(T obj);
public delegate void Action<in T1, in T2>(
	T1 arg1,
	T2 arg2
);


Action<T1, T2, T3>

Action<T1, T2, T3, T4>

依次类推,直到共有16个输入参数的泛型委托,在这点上,微软是不是也挺仗义的,不过,还有呢。

除了不带返回值的这16个泛型委托的定义,还有带返回值的16个泛型委托

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T, out TResult>(
	T arg
);
public delegate TResult Func<in T1, in T2, out TResult>(
	T1 arg1,
	T2 arg2
);




依次类推,也是共有16个泛型委托。

 

这下基本上就满足了所有常用的委托定义了。

 

下面列举一个把匿名方法和泛型委托一块使用,来解决在另外一个线程中更新控件的例子

 

        private void LoadDBData()
        {
            DBInfoLogic dbLogic = new DBInfoLogic();
            this.DBList = dbLogic.GetDBInfoByCategoryID(null);

            Action<List<DBInfoModel>> setControl = delegate(List<DBInfoModel> dbList)
            {
                TreeNode nodeHome = this.tvMain.Nodes["HOME"];
                TreeNode nodeDB = nodeHome.Nodes["DB"];

                if (nodeDB == null) return;
                nodeDB.Nodes.Clear();
                foreach (DBInfoModel db in dbList)
                {
                    nodeDB.Nodes.Add(db.DBInfoID.ToString(), db.DBName);
                }
            };

            //填充左侧树节点
            if (this.tvMain.InvokeRequired)
            {
                this.tvMain.BeginInvoke(setControl, this.DBList);
            }
            else
            {
                setControl(this.DBList);
            }
        }


这样就需要在另外定义个委托(使用泛型委托代替)和一个执行函数(使用匿名方法代替)了,代码是不是简练了很多。

你可能感兴趣的:(.net,null,action,微软)