复制结构的结构的构造函数



我有一个用于Arc.的结构

我创建了一个接受Arc结构类型的构造函数,我想把内容基本上复制到我正在创建的新结构中,但它似乎把所有内容都清零了——不确定我是否误解了这是如何工作的。

这就是我所拥有的:

//constructor, take an arc - copy it but with a new radius
public Arc(Arc a, float radius)
{
this = a;
a.Radius = radius;
}

使用

Arc arc1 = new Arc(arc0, arc0.Radius + _width/2f);
arc1.Draw(Color.green,2);
Arc arc2 = new Arc(arc0, arc0.Radius - _width/2f);
arc2.Draw(Color.green,2);

由于某些原因,arc1arc2对于其所有字段(包括半径字段(都具有默认值。

我原以为arc1arc2基本上是arc0的副本,但有一个新的半径。

this的使用是否不适用于非引用类型?我不明白为什么我还有这个问题。

public Arc(Arc a, float radius)
{
this = a;
a.Radius = radius;    // <-- This line is the problem
}

您使用a.Radius = radius意味着您正在覆盖参数a.Radius成员,而不是字段this.a

值类型,包括.NET中的struct值,不共享标识,而引用类型(class实例、Object等(可以共享标识(默认情况下也是(。因此,除了有限的例外,您可以将每个struct变量视为持有整个结构实例的自己不同的副本。

将您的代码更改为:

public Arc(Arc source, float radius)
{
this = source; // Copy `source` into `this`
this.Radius = radius; // Then overwrite `this.Radius`
}

最新更新