c#旁路参考不工作?

c#旁路参考不工作?,c#,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); } 为了更改引用,您需要通过ref传递,以确保引用更改 我建议您阅读和。您应该尝试: void func() {

这是怎么回事?为什么机器不工作?它不是值类型,所以应该通过引用传递,对吗

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);
}
为了更改引用,您需要通过ref传递,以确保引用更改

我建议您阅读和。

您应该尝试:

void func()
{
    Vector2 a = new Vector2(1, 0);
    equal(ref a);
}

void equal(ref Vector2 a)
{
    a = new Vector2(0, 0);
}C#默认情况下按值传递参数,因此它仅在
equal
方法中分配给
a
。如果希望通过引用传递,则需要在此处使用
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);
}

你不是通过引用传递的。为此,您需要使用
ref
关键字

void func()
{
    Vector2 a = new Vector2(1, 0);
    equal(ref a);
}

void equal(ref Vector2 a)
{
    a = new Vector2(0, 0);
}

原因对的引用作为值而不是引用传递,因此您正在修改 本地的

正确答案是:

void equal ( ref Vector2 a)


Mario

Vector2
Struct
,Struct type是
值类型
非引用。使用
ref
关键字按引用传递

将引用的副本传递给equal方法。equal中的代码正在更改副本指向的内存位置。 有关详细信息,请参阅


需要澄清的是:Vector2对象没有被复制,变量a在传递给方法时被复制。

引用类型可以通过值传递,也可以通过引用传递。默认值 是通过代码示例所做的值进行传递

通过值传递引用类型时,可以修改 对象的状态,但不能更改引用本身,使其 引用一个新对象。要做到这一点,您必须通过引用传递

void equal(ref Vector2 a)
{
    a = new Vector2(0, 0);
}
这里是我在线.NET培训的一个直接链接 使用动画和代码示例演示所有情况:

我希望这有帮助


莫蒂

无论哪种方式,他都需要使用ref。它是否是值类型并不重要-分配给参数不会改变参数的值,除非您在此处使用
ref
@alan2-是。它是一个结构。但这也会发生在类中。。。按引用传递是默认行为。@EoinCampbell-您是指按值传递。请阅读,请不要破坏您的帖子。一旦您发布了一个问题,您就已经将内容授权给了Stack Overflow社区(在CC by SA许可下)。如果您想解除此帖子与您帐户的关联,请参阅。+1。为了混淆这个问题,应该注意,对于非值类型的对象(称为引用类型),它是一个按值传递的引用;-)@JaredPar,很抱歉编辑,我本来打算编辑我的,但点击太快了…@JamesHill别担心。编辑:否,使用
ref
通过引用传递值。它不会“作为一个引用类型”传递它——在你的头脑中保持“引用类型”和“通过引用传递”的概念非常分离是值得的。
void equal(ref Vector2 a)
{
    a = new Vector2(0, 0);
}