如果我搜索过,我肯定会得到一个显示什么是委托和行动的例子.我已经阅读了基本书籍,给出了代表的例子.
但我想知道的是它们在现实世界中的应用.请不要给Hello World示例或动物类它们太基本了
例如:
got*_*pie 27
Action 是一个Delegate.它的定义如下:
public delegate void Action();
Run Code Online (Sandbox Code Playgroud)
您可以创建自己的委托类型,类似于创建抽象方法的方式; 你写签名但没有实现.然后,您可以通过引用方法来创建这些委托的实例.
class Program
{
public static void FooMethod()
{
Console.WriteLine("Called foo");
}
static void Main()
{
Action foo = FooMethod; // foo now references FooMethod()
foo(); // outputs "Called foo"
}
}
Run Code Online (Sandbox Code Playgroud)
Ken*_*Ito 19
定义委托时,实质上是定义方法的签名(返回类型和参数).
Action是一个已经定义的委托(void return和no args).
public delegate void Action()
Run Code Online (Sandbox Code Playgroud)
你可以去定义并亲自看看.或者在文档中. http://msdn.microsoft.com/en-us/library/system.action.aspx
当我正在寻找的方法的签名与支持的签名匹配时,我几乎总是使用现有的通用委托(其中一个操作是一个).使用泛型代理的一个好处是它们是众所周知的.大多数开发人员都知道动作无效/无效.如果我要定义自己的Action版本,每个人都需要查找它的签名,我只是复制了已经存在的东西.
例如......由于void/void方法的目的只能用于变异,因此动作恰好有点罕见.Func很常见(也是通用委托).在整个框架中都有它的用法示例,特别是在linq中.比如看看.的地方.http://msdn.microsoft.com/en-us/library/bb534803.aspx.它是一个Func意味着它将您正在处理的集合类型的元素作为参数并返回一个bool.在具有Func返回true的where语句的上下文中,意味着将其包含在结果中,反之亦然.
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource,?bool> predicate
)
Run Code Online (Sandbox Code Playgroud)
由于Kenneth&Siege已经指出代码和MSDN,我将尝试填写现实世界的例子.
考虑一个定义"移动"的委托.
现实世界中的"行动"代表将是"跑"或"行走".您不关心您移动的速度,您采取的路线或报告移动所需的时间.
例如,非Action代理可以定义您运行的速度并返回完成它所花费的时间.
public delegate void MoveAction();
public delegate int MoveDelegate(int speed);
Run Code Online (Sandbox Code Playgroud)
扩展围攻的例子..
class Program
{
public static void Run()
{
Console.WriteLine("Running");
}
public static int RunAtSpeed(int speed)
{
// logic to run @ speed and return time
Console.WriteLine("Running @ {0}", speed);
return 10;
}
public static int WalkAtSpeed(int speed)
{
// logic to walk @ speed and return time
Console.WriteLine("Walking @ {0}", speed);
return 20;
}
static void Main()
{
Action foo = Run;
foo();
MoveDelegate run = RunAtSpeed;
int result1 = run(5);
MoveDelegate walk = WalkAtSpeed;
int result2 = walk(1);
}
}
Run Code Online (Sandbox Code Playgroud)
“Console.WriteLine”用户之前的回答中已经提供了反复请求的现实世界示例代码。
至于为什么提供它,根据我的理解,Action 是一种节省您自己定义新委托的方法。由于它是特定签名类型的预定义委托,因此您可以省去为每个预期目的创建不同委托的麻烦。您只需使用预定义的操作委托来指向您的方法并运行它们。Func 代表的情况也是如此。
实际上更多的是便利,而不是实际的新功能。帮助您的代码简短易懂,减少麻烦。
至于你的逐点问题,
没有不同。Action是一个预定义的委托,旨在省去您重复定义新委托的麻烦。
通常,委托(和操作)用于需要具有表驱动功能的地方。即,可能是对应于某些特定要求的方法字典。请注意,此处使用 Action 可以轻松更改调用的最终方法,以动态指向其他一些方法(可能基于用户选择的某些设置?)
class Program
{
static void Main()
{
Dictionary<string, Action> dict = new Dictionary<string, Action>();
dict["loadFile"] = new Action(LoadFile);
dict["saveFile"] = new Action(SaveFile);
dict["loadFile"].Invoke();
dict["saveFile"].Invoke();
}
static void SaveFile()
{
Console.WriteLine("File saved!");
}
static void LoadFile()
{
Console.WriteLine("Loading File...");
}
}
Run Code Online (Sandbox Code Playgroud)
另一个典型用法是回调方法。例如,您使用 BubbleSort 类,将比较器方法作为委托传递给该类,BubbleSort 类将使用该方法来允许您的代码定义比较逻辑,同时处理其他所有事情。这也可以在您启动的线程中使用,并且当需要将某些中间操作通知给您的代码时,线程会调用委托。
您可以参考这篇文章来查看上面的一个很好的例子。 /sf/answers/265596061/
我能想到在情况需要时不使用它们的唯一原因是,如果您的代表将在短时间内被调用数百万次。涉及到轻微的开销,如果这导致应用程序滞后,那么您可能必须找到一种更好的方法来解决这个问题,使用直接引用您的函数,而不是通过委托。
当您无缘无故地使用它们时,没有任何真正的需要。否则,在大多数情况下,它们可以是解决上述场景的优雅方法。
另外,请阅读此答案以了解普通方法和委托之间的区别,以更好地了解在何处使用 delegates/action/func /sf/answers/1216640631/
什么是Action: 很简单,Action、Func<>、Predicate 都是委托类型。
为什么我们需要Action: Action 封装了不同数量的参数和不同类型的返回类型,在很多情况下足以满足应用程序开发。这些在 System 命名空间中提供。您可以自由创建自己的委托。
请注意,有 17 种不同类型的 Action 和 Func,每种类型都有 0 到 16 个参数化的通用参数。
动作总是没有返回值。Func 有一个参数化的泛型返回类型。
恕我直言,谓词委托不需要定义为它真正等同于接受 arg 并返回 bool 的 Func。