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