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的回答会满足这个问题,但我认为你的问题也站得住脚是好的。