代码之家  ›  专栏  ›  技术社区  ›  Aaron Anodide

类内委托的含义是什么?

  •  2
  • Aaron Anodide  · 技术社区  · 15 年前

    我把委托理解为用一个方法定义类的快捷方式,但下面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 回复  |  直到 13 年前
        1
  •  6
  •   Jon Skeet    15 年前

    它只是声明了一个嵌套类型,仅此而已。由于它是公共的,在类型内声明和在类型外声明几乎没有区别。

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

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

    当我编写一个嵌套类型时,它是私有的——它只是包含类的一个助手类;一个实现细节。当然,不一定是这样,但至少应该是这样的,嵌套类型是没有意义的,除非您在 一些 使用外部类的方式。例如,它可以是外部类的生成器,也可以是外部类中方法调用的某些参数中使用的枚举。

    Foo Bar . 例如,它使变量和类型之间的区别更加清晰。)

        2
  •  8
  •   Eric Lippert    15 年前

    公众的 类内的委托定义。

    例如,考虑我最喜欢的模式:一个抽象基类,它只能由工厂制造的私有嵌套类扩展:

    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(); }
    

        private delegate Leopard D(Giraffe g);
    

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

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

    因此,嵌套的委托类型现在基本上是为了完整性和向后兼容性而存在的;通常您不会使用它。

        3
  •  7
  •   JaredPar    15 年前

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

    将委托放入类型中的模式的一个原因是为了避免全局命名空间污染。代表 bar2 只能通过来自的限定引用访问 foo . 如果 酒吧2 是一个具有多个有效含义并将其放在其中的名称