关于c#:结构实现接口安全吗?
Is it safe for structs to implement interfaces?我似乎还记得读过一些有关结构如何通过C#在CLR中实现接口的弊端,但是我似乎找不到任何东西。 不好吗 这样做会带来意想不到的后果吗?
由于没有其他人明确提供此答案,因此我将添加以下内容: 好。 在结构上实现接口不会产生任何负面影响。 好。 用于保存结构的接口类型的任何变量都将导致使用该结构的框式值。如果该结构是不可变的(一件好事),那么这将是最糟糕的性能问题,除非您是: 好。 好。 这两种情况均不太可能,相反,您可能正在执行以下一项操作: 好。 泛型 结构实现接口的许多合理原因也许是,以便可以在具有约束的通用上下文中使用它们。以这种方式使用变量时,如下所示: 好。
好。 那么this.a不是接口引用,因此不会导致放置任何内容的盒子。此外,当c#编译器编译通用类并需要插入在Type参数T的实例上定义的实例方法的调用时,它可以使用受约束的操作码: 好。
这避免了装箱,并且由于值类型正在实现,接口必须实现该方法,因此不会发生装箱。在上面的示例中, 好。 低摩擦API
大多数结构应具有类似原始的语义,其中按位相同的值被视为等于2。运行时将在隐式 好。 BCL中的所有原语至少要实现: 好。 好。
许多还实现了 好。 排除项目
显然,如果接口强烈暗示可变性(例如 好。
许多接口并不暗示可变性(例如 好。 摘要 在不可变的值类型上明智地完成后,实现有用的接口是一个好主意 好。 笔记: 1:请注意,当对已知具有特定结构类型但需要调用虚拟方法的变量调用虚拟方法时,编译器可能会使用此方法。例如: 好。
List返回的枚举数是一个结构,是一种优化方法,可以避免在枚举列表时进行分配(具有一些有趣的结果)。但是,foreach的语义指定如果枚举器实现 好。
因此,IDisposable的实现不会引起任何性能问题,并且如果Dispose方法实际上可以执行任何操作,则枚举器的(可遗憾的)可变方面将得以保留! 好。 2:double和float是该规则的例外,其中NaN值不相等。 好。 好。 这个问题有几件事发生... 结构可以实现接口,但是转换,可变性和性能会引起关注。请参阅此帖子以获取更多详细信息:http://blogs.msdn.com/abhinaba/archive/2005/10/05/477238.aspx 通常,结构应用于具有值类型语义的对象。通过在结构上实现接口,您可能会在结构与接口之间来回转换时遇到拳击问题。装箱的结果是,更改结构内部状态的操作可能无法正常运行。
在某些情况下,结构体可以实现一个接口(如果它从来没有用过,那么.net的创建者是否会为此提供接口是令人怀疑的)。如果一个结构体实现了
例如,如果一个人有方法
实现接口的结构的最大问题是,存储在接口类型 例如,考虑以下代码:
带标记的语句#1将对
有人试图假装值类型和引用类型都是
顺便说一句,还有更多注意事项:(1)通常,可变类类型应使用其
(没什么要补充的,但是还没有编辑能力,所以这里是。。) 但是,获取对结构的接口引用会将其装箱。因此,性能损失等等。 我现在可以想到的唯一有效方案已在此处发布。当您想要修改存储在集合中的结构状态时,必须通过结构上公开的其他接口来完成。 结构被实现为值类型,而类是引用类型。如果您具有类型为Foo的变量,并且在其中存储了Fubar的实例,它将把它"装箱"为引用类型,这样就失去了首先使用结构的优势。 我看到使用结构而不是类的唯一原因是因为它将是值类型而不是引用类型,但是结构不能从类继承。如果您的结构继承了一个接口,并且传递了接口,那么您将失去该结构的值类型性质。如果需要接口,也可以将其设为类。 我认为问题在于它会导致装箱,因为结构是值类型,因此会有轻微的性能损失。 此链接表明可能还有其他问题... http://blogs.msdn.com/abhinaba/archive/2005/10/05/477238.aspx 几乎没有理由使用值类型实现接口。由于您不能继承值类型,因此您始终可以将其称为具体类型。 当然,除非您有多个结构都实现相同的接口,否则它可能会稍微有用,但是在那一点上,我建议您使用一个类并正确地进行操作。 当然,通过实现一个接口,您可以将结构装箱,因此它现在位于堆上,您将无法再通过值传递它...这确实加强了我的意见,即您应该只使用一个类在这种情况下。
实现接口的结构没有任何后果。例如,内置系统结构实现诸如 结构就像存在于堆栈中的类一样。我认为没有理由为什么它们应该是"不安全的"。 |
相关内容
-
3500元超额值学生娱乐结构的优化配置
3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户...
-
电脑蓝牙软件|电脑蓝牙软件找不到
电脑蓝牙软件|电脑蓝牙软件找不到,,电脑蓝牙软件找不到控制面...
-
公共CPU接口类型的详细描述
公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的...
-
萤石0x2002|萤石云找不到原主人怎么解绑
萤石0x2002|萤石云找不到原主人怎么解绑,,1. 萤石0x2002基本参...
-
电脑显卡接口红色和黑色|显卡接口发黑
电脑显卡接口红色和黑色|显卡接口发黑,,显卡接口发黑试试吃块...
-
FM1和AM3接口将在今年年底前淘汰
FM1和AM3接口将在今年年底前淘汰,,据来自主板制造商的消息,AMD...
-
你用没有音响设备的电脑怎么办找不到音频设备
你用没有音响设备的电脑怎么办找不到音频设备,,你有没有遇到这...
-
电脑主板四个硬盘接口推荐|主板上的硬盘的接口
电脑主板四个硬盘接口推荐|主板上的硬盘的接口有哪几种,,主板...
-
Windows8开发版系统高清系统接口图
Windows8开发版系统高清系统接口图,,今天,微软发布,目前由开发者...
-
手机qq上传到我的电脑桌面|手机qq上传到我的电
手机qq上传到我的电脑桌面|手机qq上传到我的电脑桌面找不到,,...
-
开机找不到电脑系统设置|电脑开机后找不到系统
开机找不到电脑系统设置|电脑开机后找不到系统,,1. 电脑开机后...
-
小米电脑无网线口|小米笔记本没有网线接口怎么
小米电脑无网线口|小米笔记本没有网线接口怎么插网线,,小米笔...
-
Win10提示“找不到入口点dllregisterserver”怎
Win10提示“找不到入口点dllregisterserver”怎么解决,找不到...
-
「显卡上的接口」显卡上的接口有几种
「显卡上的接口」显卡上的接口有几种,显卡上的接口,本篇文章给...
-
电脑显示器联接方法图片|电脑连接显示器接口有
电脑显示器联接方法图片|电脑连接显示器接口有几种图,,1. 电脑...