如何访问';这';从C#扩展方法中?
我一直在使用Vector2和XNA,我发现对零向量调用Normalize()成员函数会将其规范化为{NaN,NaN}向量。这一切都很好,但在我的例子中,我更喜欢将它们作为零向量 将此代码添加到我的项目中启用了可爱的扩展方法:如何访问';这';从C#扩展方法中?,c#,pass-by-reference,this,C#,Pass By Reference,This,我一直在使用Vector2和XNA,我发现对零向量调用Normalize()成员函数会将其规范化为{NaN,NaN}向量。这一切都很好,但在我的例子中,我更喜欢将它们作为零向量 将此代码添加到我的项目中启用了可爱的扩展方法: using ExtensionMethods; namespace ExtensionMethods { public static class MyExtensions { public static Vector2 NormalizeO
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范围内的一个变量。我不确定第二个代码示例为什么不起作用,但如果第一批代码符合您的要求,您可以通过以下方法解决它:
Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();
我不知道为什么您的第二个代码示例不起作用,但如果第一批代码符合您的要求,您可以通过以下方式解决:
Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();
这不起作用,因为向量2。这意味着它是按值传递的,您不能修改调用方的副本。我认为你能做的最好的是lomaxxx指定的变通方法
这说明了为什么通常应该避免使用结构。有关更多信息,请参阅。Vector2违反了结构应该是不可变的准则,但在XNA的上下文中这样做可能是有意义的。这不起作用,因为Vector2。这意味着它是按值传递的,您不能修改调用方的副本。我认为你能做的最好的是lomaxxx指定的变通方法
这说明了为什么通常应该避免使用结构。有关更多信息,请参阅。Vector2违反了结构应该是不可变的准则,但在XNA的上下文中这样做可能是有意义的。您需要在参数上同时使用
ref
和this
修饰符,这似乎不太可能起作用。您需要在参数上同时使用ref
和this
修饰符,这似乎不太可能起作用。如果您真的非常想这样做,您可以这样做:
public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
}
你可以这样称呼它:
v2.NormalizeOrZero(ref v2);
这很难看,但不管它值多少钱,它都会有用的。但是在这一点上,你可以首先调用一个静态方法。如果你真的非常想这样做,你可以这样做:
public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
if (v2 != Vector2.Zero)
v2.Normalize();
}
你可以这样称呼它:
v2.NormalizeOrZero(ref v2);
这很难看,但不管它值多少钱,它都会有用的。但是在这一点上,您最好首先调用一个静态方法。第二个代码示例正在变异结构的副本,因此,虽然它在某种意义上起作用,但它并没有做OP希望它做的事情,也没有变异对象调用方所做的事情。第二个代码示例正在变异结构的副本,因此,尽管它在某种意义上起作用,它没有做OP希望它做的事情,并且改变了对象调用方所做的。