委托 Action Func

有人说委托和事件是.net的一个分水岭

关于委托和事件,我觉得这个朋友写的很不错

http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

基本已经把需要说的已经说完了,而且清晰易懂,很不错

总结一下,所谓需要用到的地方主要是在一个线程中调用另一个线程的代码段,或者一个页面去改变另外页面的内容,

事件是一个委托,更多用在第二种情况,一个页面改变另外一个页面的东西

主要是说一下Action 和Func

Action是包含了一个没有返回参数的方法,Func是封装了一个有返回值的方法,

    string str = string.Empty;
   Action<string> act = (a => str = a + "大灰狼");等价于

void Act(string a)

{

_str=a+"大灰狼";

}

 

Func<string, string, string, string> lich = delegate(string a, string b, string c) { return a + b + c; };

等价于

string Lich(string a,string b,string c)

{

return a+b+c;

}

Func的最后一个参数是返回值,

好了这只是最简单的例子,再深一些:


        private void TryDo(Delegate mothed, params object[] args)//params这个关键字是表名这个参数已经是最后一个参数了
        {
            mothed.DynamicInvoke(args);//动态调用后期绑定
        }

        private string DoThing(string str)
        {
            return "";
        }

        private void ImpDate()
        {
            TryDo(new Func<string, string>(DoThing), "123");
            Func<string, string> func = a => a + "123";
            TryDo(func, "123");
        }

想想一下,如果你需要导入n张表,如果做这么一个方法,会不会简单很多,最重要的是,你不觉得这么写很拉轰嘛

之所以把Action和 Func和委托事件放在一起,因为Action和Func会比声明一个delegate ...然后再用一个方法更简单

wpf 有一个 ICommand接口,这个接口必须要实现

  class FishCommand : ICommand
    {
        public delegate bool FishCanExecute(object param);
        private FishCanExecute _CanExecute;

        public delegate void FishExecute(object param);
        private FishExecute _Execute;

        public FishCommand(FishExecute execute,FishCanExecute canExecuteFunc)
        {
            _CanExecute = canExecuteFunc;
            _Execute = execute;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return _CanExecute == null ? true : _CanExecute(parameter);
        }

        public void Execute(object parameter)
        {
            if (_Execute != null)
            {
                _Execute(parameter);
            }
        }
    }

 

 class DelegateCommand : ICommand
    {
        private Func<object, bool> _canExecuteFunc;
        private Action<object> _executeAction;

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public DelegateCommand(Action<object> executeAction, Func<object, bool> canExecuteFunc)
        {
            _canExecuteFunc = canExecuteFunc;

      _executeAction = executeAction;
        }

        public bool CanExecute(object parameter)
        {
            return _canExecuteFunc == null ? true : _canExecuteFunc(parameter);
        }

        public void Execute(object parameter)
        {
            if (_executeAction != null)
                _executeAction(parameter);
        }
    }

那个更简洁一些呢?

不言而喻

 

 

 

 

posted @ 2012-05-16 16:58  爱喝可乐  阅读(930)  评论(0编辑  收藏  举报