我有一个有趣的例子,你能解释一下吗?据我了解,字符串是一个参考类,但不能修改。因此,当我尝试修改字符串时,框架会创建对新堆地址的新引用。我不明白为什么 Bear 方法中的这个新地址没有传递到主调用堆栈。
class DoWork
{
public static void Beer(string s1) {
s1 = s1 + "beer";
}
public static void Vodka(ref string s2) {
s2 = s2 + "vodka";
}
}
string sss = "I Like ";
DoWork.Beer(sss);
DoWork.Vodka(ref sss);
所以 sss 将具有“我喜欢伏特加”的价值,但为什么呢?
PS还是这样
DoWork.Vodka(ref sss);
DoWork.Beer(sss);
PPS 示例中的一些 IL 代码
DoWork.Beer:
IL_0000: ldarg.0
IL_0001: ldstr "beer"
IL_0006: call System.String.Concat
IL_000B: starg.s 00
IL_000D: ret
DoWork.Vodka:
IL_0000: ldarg.0
IL_0001: ldarg.0
IL_0002: ldind.ref
IL_0003: ldstr "vodka"
IL_0008: call System.String.Concat
IL_000D: stind.ref
IL_000E: ret