Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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#_Unity3d - Fatal编程技术网

C# 结构扩展方法

C# 结构扩展方法,c#,unity3d,C#,Unity3d,代码为: someVector.FixRounding(); //round vector's values to integers if the difference is 1 epsilon float x = someVector.x; //still getting old value FixRounding方法实际上不会更改向量的值,尽管Mathf.approxist返回true。此声明: public static void FixRounding(this Vector3 v)

代码为:

someVector.FixRounding(); //round vector's values to integers if the difference is 1 epsilon
float x = someVector.x; //still getting old value

FixRounding方法实际上不会更改向量的值,尽管Mathf.approxist返回true。

此声明:

public static void FixRounding(this Vector3 v)
。。。表示通过值传递
v
,并且假设正确,它是一个结构。因此,调用者将看不到您对它所做的任何更改。您需要使其成为常规方法,并通过引用传递
v

public static void FixRounding(ref Vector3 v)
并称之为:

TypeDeclaringMethod.FixRounding(ref pos);
下面是一个扩展方法的演示,这些方法尝试修改通过值传递的结构:

using System;

struct Vector3
{
    public float x, y, z;

    public override string ToString() => $"x={x}; y={y}; z={z}";
}

static class Extensions
{
    public static void DoubleComponents(this Vector3 v)
    {
        v.x *= 2;
        v.y *= 2;
        v.z *= 2;
    }

    public static void DoubleComponentsByRef(ref Vector3 v)
    {
        v.x *= 2;
        v.y *= 2;
        v.z *= 2;
    }
}

class Test
{
    static void Main()
    {
        Vector3 vec = new Vector3 { x = 10, y = 20, z = 30 };
        Console.WriteLine(vec); // x=10; y=20; z=30
        vec.DoubleComponents();
        Console.WriteLine(vec); // Still x=10; y=20; z=30
        Extensions.DoubleComponentsByRef(ref vec);
        Console.WriteLine(vec); // x=20; y=40; z=60
    }
}
现在,如果
Vector3
是一个类,那么打印的第二行是x=20;y=40;z=60。。。但由于它是一个结构,修改传递的值不会从调用方的角度改变它。通过引用传递它修复了第三行输出。

此声明:

public static void FixRounding(this Vector3 v)
。。。表示通过值传递
v
,并且假设正确,它是一个结构。因此,调用者将看不到您对它所做的任何更改。您需要使其成为常规方法,并通过引用传递
v

public static void FixRounding(ref Vector3 v)
并称之为:

TypeDeclaringMethod.FixRounding(ref pos);
下面是一个扩展方法的演示,这些方法尝试修改通过值传递的结构:

using System;

struct Vector3
{
    public float x, y, z;

    public override string ToString() => $"x={x}; y={y}; z={z}";
}

static class Extensions
{
    public static void DoubleComponents(this Vector3 v)
    {
        v.x *= 2;
        v.y *= 2;
        v.z *= 2;
    }

    public static void DoubleComponentsByRef(ref Vector3 v)
    {
        v.x *= 2;
        v.y *= 2;
        v.z *= 2;
    }
}

class Test
{
    static void Main()
    {
        Vector3 vec = new Vector3 { x = 10, y = 20, z = 30 };
        Console.WriteLine(vec); // x=10; y=20; z=30
        vec.DoubleComponents();
        Console.WriteLine(vec); // Still x=10; y=20; z=30
        Extensions.DoubleComponentsByRef(ref vec);
        Console.WriteLine(vec); // x=20; y=40; z=60
    }
}

现在,如果
Vector3
是一个类,那么打印的第二行是x=20;y=40;z=60。。。但由于它是一个结构,修改传递的值不会从调用方的角度改变它。通过引用传递它修复了这个问题,因此是第三行输出。

请注意,屏幕截图将显示一个可能已经舍入的值。这就是为什么我建议使用往返格式或使用
位转换器显式转换为字符串。DoubleToInt64位
@AlexeiLevenkov:Done now-您可能希望删除您的注释。请注意,屏幕截图将显示可能已舍入的值。这就是为什么我建议使用往返格式显式转换为字符串,或者使用
位转换器。DoubleToInt64位
@AlexeiLevenkov:现在完成-您可能想删除您的注释。带结构的扩展方法似乎是这里的问题。如果我没有遗漏什么,问题就解决了。@MCpiroman:我现在将删除我所有的评论(关于问题和答案)。我重新讨论了这个问题,因为它现在显然不是一个浮点数issue@MCpiroman:这不是那个问题的翻版,真的-supercat的答案会满足这个问题,但我认为你的问题也可以。带结构的扩展方法似乎是这里的问题。如果我没有遗漏什么,问题就解决了。@MCpiroman:我现在将删除我所有的评论(关于问题和答案)。我重新讨论了这个问题,因为它现在显然不是一个浮点数issue@MCpiroman字体这不是一个愚弄的问题,真的-supercat的回答会满足这个问题,但我认为你的问题也站得住脚是好的。