使用关键字“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到底有啥用?啥时候会用到呢?我浏览了一些资料但都不是很明白。

javascript中的new有啥用

Object类

在 `System.Windows.Forms` 控件中没有 `ref` 关键字的情况下,如何通过引用传递

C语言中的class函数有啥用~

unity shader有啥用