gpt4 book ai didi

c# - 如何使用属性在 C# 中处理值类型?

转载 作者:太空狗 更新时间:2023-10-29 20:20:59 24 4
gpt4 key购买 nike

我有一个名为 Tank 的小类,它有一个名为 Location 的公共(public)成员,它是一个 Rectangle(一个 struct).当我写:

Tank t = new Tank();
t.Location.X+=10;

一切正常,坦克移动。

但是在我将成员更改为属性 之后,我不能再使用这种语法。它无法编译,因为 t.Location 现在是一个属性(它是函数)并返回该位置的临时副本(因为它是一个值类型)。

我现在可以使用 Location 的唯一方法是做这样的事情:

k = t.Location 
k.X +=10;
t.Location = k;

是否有任何解决方法可以帮助我避免编写这种丑陋的代码,并使用直观的 a+=10; 语法?

最佳答案

来自@Servy
“结构是不可变的”好吧,不,它们不是。在大多数情况下,它们应该是不变的,但它们并非天生不可变。这里的固有问题是该属性返回结构的副本,而不是对该结构的引用。如果 C# 中有用于 ref 返回的语法,那么这是可能的。

从根本上说,这行不通的原因是结构是不可变的。一旦它们被制造出来,就是这样。因此,无法部分重新分配结构。这就像试图换掉你的腿一样。你不能。它是你的一部分,你也随之而来!

我认为您唯一能做的就是实现您自己的 X 和 Y 属性,这样:

public double LocationX
{
get
{
return Location.X;
}
set
{
Location = new Rectangle(value,Location.Y);
}
}

你显然也需要将它镜像到 Y,但这应该允许你想要的(但不要指望它很快或高效!)

虽然这回答了您的直接问题,但我想就您的模型提出几点意见。我会考虑不尝试像这样更新机芯。从 OO 的角度来看,您的坦克是它自己的对象,应该管理它自己的位置。给它一个移动指令,然后让它更新自己的位置。

例如:

Tank.MoveRelative(10,0);   
Tank.MoveAbsolute(100,100);

这给了你更多的自由,并允许坦克根据你给它的逻辑验证对它提出的任何请求。

关于c# - 如何使用属性在 C# 中处理值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15074844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com