4

我想重用一个现有class的第三方库,但它没有实现一些必需的接口。我正在考虑将它包装在 astruct中以实现所需的接口(基本上就像 Scala 的做法一样)。我更喜欢这个structclass例的原因是因为它只存储一件事:被包装的对象,而且它可能不会导致性能损失?但是我不确定如果我将 a 传递struct给某个采用接口的方法是否会发生装箱?这种方法还有其他缺点吗?

4

3 回答 3

7

Microsoft 给出了非常明确和直接的理由,您应该使用 astruct而不是 a class

√ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。

X 避免定义结构,除非该类型具有以下所有特征:

  • 它在逻辑上表示单个值,类似于原始类型(int、double 等)。
  • 它的实例大小小于 16 个字节。
  • 它是不可变的。
  • 它不必经常装箱。

https://msdn.microsoft.com/en-us/library/ms229017.aspx

似乎这不是你的情况。顺便说一句,是的,如果您将 a 传递struct给采用interface. 还要考虑到结构不支持继承,它们不能有明确的无参数构造函数。

于 2013-09-27T06:17:25.840 回答
0

是的,在这种情况下,如果您不想同时实现两个接口(现有的 + 要添加的额外内容),您可以在这种情况下使用 struct。包装不会有任何开销,因为 struct 将只存储引用而不是整个对象。因为对象将始终通过引用访问,即存储在堆上。所以不会有任何性能惩罚。但是不推荐的做法
但是,如果您有可以同时使用两种接口实现的情况,您应该定义一个新的派生类,该类将有一个变量来存储基类的对象。这样,您可以使用派生类的对象并将指向基类对象的变量保持为空。
参考http://adarshdchaurasia.wordpress.com/2013/08/12/decorator-design-pattern/了解实施的细节。
另请参阅你可以在结构中有一个类吗?

于 2013-09-27T06:10:17.857 回答
0

更简单的是直接在您的代码中继承 3rd-party 类,然后在此派生类上实现您想要的接口。没有拳击;只有引用会被传递。

于 2013-09-27T06:15:33.493 回答