当我们在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
发送出去,并更改调用方方法中的值。因为字符串是不可变的。修改它应该会创建一个新的字符串对象。但是它是如何在调用方法中正确打印值的,在调用方方法中发生了变化。
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();