C#struct最佳实践,可能存在矛盾吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#struct最佳实践,可能存在矛盾吗?相关的知识,希望对你有一定的参考价值。

我知道C#struct大约有1000个问题。我想迭代我理解值语义,stackallocs的性能优势等。我的具体问题源于这篇关于何时在类上使用结构的msdn文章。 MSDN struct vs class C#

首先,他们说的是容器内联数据的好处,特别是数组。一个分配,以及数组中所有结构的非用户可定义的默认初始化。但是,他们也强调结构应该是不可改变的。

如果我宣布一个mystuct[] s = new mystruct[16];,我有16个mystructs默认值inline。如果我按照推荐的方式创建了一个没有外部可变性的'kosher'结构,那对我来说有什么用处呢?我怀疑我打算只有一个0积分数组和空值。

当它们仅作为记录或属性返回时,它们是否意味着不可变,即单一数据传输?

如果之前已经提到了默认数组初始化和推荐的不变性之间的特定冲突,请标记为重复。感谢您的任何见解。

答案

所讨论的不变性是通过struct的方法,而不是struct本身的价值。结构的实例总是可以通过赋值进行变异 - 想想for循环中的整数循环变量;每次通过循环都会改变它。

但是,对于框架的System.Int32结构(即int)而言,使用DoubleIt方法导致基础整数的值加倍而没有一些明显的赋值操作(如++i;实际上是i=i+1;)是没有意义的。

考虑一下string.ReplaceStringBuilder.Replace之间的区别。 System.String类是不可变的。对字符串的Replace方法返回一个新的字符串实例,该实例表示替换操作后的原始字符串。 StringBuilder的Replace做了替换,改变了内部对象。

所以,如果我创建一个整数数组:

var ar = new int[] {1, 2, 3, 4};

我总是可以通过数组赋值来改变该数组的内容(System.Array实例,引用类型):

 ar[2] = 200;

什么是没有意义的是在该(整数)数组元素上调用一些变异方法。

另一答案

两者之间没有实际矛盾:

在你做var s = new mystruct[16];之后,确实你有16个mystruct实例的数组被初始化为默认值。

但是,执行s[0] = new mystruct(<arguments list here>)不会在数组的第一个单元格中改变结构,它会将其替换为新结构。

所以结构本身仍然是不可改变的。

以上是关于C#struct最佳实践,可能存在矛盾吗?的主要内容,如果未能解决你的问题,请参考以下文章

iphone / Objective c的最佳代码片段网站是啥[重复]

充分利用自动化测试的 10 个最佳实践

集成 ASP.NET Identity 的最佳实践——它们存在吗?

从可能不存在的 JToken 中获取价值(最佳实践)

更新片段参数的最佳实践?

Code Review最佳实践