C# - 如何确保静态方法直接影响其参数而不仅仅是实例?

Wer*_*ner 2 c# unity-game-engine

我有2个静态方法,只有一个做了我想做的事情,我无法弄清楚另一个有什么问题.更具体地说,Method_A似乎不生成其参数的实例,并且在main中创建的同一变量上运行,而B似乎在实例上运行.

public static Method_A(Vector2[] in, int n)
{
     for(int i = 0; i < in.Length; i++)
     {
          in[i].x = n;
          in[i].y = n;
     }
}

public static Method_B(Vector2 in, int n)
{
     in.x = n;
     in.y = n;
}
Run Code Online (Sandbox Code Playgroud)

然后从主要:

// This works, and changes values directly in "test"
Vector2[] test = meshFilter.uv;
Method_A(test, n);
meshFilter.uv = test;

// This FAILS, doesn't affect test
Vector2 test = meshFilter.uv[i];
Method_B(test, n);
meshFilter.uv[i] = test;

// This also FAILS, doesn't affect test
Vector2[] t = meshFilter.uv
(...for loop...){
Vector2 test = t[i];
Method_B(test, n);
t[i] = test;}
meshFilter.uv = t;
Run Code Online (Sandbox Code Playgroud)

我希望方法B能够处理原始变量,而不是某些实例......我该怎么做才能确保这一点?

如果需要更多详细信息,请与我们联系.

谢谢.

Eri*_*rik 6

这就是值类型在C#中的工作方式.如果要对原始结构进行操作,则需要通过引用传递它.

public static Method_B(ref Vector2 in, int n)
{
    in.x = n;
    in.y = n;
}
Run Code Online (Sandbox Code Playgroud)

此外,您需要指定它已在呼叫站点通过引用传递.

Method_B(ref test, n);
Run Code Online (Sandbox Code Playgroud)

您的数组不需要这样,因为数组是引用类型.它们通过引用[1]传递,因此您Method_A正在处理原始数组.

[1]为了迂腐,数组变量(例如Vector2[] arr是数组变量)实际上是对数组的引用.值arr默认值按值传递,因为这是对数组的引用,所以它具有通过引用传递数组的效果.

  • @Werner:数组不是值类型,它们是引用类型.他们已经大致拥有这个属性(请注意,分配给整个值,例如`in = new [] {}`的工作方式不同) (2认同)