当我们将字符串变量作为 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 个部分:
- 字符串变量本身,
- 字符串数据
在您的示例中,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
变量。请注意,我说的是变量,而不是变量数据。 str1
和 str
都指向相同的字符串数据,就像 str1
和 str2
一样。
一旦进入函数内部,作用于变量 str
将不会影响 str1
变量。
但是,由于您使用的是 ref
关键字,因此不会发生该复制。相反,变量 str
变成了 str1
的别名。所以当 str
被修改时, str1
.
也会被修改
这在功能上等同于以下内容:
static void Main()
{
String str1 = "sample";
String str2 = str1;
str1 = "New Sample";
}
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
指向字符串数据"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
变量。请注意,我说的是变量,而不是变量数据。 str1
和 str
都指向相同的字符串数据,就像 str1
和 str2
一样。
一旦进入函数内部,作用于变量 str
将不会影响 str1
变量。
但是,由于您使用的是 ref
关键字,因此不会发生该复制。相反,变量 str
变成了 str1
的别名。所以当 str
被修改时, str1
.
这在功能上等同于以下内容:
static void Main()
{
String str1 = "sample";
String str2 = str1;
str1 = "New Sample";
}