使用关键字“ref”传递类对象有啥用?默认情况下,它们是通过引用传递的[重复]
Posted
技术标签:
【中文标题】使用关键字“ref”传递类对象有啥用?默认情况下,它们是通过引用传递的[重复]【英文标题】:What is the use passing Class Object using keyword "ref"? They are by by default pass by reference [duplicate]使用关键字“ref”传递类对象有什么用?默认情况下,它们是通过引用传递的[重复] 【发布时间】:2012-05-03 20:15:29 【问题描述】:我刚刚注意到 .net 允许我们这样做。
public void Func1(ref String abc)
我想知道“ref”关键字是否有意义????因为 String 是一个类(引用类型)
有什么不同吗。
public void Func1(String abc)
我只是问,因为我很困惑。要么缺少一些概念,要么它们是同一个东西,“ref”关键字在这种情况下没有意义。
【问题讨论】:
同"ref" keyword and reference types 你应该阅读ref
关键字的msdn文档,它几乎解释了它:msdn.microsoft.com/en-us/library/14akc2c7.aspx
【参考方案1】:
参数默认通过值传递。如果将参数传递给方法,则不会修改原始变量。但是,如果您将参数作为ref
参数传递,则您传入的原始变量可能会被修改。
试试这个:
public void Func1(String abc)
abc = "Changed from Func1";
public void Func2(ref String abc)
abc = "Changed from Func2";
public void main()
string foo = "not changed";
Func1(foo);
Console.WriteLine(foo);
Func2(ref foo);
Console.WriteLine(foo);
你会得到的输出是:
not changed
Changed from Func2
在Func1
中创建了foo
的副本,它引用相同的字符串。但是,一旦您为其分配另一个值,参数abc
就会引用另一个字符串。 foo
没有被修改,仍然指向同一个字符串。
在Func2
中,您传递了对foo
的引用,因此当您为abc
分配一个新值(即对另一个字符串的引用)时,您实际上是在为foo
分配一个新值。
【讨论】:
我试过了,就像你提到的那样。我有点困惑。 String ---> Class, Class ---> Refrence 类型,Refrence 类型的值在函数内部发生变化。 Func1 所做的更改没有得到体现??? 认为foo
只包含一个指向字符串对象的指针,而不是对象本身。如果复制foo
(如Func1
),则将指向新String 对象的指针分配给foo
的副本,因此原始变量不会改变,仍指向同一个String 对象。
您需要区分变量的内容(指向对象的指针)和对象本身。该变量仅包含指向对象的指针。如果对象的数据发生变化,变量本身的内容并没有变化,因为它仍然指向同一个对象。只是它指向的位置的数据发生了变化。编辑:如果你为 Foo(Employee) 的参数分配一个新的 Employee(),它也不会得到反映。
知道了 :) 当我们做 abc = "Changed from Func1";一个新的 String 对象被创建并且引用分配给变量 abc。
是的,这让您更清楚地知道您正在创建一个新对象。但即使它是一个已经存在的字符串,比如abc = myOtherString
,abc 在分配后指向另一个对象。所以它是否是一个新字符串并不重要,重要的是它是一个不同于 abc 之前指向的字符串。【参考方案2】:
默认情况下,如果没有 ref 关键字,则会生成字符串指针的副本(按值传递)。使用 ref 将通过引用传递,这也允许您修改原始调用者中的指针。
【讨论】:
“允许你修改原始调用者中的指针”这是否意味着我可以让 abc 指向一个其他类型(类)的对象,比如 Employee??? 不,即使你可以修改调用者中的变量,你仍然需要有正确的类型。以上是关于使用关键字“ref”传递类对象有啥用?默认情况下,它们是通过引用传递的[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C#中ref和out到底有啥用?啥时候会用到呢?我浏览了一些资料但都不是很明白。