c#基本类型Vs对象,传递给函数

  • 本文关键字:函数 对象 类型 Vs c#
  • 更新时间 :
  • 英文 :


当我将对象传递给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的副本(但它们都引用内存中的相同数据,改变数据意味着两个引用都看到了变化)

最新更新