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

时间:2015-01-06 12:23:18

标签: c# string immutability

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

就内存而言,当我们将ref指针传递给对象

时,它将创建新实例或更新现有实例

2 个答案:

答案 0 :(得分:6)

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

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


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

答案 1 :(得分:0)

你问的是两件事:

<强> 1。字符串和字符串数据

String变量分为两部分:

  1. 字符串变量本身,
  2. 字符串数据
  3. 在您的示例中,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变量。请注意,我说的是变量,而不是变量数据。 str1str都会指向相同的字符串数据,就像str1str2一样。

    一旦进入该功能,对可变量str采取行动就不会对str1变量产生任何影响。

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

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

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