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

Aar*_*ide 2 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();
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Eri*_*ert 8

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

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

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(); }
Run Code Online (Sandbox Code Playgroud)

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

    private delegate Leopard D(Giraffe g);
Run Code Online (Sandbox Code Playgroud)

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

现在你当然不会这样做.你会用,Func<Giraffe, Leopard>而且你已经完成了.

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


Jar*_*Par 7

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

将委托放在类型中的模式的一个原因是避免全局命名空间污染.代表bar2只能通过合格的参考资料访问foo.如果bar2这个名称具有多个有效的含义并将其置于foo必要的上下文中,则这可能很有价值.

  • 将委托类型视为具有一个方法的IM*接口*更合理,IMO ......然后是为异步操作调用该方法的额外方法.对我来说,得到了代表们的*感觉*.出于兴趣,是`BeginInvoke`保证但是`EndInvoke`不是吗? (2认同)

Jon*_*eet 6

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

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

public class OtherClass
{
    private void DoSomething()
    {
        foo.bar2 action = delegate { ... };
        foo f = new foo(action);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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