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

本文关键字:变量 字符串 函数 我们将 ref 参数传递 | 更新日期: 2023-09-27 18:36:29

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

在内存方面,它将创建新实例或更新现有实例,同时我们将 ref 指针传递给对象

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

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

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


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

您正在询问两件不同的事情:

1. 字符串和字符串数据

String变量有 2 个部分:

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

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

首先,变量str指向字符串数据"样本"。在 ChangeString 函数中,您将一个新的字符串数据"新样本"分配给str变量。字符串数据"示例"未更改。

其实看这个例子:

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 所做的那样。

一旦进入函数,作用于可变strstr1变量没有影响。

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

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

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