对于网格系统(2D-数组),我正在创建一个Index2-struct。这与Vector2非常相似。
遇到了一些我读到的关于结构的问题。遇到了变幻莫测和不可改变的主题。
长话短说,易变的结构是不好的。因此,我想知道,我如何使我的结构不变?这让我找到了this post。
如果正确理解,要使结构不可变,您必须确保一旦创建了实例,就不能修改实例的成员。
但是,当我以统一的方式看Vector2-struct时。一旦创建了一个new Vector2(0f, 0f),就可以修改它的值:
Vector2 myVector = new Vector2(1f, 1f);
myVector.x = 2f;这个很好用。
.Set-method也是如此:
Vector2 myVector = new Vector2(1f, 1f);
myVector.Set(2f, 2f);此外,在Vector的定义,我没有看到任何解决方案建议在上述链接的帖子。
这让我想知道几件事?
Vector2 --一个不可变的结构?如果是的话,它的结构是如何在能够修改成员的同时仍然是不可变的?如果不是,为什么仍然是一个安全的结构?。
发布于 2021-03-26 15:29:20
答1:不,这不是一成不变的,我想你证明了自己
回答2:很确定你的问题是矛盾的,你不能修改一个不变的对象。
回答3:不可变的对象是伟大的,如果你有你想要创建的东西,一次又一次地使用而不改变,然后你就完成了。如果您想要创建、使用、更改、再次使用、再次更改等等,它们是不合适的。如果你有这样一个场景,那就是创建/使用-但是没有改变/完成,那么使它不可变是一件好事,因为你知道它没有被编辑-在你的背后.可以像代码中的石头一样依赖它。这不适合你想要改变的东西(例如滚球的位置)。因此,对于最后一种情况,Vector2是理想的。它并不是真正的安全和不安全,而是恰当和不恰当的
发布于 2021-03-26 16:01:55
不是一成不变的。大多数人由于无法修改Vector3的各个组件而有问题,他们做的事情如下
transform.position.x=value;这是行不通的,但不是因为永恒不变的原因。这是行不通的,因为transform.position实际上不是一个字段,它是一个属性(getter setter对)。在Unity3D公开的几乎任何内容中,都是setter/getter,因此它的定义不是
公共Vector3立场;
但是,由于三个独立的元素、一个后备字段和一个方法的parir运行来检索或设置值,所以(我将我的属性pos称为不与实际转换相混淆的位置- wchich是比较复杂的)。
private Vector3 _pos;
public Vector3 pos { get { return _pos;} set { _pos=value;}}这就是诀窍。属性本质上只是C#中的语法糖,因此在幕后编译如下
private Vector3 _pos;
public Vector3 GetPos ()
{ return _pos; }
public void SetPos(Vector3 value)
{ _pos=value;}}现在,如果你仔细看一下这样的语句
transform.position.x+=1; // won't work它们没有意义,因为你真正的意思是:
Vector3 temp = transform.GetPos();
temp.x+=1; // Vectors3 mutate all right
transform.SetPos(temp);因为.position是一个属性,并且有一个后备方法,所以在修改和发送一个新的结构之前,它必须执行并返回一个完整的结构。如果位置是一个字段,这将是很好的,但转换将无法知道它已经改变并应用您的变化(如果您设置全局位置,它确实需要做大量的数学操作)
发布于 2021-03-26 15:28:35
https://stackoverflow.com/questions/66819583
复制相似问题