C#(或其他语言)中代理人的使用

Oma*_*bid 7 .net c# delegates

我一直想知道代表们如何有用,我们为什么要使用它们?除了类型安全和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 ... {}".您是否还有其他示例来证明代表的有用性.

谢谢!

Rei*_*ica 5

代理是将功能注入方法的好方法.因此,它们极大地帮助了代码重用.

考虑一下,假设你有一组相关的方法具有几乎相同的功能,但只是几行代码.您可以将这些方法共有的所有内容重构为一个方法,然后您可以通过委托注入专用功能.

以LINQ使用的所有IEnumerable扩展方法为例.所有这些都定义了常用功能,但需要传递给它们的委托来定义如何投影返回数据,或者如何过滤,排序等数据......


scw*_*ner 5

在C#中我能想到的最常见的代表日常使用是事件处理.如果在WinForm上有一个按钮,并且想要在单击按钮时执行某些操作,那么您所做的就是在按下按钮时最终注册一个委托函数.

所有这些都是在Visual Studio自身生成的代码中自动发生的,因此您可能看不到它发生的位置.

对您来说可能更有用的真实案例是,如果您想创建一个人们可以使用的库,它将从Internet Feed中读取数据,并在更新Feed时通知他们.通过使用委托,使用您的库的程序员可以在更新订阅源时调用自己的代码.


Rob*_*nik 5

Lambda 表达式
委托主要与事件结合使用。但动态语言显示出其更广泛的用途。这就是为什么直到 C# 3.0 有了Lambda 表达式之后委托才得到充分利用。使用 Lambda 表达式(生成委托方法)可以很容易地执行某些操作

现在假设您有一个 IEnumerable 字符串。您可以轻松定义委托(使用 Lambda 表达式或任何其他方式)并将其应用于每个元素上运行(例如修剪多余的空格)。并且在不使用循环语句的情况下执行此操作。当然,您的代表可能会执行更复杂的任务。