王涛:
你好。
本人想请教一个关于字符串驻留机制的问题,希望您有空可以解答。
请先看以下代码
string s1 = "abc";
string s2 = "a";
s2 += "bc";
Console.WriteLine(string.IsInterned(s2) ?? "null");
返回的结果为abc,这是正常情况。
如果我改一下,s1的声明位置。
string s2 = "a";
s2 += "bc";
Console.WriteLine(string.IsInterned(s2) ?? "null");
string s1 = "abc";
显示结果还是abc。
无论debug跟踪,还是看IL,"abc"赋值于s1都是在string.IsInterned(s2)判断之后,那么为什么判断结果不是null?
难道对于字符串驻留是在编译期完成?如果不是,那跟方法内的声明顺序有关?局部变量第一次声明代码无论在哪里,都是在方法的一开始进行?
无论局部变量s1初始声明位于什么地方,执行方法的时候都是在一开始给他初始化?
但如果代码改为:
static void Main(string[] args)
{
string s2 = "a";
s2 += "bc";
Console.WriteLine(string.IsInterned(s2) ?? "null");
string s1 = Test();
}
static string Test()
{
return "abc";
}
即显示null,又不是abc了。
又换个角度,如果把局部变量变为全局变量会怎样?
public const string s = "abc";
static void Main(string[] args)
{
string s2 = "a";
s2 += "bc";
Console.WriteLine(string.IsInterned(s2) ?? "null");
}
结果返回null。另一个问题出来了,常量不也是“静态变量”(如果把s改为静态类型,结果返回"abc")?为什么返回null?
具体问题:
1、怎么解释上面代码出现的现象。
2、究竟方法内局部变量的初始化具体如何执行?从IL看不出什么端倪。
希望Anytao可以抽空帮我解释一下,回复本帖或者发邮件给我都可以,谢谢。