PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处:
研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合《C#与.NET4高级程序设计》、MSDN、借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚
关键字:
Func Action delegate三种
一般说的泛型就是Func和Action,是委托的简写
我将delegate这个正版的委托也加入是因为他也可以写成泛型
描述:
固定委托的参数个数,但参数的类型是动态可变
目的\优势:
省去了定义委托类型的步骤
Action与Fun区别:
Action无返回值,Action重载的参数个数有1-4个
Func有返回值。Func重载的参数个数有1-4个
Action示例:
namespace testAction
{
class Program
{
// public delegate void Action<T>(T arg);
//注释的这一行是Action的原型,这句可写可不写,即上面提到的目的...
//注释的这一行是Action的原型,由此可看出Action无返回值
static void Main(string[] args)
{
Action<int> action = PrintfMyAge;
action(4);
Action<string> action2 = PrintfMyName;
action2("PanPen120");
Console.ReadLine();
}
static void PrintfMyAge(int myAge)
{ Console.WriteLine("My Age is {0}",myAge); }
static void PrintfMyName(string myName)
{ Console.WriteLine("My Name is {0}",myName); }
}
}
Func示例:
//区别是委托注册的函数都是有返回值的
namespace testAction
{
class Program
{
static void Main(string[] args)
{
Func<int,int> action = PrintfMyAge;
action(4);
Func<string, int> action2 = PrintfMyName;
action2("PanPen120");
Console.ReadLine();
}
static int PrintfMyAge(int myAge)
{ Console.WriteLine("My Age is {0}", myAge); return 1; }
static int PrintfMyName(string myName)
{ Console.WriteLine("My Name is {0}", myName); return 1; }
}
}
delegate示例:
namespace GenericDelegate
{
public delegate void MyGenericDelegate<T>(T arg);
class Program
{
static void Main(string[] args)
{
MyGenericDelegate<string> strTarget = new MyGenericDelegate<string>(StringTarget);
StringTarget("Some string data");
MyGenericDelegate<int> intTarget = new MyGenericDelegate<int>(IntTarget);
intTarget(9);
Console.ReadLine();
}
static void StringTarget(string arg)
{
Console.WriteLine("arg in uppercase is : {0}", arg.ToUpper());
}
static void IntTarget(int arg)
{
Console.WriteLine("++arg is : {0}", ++arg);
}
}
}
备注:
如果用到泛型委托,就用Action或者Func,没必要有简单的不用还要用delegate这种方式