一个类中的委托是什么意思?

时间:2010-09-17 16:34:39

标签: c# delegates

我理解委托作为使用一种方法定义类的快捷方式,但下面的bar2是什么意思?它汇编。但我看不出内心阶级会做什么。我知道我错过了什么,这就是我要问的原因(这不是作业,我现在正在工作)。

namespace ns2 { public delegate void bar();}
public class foo
{
    private ns2.bar _callback;
    public foo(ns2.bar callback) { _callback = callback; }
    public void baz() { _callback(); }
    public delegate void bar2();
}

谢谢!

3 个答案:

答案 0 :(得分:8)

为了添加Jon和Jared的答案,我注意到你通常在一个类中定义委托的唯一时间是委托是该类的私有实现细节。在类中包含 public 委托定义是罕见而奇怪的。

例如,考虑我最喜欢的模式:一个抽象基类,只能通过使用工厂制造的私有嵌套类进行扩展:

public abstract class Animal
{
    private Animal() { } // prevents subclassing from outside!
    private sealed class Giraffe : Animal { }
    private sealed class Leopard : Animal { }
    public static Animal GetGiraffe( ) { return new Giraffe(); }
    public static Animal GetLeopard( ) { return new Leopard(); }

假设Animal的实现细节是你需要一个从长颈鹿到Leopard的代表:

    private delegate Leopard D(Giraffe g);

这不能是公共委托类,因为它引用私有类型!

现在你当然不会这样做。你使用Func<Giraffe, Leopard>就完成了。

因此,嵌套委托类型几乎就是为了完整性和向后兼容性;通常你不会使用它。

答案 1 :(得分:7)

委托不是使用一种方法定义类的快捷方式。实际上它们至少有6个方法(Invoke,BeginInvoke,EndInvoke,GetHashCode,Equals,ToString)。

将委托放在类型中的模式的一个原因是避免全局命名空间污染。代表bar2只能通过foo的合格参考进行访问。如果bar2是一个具有多个有效含义的名称并将其放在foo内提供必要的上下文,则此功能非常有用。

答案 2 :(得分:6)

它只是声明一个嵌套类型,就是这样。因为它是公开的,所以在类型中声明并在外部声明之间几乎没有区别。

其他类必须通过包含类型的名称引用它(除非它们专门针对它有using指令):

public class OtherClass
{
    private void DoSomething()
    {
        foo.bar2 action = delegate { ... };
        foo f = new foo(action);
        ...
    }
}

通常当我编写嵌套类型时,它是私有的 - 它只是包含类的辅助类;一个实现细节。当然,情况并非必须如此,但至少应该是嵌套类型没有意义,除非你使用外部类某种方式。例如,它可以是外部类的构建器,也可以是外部类中方法调用的某些参数中使用的枚举。

(顺便说一句,在编写这样的示例代码时,即使对于FooBar这样的元语法名称,它也很有用。它使变量和类型之间的区别更加清晰,例如。)