我正在使用Vector3D
结构。我遇到了这样一种情况,即如果我有一个属性:
Vector3D MyVec {get; set;}
如果我调用
MyVec.Normalize();
,MyVec
的值不会被修改。我知道结构体是值类型,getter将浅复制一个新实例并返回它,因此Normalize()
方法将修改临时对象而不是MyVec
本身。以下是需要翻译的内容:
- 我该如何解决这种情况?
Vector3D
是结构体而不是类,我无法修改它。 - 在C#中我能够返回引用吗?
分配创建的结构体。
MyVec = MyVec.Normalize();
var myVec = MyVec;
myVec.Normalize();
MyVec = myVec;
在 .Net 中,对结构体的引用会导致不安全的代码。
有两个解决方案:
只允许通过包含该结构属性的类来操作Vector3D结构。
将Vector3D结构封装在一个单独的类中,并使该类通过所有结构方法,如您所需
public class Vector3DProxy
{
Vector3D value;
public Vector3D Value { get ... set ... }
public void Normalize() { value.Normalize(); }
}
方法可以接受值类型的引用。
public void Normalize(ref YourStruct pParameter)
{
//some code change pParameter
}
Normalize(ref someParameter);
我认为你只能这样解决这个问题;
MyVec = MyVec.NormalizeVector();
public static class Extension
{
public static Vector3D NormalizeVector(this Vector3D vec)
{
vec.Normalize();
return vec;
}
}
Normalize()
根本不返回结果,它是就地操作的。可变结构体很糟糕,但我们在这里有一个可变结构体,需要想办法解决它 :( - Matthew Scharley