我正在学习WPF/MVVM,试图理解Action<T>
、Func<T>
和Predicate<T>
委托之间的区别。
我知道Action<T>
和Func<T>
都可以接受0到1个或多个参数,而Func<T>
返回一个值,而Action<T>
则不返回任何值。
至于Predicate<T>
——我一无所知。
因此,我提出了以下问题:
Predicate<T>
是什么?(欢迎提供示例!)- 如果
Action<T>
不返回任何值,那么只使用void
(或任何其他类型,如果我们谈论的是Func<T>
)是否更简单?
请避免在您的答案中使用LINQ/List示例。
我已经看过它们了,但它们只会使问题更加混淆,因为让我“感兴趣”的代码与它们没有任何关系(我想!)。
因此,我想使用我熟悉的代码来获得答案。
以下是代码:
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
[DebuggerStepThrough]
public bool CanExecute(object parameters)
{
return _canExecute == null ? true : _canExecute(parameters);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameters)
{
_execute(parameters);
}
}
注意:
我删除了注释以避免超长的代码块。
完整代码可在此处找到。
非常感谢您的帮助!谢谢! :)
附言:请不要把我指向其他问题。我确实尝试过搜索,但我找不到简单到我能理解的东西。
Predicate
必须返回一个布尔值。我会指引你到另一个问题:https://dev59.com/L3I-5IYBdhLWcg3wta_w - Rotem