当我们将字符串变量作为 ref 参数传递给函数并在函数中更改字符串变量的值时

When we pass string variable as ref argument to function and change value of string variable in function

static void Main()
{
   String str="sample";
   ChangeString(ref str);
}
void ChangeString(ref string str)
{ 
   str="New Sample";
}

就内存而言,当我们将 ref 指针传递给对象时,它将创建新实例或更新现有实例

将引用类型作为参数传递不会创建新实例,无论是否使用 ref 关键字。 ChangeString 方法中的代码将为变量分配一个新实例。

.NET 中的字符串是不可变的,因此您无法更改它们。将字符串分配给字符串变量时,变量中的引用将替换为对新字符串的引用。


请注意,文字字符串 "sample""New Sample" 的字符串对象都是在应用程序启动时创建的。当分配发生时,代码不会创建任何新的字符串实例,它只会获取对先前创建的字符串对象的引用。

你问的是两件不同的事情:

1.字符串和字符串数据

String 变量有 2 个部分:

  1. 字符串变量本身,
  2. 字符串数据

在您的示例中,str 是一个变量,"sample" 和 "New Sample" 都是字符串数据。

起初,变量str指向字符串数据"sample"。在 ChangeString 函数中,您将新的字符串数据 "New Sample" 分配给 str 变量。字符串数据 "sample" 未更改。

其实看这个例子:

static void Main()
{
   String str1 = "sample";
   String str2 = str1;
   ChangeString(ref str1);
}
void ChangeString(ref string str)
{ 
   str = "New Sample";
}

这里,str1会变成指向新的字符串数据"New Sample",但是str2会继续指向原来的"Sample"数据。

2。关键字 ref

通常情况下,当一个参数被传递给一个函数时,变量会从原始输入复制到函数的参数变量中。因此在上面的示例中,如果未使用 ref 关键字,则变量 str1 将被复制到 str 变量。请注意,我说的是变量,而不是变量数据。 str1str 都指向相同的字符串数据,就像 str1str2 一样。

一旦进入函数内部,作用于变量 str 将不会影响 str1 变量。

但是,由于您使用的是 ref 关键字,因此不会发生该复制。相反,变量 str 变成了 str1 的别名。所以当 str 被修改时, str1.

也会被修改

这在功能上等同于以下内容:

static void Main()
{
   String str1 = "sample";
   String str2 = str1;
   str1 = "New Sample";
}