• 委托 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);
            }
        }

    那个更简洁一些呢?

    不言而喻

  • 相关阅读:
    数据库是什么以及用来干嘛
    10.3
    10.2
    12.7
    12.5
    12.4
    12.3
    12.2
    12.1JOptionPane
    11.30eclipse常用快捷键
  • 原文地址:https://www.cnblogs.com/fish124423/p/2504304.html
Copyright © 2020-2023  润新知