clq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 )
封装一个方法,该方法只采用一个参数并且不返回值。

Code


2、public delegate TResult Func<TResult>()
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
类型参数T
   此委托封装的方法的参数类型。
TResult
   此委托封装的方法的返回值类型

Code
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。

Code
 public static void Main()
    {
        
// Create an array of five Point structures.
        Point[] points = { new Point(100200), 
            
new Point(150250), new Point(250375), 
            
new Point(275395), new Point(295450) };

        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;
            }

            
        }//

posted on 2011-12-25 21:23  clq  阅读(1014)  评论(1编辑  收藏  举报