c#通过ref不工作?

时间:2011-11-03 17:44:21

标签: c#

这是怎么回事?为什么不工作?它不是一个值类型,因此它应该通过引用传递给它?

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);
}

8 个答案:

答案 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);
}

我建议您阅读Value Types and Reference Typesthis

答案 4 :(得分:1)

Vector2Struct,结构类型是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