c# - 在 C# 中,我应该使用 struct 来包装一个对象以实现额外的接口(interface)吗?

标签 c# .net oop design-patterns struct

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

最佳答案

对于应该使用 struct 而不是 class 的问题,Microsoft 给出了非常明确和直接的理由:

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

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

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

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

而且您的情况似乎并非如此。顺便说一句,是的,如果您将 struct 传递给采用 interface 的方法,则会发生装箱。还要考虑到结构不支持继承并且它们不能具有显式无参数构造函数。

关于c# - 在 C# 中,我应该使用 struct 来包装一个对象以实现额外的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043682/

相关文章:

c# - 有什么办法可以摆脱我的 .cs 文件顶部的一长串用途吗?

c# - 如何使用 Simple Injector 注册 Drum.UriMaker<>?

c# - 仅出于内部函数中异常报告的目的包含参数

c# - Azure函数 "Unable to find assembly"

.net - 如何使用控制台输出在 Linux 上运行 .NET 应用程序?

游戏组件的 Javascript 类结构

unit-testing - 在使用模拟对象时,如何防止我的单元测试需要有关实现内部的知识?

Ruby 继承 - super 初始化得到错误数量的参数

c# - 是否有可以将方法反编译为表达式树并支持 CLR 4.0 的库?

c# - 使用Uri处理.wav文件