http://www.cnblogs.com/liuzhendong/archive/2011/12/05/2277099.html
EventHandler 与常见的.Net预定义委托
看着下面这两句事件定义及激发忽然有点不明白了,
public event EventHandler<ExternalDataEventArgs> Submit;
Submit(null, args);
貌似该事件定义时只传一个参数args, 但实际激发时要传两个参数, 咋回事捏!
其实, 这是误解, 这个EventHandler<ExternalDataEventArgs>是个泛型版的预定义委托, 该委托实际的定义如下:
public delegate void EventHandler<TEventArgs> (
Object sender,
TEventArgs e
) where TEventArgs : EventArgs
而非泛型版的定义如下:
public delegate void EventHandler (
Object sender,
EventArgs e
)
这样就明白了, 事件确实是需要两个参数.
推荐资料: .NET Framework委托的预定义方法介绍
http://webservices.ctocio.com.cn/net/430/9352430.shtml
此文中这段甚对, "从.NET Framework2.0开始以来,系统预定义的委托使使代码看起来有点像“天书”,再加上匿名表达式,以及后面Lambda表达式的“掺和”,代码就更加难懂了."
因此,多梳理,多熟悉一下才行。
类似的预定义委托还有:
1.Action 封装1-16个参数, 无返回值.
public delegate void Action<in T>(
T obj
)
public delegate void Action<in T1, in T2>(
T1 arg1,
T2 arg2
)
2.Func 封装1-16个参数, 返回值TResult.
public delegate TResult Func<out TResult>(
)
public delegate TResult Func<in T, out TResult>(
T arg
)
3.Predicate 表示定义一组条件并确定指定对象是否符合这些条件的方法。
public delegate bool Predicate<in T>(
T obj
)
推荐资料:
EventHandler 泛型委托
http://msdn.microsoft.com/zh-cn/library/db0etb8x(v=VS.80).aspx
Action<T> 委托
http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx
Func<TResult> 委托
http://msdn.microsoft.com/zh-cn/library/bb534960.aspx
Predicate<T> 委托
http://msdn.microsoft.com/zh-cn/library/bfcke1bz(v=VS.100).aspx
--------------------------------------------------
http://www.cnblogs.com/stu-acer/archive/2009/03/06/1404477.html
.NET Framework中预定义的委托
前言:从.NET Framework2.0开始以来,系统预定义的委托使使代码看起来有点像“天书”,再加上匿名表达式,以及后面Lambda表达式的“掺和”,代码就更加难懂了,于是自己就一点点查MSDN,到现在终于有点入门了。
常用委托:
1、public delegate void Action<T>(T obj )
2、public delegate TResult Func<TResult>()
3、public delegate bool Predicate<T>(T obj)
其中:Action和Func还包括从不带任何参数到最多四个参数的重载?
1、public delegate void Action<T>(T obj )
封装一个方法,该方法只采用一个参数并且不返回值。
2、public delegate TResult Func<TResult>()
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
类型参数T
此委托封装的方法的参数类型。
TResult
此委托封装的方法的返回值类型
public static void Main()
{
// Instantiate delegate to reference UppercaseString method
ConvertMethod convertMeth = UppercaseString;
string name = "Dakota";
// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMeth(name));
}
private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}
3、public delegate bool Predicate<T>(T obj)
表示定义一组条件并确定指定对象是否符合这些条件的方法。
类型参数
T:要比较的对象的类型。
返回值
如果 obj 符合由此委托表示的方法中定义的条件,则为 true;否则为 false。
public static void Main()
{
// Create an array of five Point structures.
Point[] points = { new Point(100, 200),
new Point(150, 250), new Point(250, 375),
new Point(275, 395), new Point(295, 450) };
Point first = Array.Find(points, ProductGT10);
// Display the first structure found.
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
}
// This method implements the test condition for the Find
// method.
private static bool ProductGT10(Point p)
{
if (p.X * p.Y > 100000)
{
return true;
}
else
{
return false;
}
}
--------------------------------------------------
不过其中一些是 .net 4.0 里才有的,比如多个参数的 action
--------------------------------------------------
例子:
i++;
this.Invoke(new EventHandler(EndMessage), i);
//Action<int>
this.Invoke(new Action<int>(EndMessage2), i);//test action
}//for 1
//this.Invoke(new EventHandler(EndMessage), null);//new EventHandler(EndMessage) 是有可能被回收的,正规做法应当是用一个变量接收
//不能将 null 传过去,为什么?
this.Invoke(new EventHandler(EndMessage), 0);
}
catch (System.Exception ex)
{
}
finally
{
}
}//
public void EndMessage2(int pos)
{
}//
public void EndMessage(object sender, EventArgs e)
{
int i = (Int32)sender;
if (i == 0)
{
MessageBox.Show("完成同步: " + ls.Count);
}
else
{
if (ls != null && ls.Count > 0)
progressBar_update.Value = 100 * i / ls.Count;
}
}//