【问题标题】: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”关键字在这种情况下没有意义。

【问题讨论】:

标签: .net string class parameters ref


【解决方案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???
  • 不,即使你可以修改调用者中的变量,你仍然需要有正确的类型。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 2017-02-11
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多