c# - Noobie Delegate 基础 C#

标签 c# delegates

我想我不明白委托(delegate)方法的意义。我见过的所有例子都是这样做的:

class DelegateClass
{
    private List<string> ListString = new List<string>;
    delegate void DoSomethingToStringsDelegate(string s);

    public base()
    {
         ListString.Add("string"); ....
    }

    void ProcessStrings(DoSomethingToStringsDelegate dstsd)
    {
        foreach(string s in ListString)
            dstsd(s);
    }
}

class AClass
{
    ...
    void UseDelegateMethod(...)
    {
        DelegateClass ds = new DelegateClass();
        ds.ProcessStrings(new DoSomethingToStringsDelegate(PrintStrings);
    }
    void PrintStrings(string s)
    {
        System.out.Write(s);
    }
}

我不明白为什么需要这样做,因为您可以简单地实现一个 getListStrings() 并自己遍历字符串,做您需要做的事情,就好像它是一个委托(delegate)一样。

foreach( string s in ds.ggetListStrings() )
    System.out.Write(s);

私有(private)成员的理由没有意义,因为我可以这样做:

global List<Strings> myListStrings = new List<Strings>();
ds.ProcessStrings(new DoSomethingToStringsDelegate(GetStrings);

void GetStrings(string s)
{
    myListStrings.Add(s);
}

...现在我有了相同的列表,就像 getListStrings() 会做的...

有人可以解释一下吗?非常感谢!

最佳答案

delegate 很有用,因为它实际上充当任何将 string 作为参数并返回 void 的方法的占位符。

如果您熟悉 C,它类似于函数指针的工作方式。取而代之的是,您可以传递与签名和返回类型相匹配的任何方法。

例如,假设我想实现一个对一组对象进行排序的方法。除了对象列表之外,我还可以传递一个指示如何完成排序的委托(delegate)。由于可以传递与委托(delegate)匹配的任何方法,因此我可以在不同方法之间动态切换,例如减少或增加排序:

 delegate int comparisonDelegate(int p1, int p2);

 void SortArray(int[] array, comparisonDelegate cmp)
 {
      // determine order according to cmp
 }

 int CompareDecreasing(int p1, int p2)
 {
     if(p1 > p2) return -1;
     if(p1 < p2) return 1;
     return 0;
 }

 int CompareIncreasing(int p1, int p2)
 {
     if(p1 > p2) return 1;
     if(p1 < p2) return -1;
     return 0;
 }

现在我可以将 SortArray 调用为:

 SortArray(array, new comparisonDelegate(compareDecreasing));
 SortArray(array, new comparisonDelegate(compareIncreasing));

关于c# - Noobie Delegate 基础 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384376/

相关文章:

c# - 无法将 Global.asax 文件添加到 WCF 项目

c# - 作为方法调用参数的函数

c# - 带有来自委托(delegate)的参数的语句 lambda

kotlin - 如何结合 kotlin 委托(delegate)属性 : observable, vetoable 和 "by map"?

c# - 在 C# 中异步加载图像

c# - 如何以编程方式查找 Windows 上的事件安全提供程序?

c# - Membership provider用还是不用?

c#实现一个类来保存变量

c# - 70-536 考试中的多播委托(delegate)?

ios - 使用 Kiwi 检查模拟对象的方法参数