考虑以下情形:.NET中的包装类型:struct或class?
int Caller1<T>(T t) where T : IInterface {...}
T Caller2<T>() where T : IInterface {...}
class Wrappee // doesn't implement IInterface, but could
??? Wrapper : IInterface {
private readonly Wrappee _wrappee;
// methods call _wrappee's methods
}
现在,一般建议为struct
和class
之间选择的是“使用struct
如果您需要参考的语义值语义和class
”。我们需要的语义是“参考Wrappee
”。但是看起来我们仍然可以制作一个结构体:拷贝它的值是一样的,就像拷贝一个Wrappee
的引用一样,并且这个拷贝将会有一个引用的相同的对象!开销较低,并且scalar replacement可能能够将局部变量降至零。在_wrappee
上调用甚至是变异方法似乎都是正确的。
我错过了什么?是否有充分的理由让Wrapper
成为一堂课?
有一个,如果来电者是不是通用的:
int Caller(IInterface t) {...}
在这种情况下Wrapper
应该是一个类来避免装箱。
有关Haskell知道的人的备注:我正在尝试找到与newtype
最接近的.NET模拟器。
更新:见Professional .NET 2.0 Generics和Peter Ritchie on MSDN forums在第一种情况下没有拳击。
为什么你认为使用结构作为泛型类型参数会影响拳击的需求? – 2009-07-31 18:13:36
查看更新。 – 2009-07-31 18:49:49