c#作为函数参数传递的字符串

本文关键字:字符串 参数传递 函数 | 更新日期: 2023-09-27 18:15:58

string myString;
void WriteString( string myString ) // This myString is copied. 
{
    // Writing to myString. 
    myString[0] = 'b'; // chaning this is just changing copy
}

void ReadString( string myString ) // Is this myString copied, eventhough I'm not writing at all?
{
   if( myString[0] == 'a' ) // calling just get property in string
      DebugConsole.Write("I just read myString and first character was 'a'");
}

你好。我想知道,在上面的情况下,编译器是否会区分两个函数,并尝试通过传递myString作为引用或内联函数来优化ReadString函数。如果不是这样,如果myString太大而不能忽略复制,应该怎么做?

谢谢。

c#作为函数参数传递的字符串

不考虑编译器的优化(不,这里不会有那么大的区别),c#中的string类型总是通过引用传递的。

此外,string引用是不可变的。这意味着你的WriteString函数一开始就不会编译。

StringBuilder builder = new StringBuilder(myString);
builder[0] = 'b';
myString = builder.ToString();

当然要注意,这个解决方案不会改变在函数之外对string的任何引用。为了做到这一点,将其作为ref参数传递。