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

时间:2015-10-02 07:54:40

标签: c# asp.net c#-4.0 c#-3.0

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作为out发送并更改调用方法中的值。因为字符串是不可变的。更改它应该创建一个新的字符串对象。但它如何在调用方法中正确打印值,并在调用方法中更改。

提前感谢。

2 个答案:

答案 0 :(得分:1)

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引用的项目引用字符串"我已经返回":

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

答案 1 :(得分:0)

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

澄清情况的样本:

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

更新您的问题:

s1.SomeMethodChangesStringInnerState();

有两个对字符串和单个字符串对象的引用。

s1,s2 - 参考。 " foo" 是对象。

参考文献可以更改," foo"可'吨

不变性意味着没有这样的方法:

     QVector<uint16_t*>(8) ringBuffer;
     foreach(uint16_t* data, ringBuffer){
       data = new(1024);
     }

     size_t index = 0;

     //Access 
     while(true)
     {

       memcpy(ringBuffer[index],yourSource, 1024);
       index = (index +1) % 8;
     }