当我们在c#中传递string作为输出参数时会发生什么?

本文关键字:参数 输出 什么 我们 string | 更新日期: 2023-09-27 18:15:43

class Program
{
    static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }
    static void Main()
    {
        int value;
        string str1="fwer", str2;
        Method(out value, out str1, out str2);
        Console.WriteLine (str1);
        Console.ReadKey();
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) null;
    }

在上面的代码中,我初始化str1并将str1发送出去,并更改调用方方法中的值。因为字符串是不可变的。修改它应该会创建一个新的字符串对象。但是它是如何在调用方法中正确打印值的,在调用方方法中发生了变化。

当我们在c#中传递string作为输出参数时会发生什么?

string是不可变的,但是你没有改变字符串的内容。您正在创建一个新字符串,并将一个字符串替换为新字符串。

这个代码:

string str1="fwer", str2;
Method(out value, out str1, out str2);

的作用相当于:

string str1 = "fwer", str2;
str1 = "I've been returned";
str2 = null;

当使用out参数时,它通过引用传递参数。

由于字符串已经是引用类型,这意味着传递对引用的引用。当你在方法内部改变它时,你是在改变一个引用,而不是字符串的内容。

考虑str1的初始状态,它引用了一个字符串对象。

str1 --> ["fwer"]

当你把它作为参数out string s1传递给方法时,会发生以下情况:

s1 --> str1 --> ["fwer"]

所以s1引用的是str1的引用,改变它也会改变str1引用的内容。

然后这行代码:

s1 = "I've been returned";

使s1引用的项引用字符串"I've been returned":

s1 --> str1 --> ["I've been returned"]

String是具有值类型语义的引用类型。字符串是不可变的。当你将字符串作为out/ref函数的参数传递时,它与传递任何其他引用类型没有什么不同。

说明情况的例子:

void Foo()
{
 string str; //reference to string is created which points to null
 str = "foo";//string object is created and "str" is now points to it   
 Bar(out str);//pass "str" as a reference to reference
}
void Bar(out string str1) //"str1" is like a pseudomin for "str". If you change "str1" the "str" changes to.
{
 str1 = "bar";//new string object is created and both "str1" and "str" pointed to it
}

对你更新的问题:

string s1 = "foo"; 
string s2 = s1;

有两个对string对象和单个string对象的引用。

s1, s2 -引用。"foo"是对象。

引用可以修改,"foo"不能。

不变性意味着不存在这样的方法:

s1.SomeMethodChangesStringInnerState();