Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问';这';从C#扩展方法中?_C#_Pass By Reference_This - Fatal编程技术网

如何访问';这';从C#扩展方法中?

如何访问';这';从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

我一直在使用Vector2和XNA,我发现对零向量调用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范围内的一个变量。

我不确定第二个代码示例为什么不起作用,但如果第一批代码符合您的要求,您可以通过以下方法解决它:

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希望它做的事情,并且改变了对象调用方所做的。