当我将对象传递给c#中的函数并更改其值时,原始实例值会发生变化吗?我一直在调查为什么会发生这种情况,但没有人解释。
class Program
{
static void Main(string[] args)
{
Class1 obj = new Class1();
obj.x = 10;
test(obj);
Console.WriteLine(obj.x); // prints 200
}
static void test(Class1 a)
{
a.x = 200;
}
}
当我尝试使用int数据类型时,它没有改变。
我对pass我的价值和参考有了深刻的认识。但是在c#中,我很困惑到底发生了什么?
我想知道为什么c#改变原来的obj函数值。它仍然应该打印10。
当您尝试使用int
时,传递了int变量的副本。当您运行该方法时,您的内存中包含两个int型,您修改了其中一个,然后将其丢弃
如果用ref
传递int
,则会传递原始int值,并且该方法会修改原始值
当您传递对象时,传递对对象的引用,无论您是否使用ref
,您都可以修改对象的属性,并且调用方法将看到这些修改。在对象上使用ref或not的区别在于,使用ref可以将对象交换为一个全新的对象(使用new
)关键字,原始方法将获得新对象。如果没有ref,原始方法将保留原始对象,因为传递的引用(随后为新对象更改)是一个副本
暂时忘记调用方法,让我们做一个更简单的:
int x = 0;
int y = x;
y++;
你现在期望x的值是多少?
它有0;Y是x的值的副本
Person p = new Person(){ Name = "John" };
Person q = p;
q.Name = "Mary";
你希望p现在有什么名字?(玛丽)
这就像你发布的代码中发生的事情一样,所以你已经理解了它在而不是调用方法的上下文中- y是x的副本(它们引用内存中的不同数据,改变一个不改变另一个),q是引用p的副本(但它们都引用内存中的相同数据,改变数据意味着两个引用都看到了变化)