考虑以下场景:
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
”。但似乎我们仍然可以制作Wrapper
一个结构体:复制它的值和复制一个引用是一样的Wrappee
,而且复制后的引用将指向同一个对象!开销较低,并且标量替换可能能够将局部变量的开销减少到零。似乎可以在_wrappee
.
我错过了什么吗?是否有充分的理由改为Wrapper
上课?
如果调用者不是通用的,则有一个:
int Caller(IInterface t) {...}
在这种情况下Wrapper
应该是一个类来避免拳击。
对了解 Haskell 的人的备注:我正在尝试找到与 .NET 最接近的 .NET 类似物newtype
。
更新:请参阅MSDN 论坛上的Professional .NET 2.0 Generics和Peter Ritchie,了解第一种情况下没有拳击。