.net 使用关键字传递类对象有什么用;参考号;?默认情况下,它们是按引用传递的

.net 使用关键字传递类对象有什么用;参考号;?默认情况下,它们是按引用传递的,.net,string,class,parameters,ref,.net,String,Class,Parameters,Ref,我刚刚注意到.net允许我们这样做 public void Func1(ref String abc) { } 我想知道“ref”关键字有什么意义????因为字符串是一个类(引用类型) 它和我的有什么不同吗 public void Func1(String abc) { } 我只是问,因为我很困惑。缺少某些概念或它们是同一事物,“ref”关键字在此上下文中没有意义。默认情况下,如果没有ref关键字,则会复制字符串指针(按值传递)。使用ref将按引用传递,这还允许您修改原始调

我刚刚注意到.net允许我们这样做

  public void Func1(ref String abc)
  {
  }
我想知道“ref”关键字有什么意义????因为字符串是一个类(引用类型)

它和我的有什么不同吗

 public void Func1(String abc)
 {
 }

我只是问,因为我很困惑。缺少某些概念或它们是同一事物,“ref”关键字在此上下文中没有意义。

默认情况下,如果没有ref关键字,则会复制字符串指针(按值传递)。使用ref将按引用传递,这还允许您修改原始调用者中的指针。

默认情况下,参数按值传递。如果将参数传递给方法,则不会修改原始变量。但是,如果将参数作为
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
一个新值

正如您应该阅读msdn文档中的
ref
关键字一样,它基本上解释了这一点:我尝试了它,正如您所提到的那样。我有点困惑。字符串-->类,类-->引用类型,引用类型的值在函数内更改。Func1所做的哪些更改没有得到反映???请将
foo
视为只包含指向字符串对象的指针,而不是对象本身。如果复制
foo
(如
Func1
),则将指向新字符串对象的指针指定给
foo
的副本,因此原始变量不会更改,仍然指向同一字符串对象。您需要在变量的内容(指向对象的指针)和对象本身之间进行区分。变量仅包含指向对象的指针。如果对象的数据更改,变量本身的内容不会更改,因为它仍然指向同一对象。只是它指向的位置的数据发生了更改。编辑:如果您为Foo(Employee)的参数分配了一个新的Employee(),那么当我们执行abc=“Changed from Func1”时,它也不会得到反映;创建了一个新的字符串对象,并将引用赋值给变量abc。是的,这就更清楚地表明您正在创建一个新对象。但是,即使它是一个已经存在的字符串,比如
abc=myOtherString
,abc在赋值后也会指向另一个对象。因此,如果它是一个新的字符串并不重要,重要的是它是一个不同于abc之前指向的字符串。“允许您修改原始调用方中的指针”这是否意味着我可以让abc指向对象集其他类型(类),如Employee???不,即使您可以修改调用方中的变量,您仍然需要使用正确的类型。