RB2*_*RB2 0 c# methods parameter-passing value-type
关于C#的基本手册规定,要在传递给另一个方法时更改值类型,必须使用out或ref关键字等.
例如:
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 而没有 out或ref正在被更改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; 没有复制值.
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |