首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候会在C#中使用委托?

什么时候会在C#中使用委托?
EN

Stack Overflow用户
提问于 2008-10-10 13:02:06
回答 13查看 41.5K关注 0票数 102

你在C#中委托的用法是什么?

EN

回答 13

Stack Overflow用户

发布于 2009-07-31 19:00:18

委派在很多方面都非常有用。

一个这样的目的是使用它们来过滤数据序列。在本例中,您将使用谓词委托,它接受一个参数,并根据委托本身的实现返回true或false。

这里有一个愚蠢的例子-我相信你可以从中推断出一些更有用的东西:

代码语言:javascript
复制
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String>
        {
            "Nicole Hare",
            "Michael Hare",
            "Joe Hare",
            "Sammy Hare",
            "George Washington",
        };

        // Here I am passing "inMyFamily" to the "Where" extension method
        // on my List<String>.  The C# compiler automatically creates 
        // a delegate instance for me.
        IEnumerable<String> myFamily = names.Where(inMyFamily);

        foreach (String name in myFamily)
            Console.WriteLine(name);
    }

    static Boolean inMyFamily(String name)
    {
        return name.EndsWith("Hare");
    }
}
票数 29
EN

Stack Overflow用户

发布于 2009-07-31 19:04:56

委托通常可以用来代替具有一个方法的接口,一个常见的例子就是观察者模式。在其他语言中,如果您希望接收到发生了某些事情的通知,您可以定义如下内容:

代码语言:javascript
复制
class IObserver{ void Notify(...); }

在C#中,这通常使用事件来表示,其中处理程序是一个委托,例如:

代码语言:javascript
复制
myObject.SomeEvent += delegate{ Console.WriteLine("..."); };

另一个使用委托的好地方是当你必须将一个谓词传递给一个函数时,例如当你从列表中选择一组项目时:

代码语言:javascript
复制
myList.Where(i => i > 10);

上面是lambda语法的一个例子,也可以这样写:

代码语言:javascript
复制
myList.Where(delegate(int i){ return i > 10; });

使用委托的另一个有用的地方是注册工厂函数,例如:

代码语言:javascript
复制
myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);

我希望这能帮到你!

票数 13
EN

Stack Overflow用户

发布于 2012-10-06 06:01:00

我对此了解得很晚,但我在弄清楚今天委托的目的时遇到了麻烦,我写了两个简单的程序,它们给出了相同的输出,我认为这很好地解释了它们的目的。

NoDelegates.cs

代码语言:javascript
复制
using System;

public class Test {
    public const int MAX_VALUE = 255;
    public const int MIN_VALUE = 10;

    public static void checkInt(int a) {
        Console.Write("checkInt result of {0}: ", a);
        if (a < MAX_VALUE && a > MIN_VALUE)
            Console.WriteLine("max and min value is valid");
        else
            Console.WriteLine("max and min value is not valid");
    }

    public static void checkMax(int a) {
        Console.Write("checkMax result of {0}: ", a);
        if (a < MAX_VALUE)
            Console.WriteLine("max value is valid");
        else
            Console.WriteLine("max value is not valid");
    }

    public static void checkMin(int a) {
        Console.Write("checkMin result of {0}: ", a);
        if (a > MIN_VALUE)
            Console.WriteLine("min value is valid");
        else
            Console.WriteLine("min value is not valid");
        Console.WriteLine("");
    }
}

public class Driver {
    public static void Main(string [] args) {
        Test.checkInt(1);
        Test.checkMax(1);
        Test.checkMin(1);

        Test.checkInt(10);
        Test.checkMax(10);
        Test.checkMin(10);

        Test.checkInt(20);
        Test.checkMax(20);
        Test.checkMin(20);

        Test.checkInt(30);
        Test.checkMax(30);
        Test.checkMin(30);

        Test.checkInt(254);
        Test.checkMax(254);
        Test.checkMin(254);

        Test.checkInt(255);
        Test.checkMax(255);
        Test.checkMin(255);

        Test.checkInt(256);
        Test.checkMax(256);
        Test.checkMin(256);
    }
}

Delegates.cs

代码语言:javascript
复制
using System;

public delegate void Valid(int a);

public class Test {
    public const int MAX_VALUE = 255;
    public const int MIN_VALUE = 10;

    public static void checkInt(int a) {
        Console.Write("checkInt result of {0}: ", a);
        if (a < MAX_VALUE && a > MIN_VALUE)
            Console.WriteLine("max and min value is valid");
        else
            Console.WriteLine("max and min value is not valid");
    }

    public static void checkMax(int a) {
        Console.Write("checkMax result of {0}: ", a);
        if (a < MAX_VALUE)
            Console.WriteLine("max value is valid");
        else
            Console.WriteLine("max value is not valid");
    }

    public static void checkMin(int a) {
        Console.Write("checkMin result of {0}: ", a);
        if (a > MIN_VALUE)
            Console.WriteLine("min value is valid");
        else
            Console.WriteLine("min value is not valid");
        Console.WriteLine("");
    }
}

public class Driver {
    public static void Main(string [] args) {
        Valid v1 = new Valid(Test.checkInt);
        v1 += new Valid(Test.checkMax);
        v1 += new Valid(Test.checkMin);
        v1(1);
        v1(10);
        v1(20);
        v1(30);
        v1(254);
        v1(255);
        v1(256);
    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/191153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档