首页 / 知识
关于c#:结构实现接口安全吗?
2023-04-15 09:47:00

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 几乎没有理由使用值类型实现接口。由于您不能继承值类型,因此您始终可以将其称为具体类型。 当然,除非您有多个结构都实现相同的接口,否则它可能会稍微有用,但是在那一点上,我建议您使用一个类并正确地进行操作。 当然,通过实现一个接口,您可以将结构装箱,因此它现在位于堆上,您将无法再通过值传递它...这确实加强了我的意见,即您应该只使用一个类在这种情况下。
实现接口的结构没有任何后果。例如,内置系统结构实现诸如 结构就像存在于堆栈中的类一样。我认为没有理由为什么它们应该是"不安全的"。 |
最新内容
相关内容
linux文件结构命令?
linux文件结构命令?,系统,数字,技术,设备,传播,第一,管理,数据,发展,目录,Linux目录结构也就是说,Linux下只有一个单独的树状结构。而在微软操linux目录结构树命令?
linux目录结构树命令?,系统,工作,信息,数据,设备,管理,目录,发展,时间,结构,Linux系统常用操作命令有哪些1、linux常用命令: pwd命令 该命令linux查看接口命令?
linux查看接口命令?,地址,系统,标准,命令,管理,工作,文件,端口,目录,路径,linux命令?1、linux常用命令如下:查看内核版本:uname-a。控制台-》图linux查询表结构命令?
linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,linux下怎么用tree命令以树形结构显示文件目录结构1、以Ubuntu为使用linux命令调接口?
使用linux命令调接口?,网络,系统,地址,信息,工具,情况,服务,灵活,电脑,名称,简述grub启动引导程序配置及命令行接口详解grub 命令行接口(一次性linux命令添加接口?
linux命令添加接口?,地址,网络,名称,系统,工具,设备,信息,服务,中心,密码,Linux用shell创建子接口称为子shell shell中创建的变量局部于创建它linux下找不到命令?
linux下找不到命令?,系统,名字,命令,第一,服务,电脑,标准,软件,文件,终端,虚拟机linux用命令virt-manager未找到命令怎么1、按ALT+CTRL+F1切换linux找不到命令ll?
linux找不到命令ll?,系统,软件,发行,标准,命令,第一,手机,别名,文件,终端,linux中为什么普通用户找不到ls命令ls命令基本每个linux shell都会linux接口模式命令?
linux接口模式命令?,设备,系统,信息,网络,工具,端口,服务,数字,地址,情况,Linux系统中列出PCI设备和USB设备的命令详解1、lspci lspci是另一个linux找不到is命令?
linux找不到is命令?,网络,手机,命令,系统,地方,信息,文件,文件夹,目录,管理员,Linux下Is命令不可用is。在linux中以下命令中is不可以查看文本linux找不到su命令?
linux找不到su命令?,系统,数字,环境,命令,密码,软件,情况,地址,不了,用户,Linux系统中su命令无反应怎么办1、确认当前是否已经打开了其他程序linux下命令访问接口?
linux下命令访问接口?,网络,信息,状态,系统,地址,服务,工具,基础,管理,设备,linux下用什么命令可以查看网络接口的信息1、ifconfig命令用来配