值类型和引用类型问题大家好,我想做一个简单的两个对象的交换。我的代码是voidMain(){objectFirst=5;对象第二=10;交换(第一,第二);//如果我显示结果,它显示为//ValueofFirstas5andSecondas10}privatestaticvoidSwap(objectFirst,objectSecond){objecttemp=First;第一=第二;第二=温度;}由于对象是引用类型,它的引用应该被传递给方法并且应该被交换。为什么没有发生?这里有各种不同的东西:现在;重要的是“引用类型/引用”和“通过引用传递”之间的区别。它们完全无关。行内:Swap(First,Second);你将两个变量的值传递给Swap。在这种情况下,First/Second的值是对装箱对象的引用。下一个;privatestaticvoidSwap(objectFirst,objectSecond){objecttemp=First;第一=第二;第二=温度;}这里你交换了两个局??部参数的值,但是这些参数完全独立于任何其他参数。如果我们希望调用者看到值的变化(即重新分配),我们需要通过引用传递它:privatestaticvoidSwap(refobjectFirst,refobjectSecond){objecttemp=First;第一=第二;第二=温度;现在,First的值不再是对装箱对象的引用;它是对装箱对象的引用。在调用者中,我们使用:Swap(refFirst,refSecond);这意味着传递变量First的引用,而不是变量First的值。注意我说过你可以忘记有一个对象的事实吗?如果我们使用以上所有内容,结果完全相同:intx=1,y=2;交换(参考x,参考y);voidSwap(refinta,refintb){vartmp=a;一=b;b=tmp;唯一的区别是x的值为1等,而refx是对变量x的引用。通过引用传递时,引用类型与值类型完全无关;唯一重要的是了解默认情况下您按值传递变量,其中变量的值为1(等)或“对对象的引用”。无论哪种方式,逻辑都是相同的。那样看吧。让我们将swap方法中的参数重命名为“x”和“y”,因为它们与本地参数相同,只是令人困惑。你有一个苹果和一个橙子。两个对象。你有两张纸,上面写着“苹果”和“橙色”。这些是对对象的引用。您有两个框,一个标记为First,另一个标记为Second。你把“苹果”放在第一位,然后是“橙色”。现在你又得到两个标有x和y的框。你复制APPLE并将其放入x中。你复制一份ORANGE并把它放在y中。现在交换x和y的内容。APPLE和ORANGE仍然是引用,但是您没有更改First和Second的内容。您更改了x和y的内容。现在假设您将“ref”添加到参数x和y的声明中。现在这意味着:您有两个框,一个标记为First,另一个标记为Second。你把“苹果”放在第一位,然后是“橙色”。您向第一个框添加一个新标签;它现在也可以称为x。第二个也可以称为y。你交换了x和y的内容。因为它们只是第一个和第二个的别名,所以交换第一个和第二个的内容。合理的?Swap方法中的参数指向的对象是对Main内部的First和Second对象的引用,但参数本身是Swap方法的本地对象。所以如果你写了First=1;第二=2第一=1;Second=2inSwap;您将在Main中看到对象的更改。但是,您只更改了Swap指向的参数(通过将它们分配给另一个对象),而根本没有更改该对象。如果您尝试在Swap方法中将对象设置为null,情况也是如此。您没有将其作为参考传递,您需要明确声明您正在传递参考:Swap(refFirst,refSecond);privatestaticvoidSwap(refobjectFirst,refobjectSecond)您正在按值传递对对象的引用(传递值是C#中的默认设置)。相反,您需要通过引用(使用ref关键字)将对象传递给函数。privatestaticvoidSwap(refobjectfirst,refobjectsecond){objecttemp=first;第一=第二;第二=温度;}voidMain(){objectfirst=5;对象秒=10;交换(参考第一,参考第二);}当然,如果您使用的是C#2.0或更高版本,最好定义一个泛型版本的函数,它可以接受任何类型的参数,而不是对象类型。例如:privatestaticvoidSwap(refTfirst,refTsecond){Ttemp;温度=第一;第一=第二;第二=温度;然后您还可以声明具有适当类型int的变量。不是按值传递对对象的引用,而是需要按引用传递它们。换句话说,您需要将引用传递给对象的引用。这是使用ref关键字实现的。例如privatestaticvoidSwap(refobjectFirst,refobjectSecond){objecttemp=First;第一=第二;第二=温度;您需要通过引用传递。这里有一些关于pass-by-refence,pass-by-value的额外信息:http://www.yoda.arachsys.com/csharp/parameters.html,试试这个:以上是C#学习教程:值类型和所有参考类题分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——voidMain(){objectFirst=5;对象第二=10;交换(参考第一,参考第二);//如果我显示结果,它显示为//ValueofFirstas5andSecondas10}privatestaticvoidSwap(refobjectFirst,refobjectSecond){objecttemp=First;第一=第二;第二=温度;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
