我一直在使用Vector2和XNA,我发现调用Zero Vector上的Normalize()成员函数将其规范化为{NaN,NaN}的向量。这一切都很好,但在我的情况下,我更喜欢它,而只是将它们留作零矢量。
将此代码添加到我的项目中启用了一个可爱的扩展方法:
using ExtensionMethods;
namespace ExtensionMethods
{
public static class MyExtensions
{
public static Vector2 NormalizeOrZero(this Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
return v2;
}
}
}
不幸的是,这个方法返回规范化的向量,而不是简单地规范化我用来调用这个扩展方法的向量。我想改为行为 vector2Instance .Normalize()。
除了使这个空白之外,我该如何调整它以便修改'v2'? (基本上,我需要访问'this'对象,或者我需要'v2'通过引用传递。)
编辑:
是的,我试过这个:
public static void NormalizeOrZero(this Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
}
不起作用,v2只是NormalizeOrZero范围内的一个变量。
答案 0 :(得分:3)
这不起作用,因为Vector 2 is actually a struct。这意味着它按值传递,您无法修改调用者的副本。我认为你能做的最好的是lomaxxx指定的解决方法。
这说明了为什么通常应该避免使用结构。有关详细信息,请参阅this question。 Vector2违反了结构应该是不可变的准则,但在XNA的上下文中这样做可能是有意义的。
答案 1 :(得分:1)
好吧,如果你真的只是正在死去这样做,你可以这样做:
public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
}
你会这样称呼它:
v2.NormalizeOrZero(ref v2);
它非常丑陋,但它会起作用,因为它的价值。但是在那时你也可以首先称之为静态方法。
答案 2 :(得分:0)
我不确定为什么你的第二个代码示例不起作用,但如果第一批代码完成了你想要的东西,你可以简单地解决它:
Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();
答案 3 :(得分:0)
您需要在参数上同时使用ref
和this
修饰符,这似乎不太可行。