gpt4 book ai didi

c# - 结构扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:49 26 4
gpt4 key购买 nike

附代码:

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

public static void FixRounding(this Vector3 v)
{
if (Mathf.Approximately(v.x, Mathf.Round(v.x))) v.x = Mathf.Round(v.x);
if (Mathf.Approximately(v.y, Mathf.Round(v.y))) v.y = Mathf.Round(v.y);
if (Mathf.Approximately(v.z, Mathf.Round(v.z))) v.z = Mathf.Round(v.z);
}

尽管 Mathf.Approximately 返回 true,但 FixRounding 方法实际上并未更改向量的值。

最佳答案

本声明:

public static void FixRounding(this Vector3 v)

... 表示 v按值 传递,它是一个结构,假设 documentation是正确的。因此,调用者看不到您对其所做的任何更改。您需要将其设为常规方法,并通过引用传递 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... 但因为它是一个结构,所以从调用者的角度来看,修改传递的值不会改变它。通过引用传递它解决了这个问题,因此输出了第三行。

关于c# - 结构扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com