我一直想知道代表们如何有用,我们为什么要使用它们?除了类型安全和Visual Studio文档中的所有这些优点之外,代表的真实用途是什么.
我已经找到了一个,它非常有针对性.
using System;
namespace HelloNamespace {
class Greetings{
public static void DisplayEnglish() {
Console.WriteLine("Hello, world!");
}
public static void DisplayItalian() {
Console.WriteLine("Ciao, mondo!");
}
public static void DisplaySpanish() {
Console.WriteLine("Hola, imundo!");
}
}
delegate void delGreeting();
class HelloWorld {
static void Main(string [] args) {
int iChoice=int.Parse(args[0]);
delGreeting [] arrayofGreetings={
new delGreeting(Greetings.DisplayEnglish),
new delGreeting(Greetings.DisplayItalian),
new delGreeting(Greetings.DisplaySpanish)};
arrayofGreetings[iChoice-1]();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这并没有完全显示使用委托的优势,而不是一个条件"If ... {}"来解析参数并运行方法.
有谁知道为什么在这里使用委托更好,而不是"if ... {}".您是否还有其他示例来证明代表的有用性.
谢谢!
代理是将功能注入方法的好方法.因此,它们极大地帮助了代码重用.
考虑一下,假设你有一组相关的方法具有几乎相同的功能,但只是几行代码.您可以将这些方法共有的所有内容重构为一个方法,然后您可以通过委托注入专用功能.
以LINQ使用的所有IEnumerable扩展方法为例.所有这些都定义了常用功能,但需要传递给它们的委托来定义如何投影返回数据,或者如何过滤,排序等数据......
在C#中我能想到的最常见的代表日常使用是事件处理.如果在WinForm上有一个按钮,并且想要在单击按钮时执行某些操作,那么您所做的就是在按下按钮时最终注册一个委托函数.
所有这些都是在Visual Studio自身生成的代码中自动发生的,因此您可能看不到它发生的位置.
对您来说可能更有用的真实案例是,如果您想创建一个人们可以使用的库,它将从Internet Feed中读取数据,并在更新Feed时通知他们.通过使用委托,使用您的库的程序员可以在更新订阅源时调用自己的代码.
Lambda 表达式
委托主要与事件结合使用。但动态语言显示出其更广泛的用途。这就是为什么直到 C# 3.0 有了Lambda 表达式之后委托才得到充分利用。使用 Lambda 表达式(生成委托方法)可以很容易地执行某些操作
现在假设您有一个 IEnumerable 字符串。您可以轻松定义委托(使用 Lambda 表达式或任何其他方式)并将其应用于每个元素上运行(例如修剪多余的空格)。并且在不使用循环语句的情况下执行此操作。当然,您的代表可能会执行更复杂的任务。
| 归档时间: |
|
| 查看次数: |
3998 次 |
| 最近记录: |