当我们将字符串变量作为 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
关键字。ChangeString
方法中的代码将为变量分配一个新实例。
.NET 中的字符串是不可变的,因此无法更改它们。将字符串分配给字符串变量时,变量中的引用将替换为对新字符串的引用。
但请注意,文本字符串 "sample"
和 "New Sample"
的字符串对象都是在应用程序启动时创建的。当赋值发生时,代码不会创建任何新的字符串实例,它只获取对之前创建的字符串对象的引用。
您正在询问两件不同的事情:
1. 字符串和字符串数据
String
变量有 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
变量中。请注意,我说的是变量,而不是变量数据。str1
和 str
都将指向相同的字符串数据,就像 str1
和 str2
所做的那样。
一旦进入函数,作用于可变str
对str1
变量没有影响。
但是,由于您使用的是 ref
关键字,因此不会发生该复制。相反,变量str
变得像str1
的别名。因此,当str
被修改时,str1
也是如此。
这在功能上等效于以下内容:
static void Main()
{
String str1 = "sample";
String str2 = str1;
str1 = "New Sample";
}