首页 / 知识
关于c#:更改结构列表中元素的值
2023-04-14 16:12:00

Changing the value of an element in a list of structs我有一个结构列表,我想更改一个元素。例如:
现在我要更改一个元素:
但是,每当我尝试执行此操作时,都会出现以下错误:
如果我使用类列表,则不会发生此问题。 我想答案与结构是值类型有关。 因此,如果我有一个结构列表,我应该将它们视为只读吗?如果我需要更改列表中的元素,那么应该使用类而不是结构? 不完全是。将类型设计为类或结构不应由将其存储在集合中的需求驱动:)您应该查看所需的"语义" 您看到的问题是由于值类型语义所致。每个值类型变量/引用都是一个新实例。当你说
发生的事情是创建了该结构的新实例,并且所有成员都被一个一个地复制。这样您就可以克隆MyList [1],即2个实例。
现在在这里和我一起忍受2分钟(这需要花一会儿时间才能吞下..对我有用:) 以下代码段说明了我在上面刚刚说过的内容
HTH。好问题。
C#中的结构几乎应始终设计成不可变的(也就是说,一旦创建,便无法更改其内部状态)。 在您的情况下,您要做的是替换指定数组索引中的整个结构,而不是尝试仅更改单个属性或字段。 结构"不可变"不是很多。 真正的潜在问题是结构是值类型,而不是引用类型。因此,当您从列表中拉出对该结构的"引用"时,它将创建整个结构的新副本。因此,您对此所做的任何更改都将更改副本,而不是列表中的原始版本。 就像安德鲁指出的那样,您必须替换整个结构。尽管如此,我认为您必须问自己,为什么首先要使用结构(而不??是类)。确保您没有围绕过早的优化问题进行操作。 具有公开字段或允许通过属性设置器进行突变的结构没有问题。但是,响应于方法或属性获取器而发生变异的结构很危险,因为系统允许在临时结构实例上调用方法或属性获取器。如果方法或获取方法更改了结构,则这些更改最终将被丢弃。 不幸的是,正如您所注意到的,.net内置的集合在暴露其中包含的值类型对象方面确实微不足道。最好的选择通常是执行以下操作:
有点令人讨厌,而且根本不是线程安全的。仍然是对类类型的列表的一种改进,在这种情况下,可能需要执行以下操作:
,但可能还需要:
或者也许
或其他一些变化。除非一个人检查了myClass以及将这些东西放到列表中的其他代码,否则一个人实际上是不会知道的。如果不检查无法访问的程序集中的代码,则很可能无法知道第一种形式是否安全。相比之下,如果Name是MyStruct的公开字段,那么我给出的用于更新它的方法将起作用,而不管MyStruct包含的内容是什么,也不管代码执行前myList可能执行的其他操作或期望的代码是什么之后再做。 除了其他答案,我认为解释编译器抱怨的原因可能会有所帮助。 当您调用 每当一个方法返回一个结构的实例时,您都将获得该结构的副本(除非您使用ref / out)。 因此,您将获得一个副本,并在副本上设置 本教程更详细地描述了正在发生的事情(包括生成的CIL代码)。 |
最新内容
相关内容
linux目录结构树命令?
linux目录结构树命令?,系统,工作,信息,数据,设备,管理,目录,发展,时间,结构,Linux系统常用操作命令有哪些1、linux常用命令: pwd命令 该命令linux磁盘列表命令?
linux磁盘列表命令?,情况,管理,系统,单位,信息,数据,命令,磁盘,服务,时间,linux的进入磁盘命令1、查看磁盘空间 -df df命令以磁盘分区为单位查linux命令更改时区?
linux命令更改时区?,时间,系统,标准,大陆,国家,命令,时区,终端,之后,指令,linux更改时区和时间的命令目录方法1:使用命令行打开终端应用程序。linux查询表结构命令?
linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,linux下怎么用tree命令以树形结构显示文件目录结构1、以Ubuntu为linux命令筛选列表?
linux命令筛选列表?,工具,状态,位置,工作,预期,命令,名称,标准,数据,系统,在Linux下面的某一个文件的查找命令linux命令如果记不得,可以使用manlinux命令更改为中文?
linux命令更改为中文?,系统,单位,地方,软件,管理,标准,工具,信息,设备,中文,mv什么意思呢?1、MV的意思具体如下:mV是一个较小的电压单位,可以用linux命令更改域名?
linux命令更改域名?,地址,网站,系统,名称,服务,软件,环境,网址,信息,实时,Linux下ssh主机设置服务器域名解析问题需要在外围设备上做服务器的linux的长列表命令?
linux的长列表命令?,工作,系统,信息,命令,数据,目录,电脑,软件,时间,设备,Linux命令行大全的目录1、linux系统常用操作命令linux系统常用操作linux命令更改端口号?
linux命令更改端口号?,服务,系统,邮箱,通用,软件,第三,位置,端口,文件,编辑,怎么在linux里面修改端口号1、修改Linux远程端口的方法如下:首先,远linux更改帐号命令?
linux更改帐号命令?,密码,系统,用户,命令,第三,信息,代码,电脑,地址,终端,linux切换用户命令打开系统中的终端命令框。使用whoami命令查看当前linux更改用户名命令?
linux更改用户名命令?,系统,密码,用户,网上,代码,命令,用户名,主机名,终端,账户,linux下命令怎么修改用户名1、linux怎么修改文件所属用户?我们linux命令行更改ip?
linux命令行更改ip?,地址,系统,代码,密码,信息,网络,命令,终端,方法,下一步,linux如何修改ip1、修改IP地址:要修改IP地址,您可以使用以下命令之