static void Main()
{
String str="sample";
ChangeString(ref str);
}
void ChangeString(ref string str)
{
str="New Sample";
}
就内存而言,当我们将ref指针传递给对象
时,它将创建新实例或更新现有实例答案 0 :(得分:6)
将引用类型作为参数传递并不会创建新实例,无论是否使用ref
关键字。 ChangeString
方法中的代码将为变量分配一个新实例。
.NET中的字符串是不可变的,因此您无法更改它们。将字符串赋给字符串变量时,变量中的引用将替换为对新字符串的引用。
请注意,文件字符串"sample"
和"New Sample"
的字符串对象都是在应用程序启动时创建的。当赋值发生时,代码不会创建任何新的字符串实例,它只会获得对先前创建的字符串对象的引用。
答案 1 :(得分:0)
你问的是两件事:
<强> 1。字符串和字符串数据
String
变量分为两部分:
在您的示例中,str
是一个变量&#34;示例&#34;和&#34;新样本&#34;是每个字符串数据。
首先,变量str
指向字符串数据&#34; sample&#34;。在ChangeString
函数中,您正在分配新的字符串数据&#34;新样本&#34;到str
变量。字符串数据&#34;样本&#34;没有被改变。
事实上,看看这个例子:
static void Main()
{
String str1 = "sample";
String str2 = str1;
ChangeString(ref str1);
}
void ChangeString(ref string str)
{
str = "New Sample";
}
此处,str1
将更改为指向新的字符串数据&#34;新样本&#34;,但str2
将继续指向原始&#34;样本&#34;数据
<强> 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";
}