我希望这很简单,但由于某些原因,我找不到任何可变和不可变结构之间差异的明显例子。我已经读过,我创建的任何结构都应该是不可变的,以防止将来混淆使用它。回顾我一直在研究的东西,我似乎已经创建了一个可变结构:
public struct Connection
{
public int x, y;
public float strength;
public Connection(int x, int y, float strength)
{
this.x = x;
this.y = y;
this.strength = strength;
}
}
根据我的阅读,为了使我的结构不可变,它应该如下:
public struct Connection
{
public readonly int x, y;
public readonly float strength;
public Connection(int x, int y, float strength)
{
this.x = x;
this.y = y;
this.strength = strength;
}
}
然而,当我通过dotnetperls阅读时,我感到困惑,根据我所读到的内容,那里使用的例子似乎是可变的。
抱歉这是一个新手问题。非常感谢任何帮助。
答案 0 :(得分:2)
使用不可变结构,所有实例字段/属性都标记为只读。你是对的:你问题中的第一个例子是可变的,而第二个例子是不可变的。
在处理异步/多线程代码时,不可变结构提供了许多优点,但顾名思义,它们的值不能更改。这对于结构体来说往往不是一个大问题,但是当将相同的方法应用于通过引用传递的类时,它可能会出现问题。
答案 1 :(得分:0)
有两种主要情况适合使用结构:(1)人们希望用胶带粘在一起的一堆变量; (2)一个人想要一个小的不可变对象。如果不了解您的类型如何使用,我无法确定哪种情况适用。
如果一个类型的目的是像一堆与胶带粘在一起的变量,那么前一个声明在这方面是完美的,因为任何对.NET中的结构类型有所了解的人都能立即看到在它上面并告诉它它代表了一堆与胶带粘在一起的变量,并且其行为与其他任何类型的变量完全相同,仅保存封装字段的名称和类型。
如果希望类型的行为类似于不可变对象,那么实现该类型的最简单方法可能是只读取字段。请注意,这样做实际上不会使结构不可变,因为不存在不可变的结构。如果存在两个定义为Connection c1, c2;
的字段,则语句c1=c2;
将通过覆盖其所有字段(公共字段和私有字段)来变更c1
,并使用{{1}的相应字段的值}}。 .NET框架将仅检查c2
类型以确定所有字段的总大小;它不会关心" readonly"声明或任何其他保护可能会试图放在字段上。