[英]What is the meaning of a delegate inside a class?
我理解委托是用一种方法定义一个类的快捷方式,但下面的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();
}
谢谢!
为了添加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(); }
假设Animal的实现细节是你需要一个从长颈鹿到Leopard的代表:
private delegate Leopard D(Giraffe g);
这不能是公共委托类,因为它引用了私有类型!
现在你当然不会这样做。 你会使用Func<Giraffe, Leopard>
而且你已经完成了。
因此,嵌套委托类型几乎就是为了完整性和向后兼容性; 通常你不会使用它。
委托不是使用一种方法定义类的快捷方式。 实际上它们至少有6个方法(Invoke,BeginInvoke,EndInvoke,GetHashCode,Equals,ToString)。
将委托放在类型中的模式的一个原因是避免全局命名空间污染。 代表bar2
只能通过foo
的限定引用访问。 如果bar2
是具有多个有效bar2
的名称并且将其置于foo
内提供必要的上下文,则这可能是有价值的。
它只是声明一个嵌套类型,就是这样。 因为它是公开的,所以在类型内声明和在外面声明之间几乎没有区别。
其他类必须通过包含类型的名称引用它(除非它们具有专门用于它的using
指令):
public class OtherClass
{
private void DoSomething()
{
foo.bar2 action = delegate { ... };
foo f = new foo(action);
...
}
}
通常当我编写嵌套类型时,它是私有的 - 它只是包含类的辅助类; 一个实现细节。 当然,情况并非必须如此,但至少应该是嵌套类型没有意义,除非你以某种方式使用外部类。 例如,它可以是外部类的构建器,也可以是外部类中方法调用的某些参数中使用的枚举。
(顺便说一句,在编写像这样的示例代码时,即使对于Foo
和Bar
这样的元语法名称,它也很有用。例如,它使变量和类型之间的区别更加清晰。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.