这是怎么回事?为什么不工作?它不是一个值类型,因此它应该通过引用传递给它?
void func()
{
Vector2 a = new Vector2(1, 0);
equal(a);
// a is now (1, 0) not (0, 0)
}
void equal(Vector2 a)
{
a = new Vector2(0, 0);
}
答案 0 :(得分:6)
C#默认按值传递参数,因此它只在a
方法中分配给equal
。如果您希望通过引用传递
ref
参数
void func()
{
Vector2 a = new Vector2(1, 0);
equal(ref a);
// a is now (0, 0) as expected
}
equal(ref Vector2 a)
{
a = new Vector2(0, 0);
}
答案 1 :(得分:3)
因为对a的引用是作为值而不是作为引用传递的,所以你要修改'' 当地的'a。
正确的是:
void equal ( ref Vector2 a)
HTH
马里奥
答案 2 :(得分:2)
你没有通过引用传递。为此,您需要使用ref
关键字
void func()
{
Vector2 a = new Vector2(1, 0);
equal(ref a);
}
void equal(ref Vector2 a)
{
a = new Vector2(0, 0);
}
答案 3 :(得分:1)
要更改引用,您需要通过引用来确保引用更改。
void func()
{
Vector2 a = new Vector2(1, 0);
equal(ref a);
}
void equal(ref Vector2 a)
{
a = new Vector2(0, 0);
}
答案 4 :(得分:1)
Vector2
是Struct
,结构类型是value type
不是引用。使用ref
关键字通过引用传递
答案 5 :(得分:0)
你应该尝试:
void func()
{
Vector2 a = new Vector2(1, 0);
equal(ref a);
}
void equal(ref Vector2 a)
{
a = new Vector2(0, 0);
}
答案 6 :(得分:0)
a的引用副本正在传递给equal方法。内部相等的代码正在改变副本指向的内存位置。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_example4。
为了清楚起见:Vector2对象没有被复制,变量a在被传递给方法时被复制。
答案 7 :(得分:0)
引用类型可以通过值或引用传递。默认 是传递代码示例所做的值。
当按值传递引用类型时,可以修改 对象的状态,但你不能改变引用本身 引用一个新对象。要做到这一点,你必须通过参考传递。
void equal(ref Vector2 a)
{
a = new Vector2(0, 0);
}
这是我在线.NET培训部分的直接链接 演示了动画和代码示例的所有案例:http://motti.me/cf
我希望这有帮助!
Motti