委托 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);
}
}
那个更简洁一些呢?
不言而喻