在将值传递给C#中的方法时更改值类型

RB2*_*RB2 0 c# methods parameter-passing value-type

关于C#的基本手册规定,要在传递给另一个方法时更改值类型,必须使用outref关键字等.

例如:

int Loop(int counter)
{
   return(++counter);
}

void ClickIt ()
{
    int count = 0;
    for (int c1 = 0; c1 < 10; c1++) 
    {
        count = Loop(count);
        Console.Writeline(count);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,ClickIt输出以下结果:1, 2, 3, 4, ... 10

在示例中,count(值类型),正在从方法传递ClickIt到方法Loop 而没有 outref正在被更改Loop.并且Loop然后返回count到调用方法ClickIt,其拾取的变化count.

所以,我的问题是:何时是值类型,当作为参数传递给另一个方法时,是否需要使用out或者ref可以更改该值?

Eri*_*ert 10

你对"ref"的含义有不正确的理解,你也在混淆价值和变量.这些都是常见的错误.

让我们回到基础.

变量是一个存储位置,其可以包含一个.

让我们简化你的程序:

int M(int x)
{
    x++;
    return x;
}
void N()
{
    int y = 0;
    y = M(y);
}
Run Code Online (Sandbox Code Playgroud)

如果调用N,会发生什么?

想象一个变量是一个可以包含一张纸的抽屉.我们制作抽屉并标记它.我们在一张纸上写着"0".现在我们称之为M(y).怎么了?

我们制作了一个标有"x"的新抽屉,我们用"y" 制作了一张纸的复印件.我们把副本放在抽屉x中.y包含一张说0的纸,x包含另一张也包含0的纸.

现在在M中我们增加x.怎么了?我们制作了一张新纸,上面写着1,丢掉旧纸,然后将新纸放在抽屉x中.

现在我们制作一个x值的复印件,所以我们有另一张纸说1.当M返回时,我们将那张纸放入y并扔掉那里已经存在的0.

M修改了吗?不,M只修改了x.N修改了y,两次.一旦y被创建,一次在M返回之后.

请注意,我们制作了两份副本.首先,我们在进入M的路上复制了y并将其复制到x,然后我们在出路上制作了x的副本并将其复制到y.

现在假设我们有

void P(ref int b)
{
   b++;
}
void Q()
{
    int c = 0;
    P(ref c);
}
Run Code Online (Sandbox Code Playgroud)

我们跑Q.会发生什么?我们制作了一个名为c的抽屉,并在其中放入一张写着"0"的纸.我们打电话给P会发生什么?有些不同.这次我们制作了一个名为b的抽屉,并在其中放入一张纸,上面写着"不要使用这个抽屉!每次尝试使用这个抽屉时,请使用c代替!" 也就是说,b 将其行为指向c.

现在P试图增加b.它试图从b中获取一个值,但发现b表示不,请使用c.所以它在c中查找,找到0,制作一张说1的新纸,替换b的内容 - 不,等等,我们需要用1替换c - 的内容,然后返回.所以c更新为1.

这两件事情有什么不同才有意义吗?第一个被称为复制,复制,因为我们在前往M的途中制作了y的复印件,并在出路时制作了x的副本.第二个是通过引用调用的,因为b将其行为引用到c; 没有复制值.