字符串不表现为引用类型

Sau*_*jan 7 c# pass-by-reference

今天我学习了价值类型和参考类型.

我在下面的代码示例中有一个疑问:

class Program
{
    static void Main(string[] args)
    {
        StringBuilder sb = new StringBuilder();
        FunctionSB(sb);
        Console.WriteLine(sb); //sb updated

        customer c = new customer();
        FunctionClass(c);
        Console.WriteLine(c.s);//updated class value 

        String str = "";
        FuntionString(str);
        Console.WriteLine(str);//

    }

    private static void FunctionSB(StringBuilder sb)
    {
        sb.Append("sb updated");
    }

    private static void FunctionClass(customer c)
    {
        c.s = "updated class value ";
    }

    static void FuntionString(String str)
    {
        str = "updated value";
    }
}
class customer
{
    public string s;
}
Run Code Online (Sandbox Code Playgroud)

这里更新字符串构建器值和类成员变量值,但为什么FuntionString(str);不更新str值?(为什么不作为参考传递?)

Ser*_*rvy 6

我很重要的是区分变量对象.

考虑一下代码:

String str = "";
FuntionString(str);
Run Code Online (Sandbox Code Playgroud)

str是一个变量.首先,该变量的值是对字符串引用.假设该引用是数字246.字符串246可以被解析为一个值; 它的值是一个空字符数组.

然后我们将该变量的传递给FuntionString.我们没有传递对str变量的引用,我们只是传递数字246.它是该引用或数字的副本.

在该函数内部,它有一个完全不同的变量,恰好也被调用str.标识符相同的事实不会改变它恰好具有相同值的不同变量这一事实.

当您更改str 变量里面FuntionString你就不会改变str从变量Main.在FuntionString完成后,strfrom Main仍然保持在引用246上,就像之前一样,并且str内部的变量FuntionString具有一些新引用的值,假设为3,带有值的字符串新字符串"updated value".变量的变化没有反映出来Main.

FunctionSB实现该方法的情况下实际上并没有改变sb变量.它不是改变变量,而是改变变量引用的对象.在这种情况下sb指向某个位置的对象,比方说39. sb主方法和另一个方法中的两个不同的变量带有相同引用的副本.该方法不会更改sb变量,而是更改位置39处的sb对象.他们俩sb对象仍然具有相同的值; 它们没有变化,但它们都"指向"一个已经改变的单个对象.因此,可以从中观察到用该方法进行的突变Main.

如果从FuntionString您的定义中更改了两个变量所指向的字符串对象,而不是更改变量本身,那么更改将是来自调用者的"可观察".当然,这是不可能的,因为字符串是不可变的.该方法无法以调用者可以观察到的方式改变对象.