[英]C# struct best practices, possible contradiction?
我知道C#结构上大约有1,000个问题。 我想进行迭代,以了解值语义,stackallocs的性能优势等。我的具体问题来自于这篇msdn文章,有关何时在类上使用结构。 MSDN结构与C#类
首先,他们谈到了容器(尤其是数组)的内联数据的好处。 一种分配,以及数组中所有结构的用户无法定义的默认初始化。 但是,他们也强调结构应该是不变的。
如果我声明一个mystuct[] s = new mystruct[16];
,我有16个mystruct
,其默认值是内联的。 如果我按照建议创建了没有外部可变性的“洁净”结构,那么该结构对我有什么用? 我怀疑我打算专门包含一个0积分和null的数组。
当仅用作记录或属性返回(即单一数据传输)时,它们是否意味着不可变?
如果之前已经解决了默认数组初始化与建议的不可变性之间的特定冲突,请标记为重复。 感谢您的见解。
两者之间没有实际的矛盾:
完成后var s = new mystruct[16];
,的确,您已经将mystruct
的16个实例和数组初始化为默认值。
但是,执行s[0] = new mystruct(<arguments list here>)
不会使数组第一个单元格的结构发生突变,而是将其替换为新的结构。
因此,自身的结构仍然是不可变的。
讨论的不变性是通过结构的方法,而不是结构本身的值。 一个结构体的实例总是可以通过赋值来进行突变-考虑一下for循环中的整数循环变量; 它在每次循环中都会更改。
但是,对于框架的System.Int32
结构(即int
)来说,使用DoubleIt
方法导致基础整数的值加倍而无需进行一些明显的赋值操作(如++i;
实际上是i=i+1;
)。
考虑一下string.Replace
和StringBuilder.Replace
之间的区别。 System.String
类是不可变的。 字符串上的Replace方法返回一个新的字符串实例,该实例表示替换操作后的原始字符串。 StringBuilder的Replace会进行替换,从而使内部对象发生变异。
因此,如果我创建一个整数数组:
var ar = new int[] {1, 2, 3, 4};
我总是可以通过数组分配来改变该数组的内容(一个System.Array实例,一个引用类型):
ar[2] = 200;
没有意义的是在那个(整数)数组元素上调用某种变异方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.