Ume*_*AKA 3 .net c# swap reference-type
嗨,我正在尝试做两个对象的简单交换.我的代码是
void Main()
{
object First = 5;
object Second = 10;
Swap(First, Second);
//If I display results it displays as
//Value of First as 5 and Second as 10
}
private static void Swap(object First, object Second)
{
object temp = First;
First = Second;
Second = temp;
}
Run Code Online (Sandbox Code Playgroud)
由于对象是引用类型,因此应将其引用传递给方法,并且应该交换.为什么不发生?
以这种方式看待它.
让我们将交换方法中的参数重命名为"x"和"y",因为它们与本地人相同只是令人困惑.
你有一个苹果和一个橘子.两个对象.
你有两张纸说"APPLE"和"ORANGE".这些是对象的引用.
你有两个盒子,一个标记为First,另一个标记为Second.
你把"APPLE"放在First中,把"ORANGE"放在第二位.
现在你再获得两个标有x和y的方框.
你制作APPLE的复印件并把它放在x中.你制作一张ORANGE的复印件并把它放在y里.
现在你交换x和y的内容.APPLE和ORANGE仍然是引用,但您没有更改First和Second的内容.你改变了x和y的内容.
现在假设您将"ref"添加到参数x和y的声明中.现在这意味着:
你有两个盒子,一个标记为First,另一个标记为Second.
你把"APPLE"放在First中,把"ORANGE"放在第二位.
您将新标签添加到第一个框; 它现在也可以称为x.第二个也可以称为y.
你交换了x和y的内容.由于它们只是First和Second的别名,因此交换First和Second的内容.
合理?
这里有各种不同的东西:
First第二个中的内容MainSwap现在; 重要的是"引用类型/引用"和"按引用传递"之间的区别.它们完全不相关.
在线:
Swap(First, Second);
Run Code Online (Sandbox Code Playgroud)
您通过两个变量的值来Swap.在这种情况下,值的First/ Second是参照装箱对象.
下一个;
private static void Swap(object First, object Second)
{
object temp = First;
First = Second;
Second = temp;
}
Run Code Online (Sandbox Code Playgroud)
在这里,您交换两个本地参数的值,但这些参数完全独立于其他任何参数.如果我们希望调用者看到值的更改(即重新分配),我们需要通过引用传递:
private static void Swap(ref object First, ref object Second)
{
object temp = First;
First = Second;
Second = temp;
}
Run Code Online (Sandbox Code Playgroud)
现在,值First不再是对盒装对象的引用; 它是对盒装对象的引用的引用.在来电者,我们使用:
Swap(ref First,ref Second);
Run Code Online (Sandbox Code Playgroud)
这意味着传递变量的引用First,而不是传递变量的值First.
请注意,我说你可以忘记有一个物体的事实?如果我们使用以上所有内容完全相同:
int x = 1, y = 2;
Swap(ref x, ref y);
void Swap(ref int a, ref int b) {
var tmp = a; a = b; b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别是,该值的x为1等,ref x是变量x的参考.在通过引用传递时,引用类型与值类型完全无关; 唯一重要的事情是理解与您传递的值由默认的变量,其中的数值变量的是1(等),或者"对一个对象的引用".无论哪种方式,逻辑都是一样的.
| 归档时间: |
|
| 查看次数: |
2692 次 |
| 最近记录: |