为什么委托是引用类型?

14 浏览
0 Comments

为什么委托是引用类型?

关于接受答案的快速说明:我不同意Jeffrey的答案的一小部分,即“Delegate”必须是引用类型,所以所有的委托都是引用类型。(并不是所有的委托都排除了值类型;例如,所有的枚举类型都继承自“System.Enum”,后者又继承自“System.ValueType”,再后者继承自“System.Object”,这些都是引用类型。)然而,我认为关键的认识是,所有的委托实际上不仅继承自“Delegate”,还继承自“MulticastDelegate”。正如Raymond在他的答案的评论中指出的那样,一旦你决定支持多个订阅者,那么在委托本身不使用引用类型的情况下是没有意义的,因为需要在某个地方使用数组。

底部的更新:对于Ani的评论,我明白为什么上面例子中的“CompilerGenerated”类型可能是引用类型,因为如果委托将包括函数指针和对象指针,它将需要引用类型(至少对于使用闭包的匿名函数来说,即使你引入了一个额外的泛型类型参数,比如“Action”,这也无法涵盖无法命名的类型!)。然而,所有这些只是让我有些后悔在讨论中引入了关于闭包的编译器生成类型的问题!我的主要问题是关于委托的,即具有函数指针和对象指针的东西。在我看来,它可以是一个值类型。

换句话说,即使这段代码...

Action foo = () => { obj.Foo(); };

...需要创建一个引用类型对象(用于支持闭包,并给委托提供引用的对象),为什么需要创建两个对象(支持闭包的对象加上“Action”委托)?

*是的,是的,我知道这是实现细节!我真正的意思是短期内存存储。

0