KiMoGiGi 技术文集

不在乎选择什么,而在乎坚持多久……

IT博客 首页 联系 聚合 管理
  185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks

王涛:

你好。

本人想请教一个关于字符串驻留机制的问题,希望您有空可以解答。


请先看以下代码

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可以抽空帮我解释一下,回复本帖或者发邮件给我都可以,谢谢。

posted on 2008-06-28 22:47 KiMoGiGi 阅读(1363) 评论(1)  编辑 收藏 引用 所属分类: C#

评论

# re: To 王涛 的问题 2008-08-27 00:22 anytao
很抱歉,因为很久没有浏览博客园自带的留言信箱,所以近日才刚刚看见你给我发的邮件,所以回复也显得不够及时。

关于你所提到的问题,引起我很大的兴趣和思考,我计划以1-3篇的篇幅来进行一些分析和探讨,可能不一定完全回答你所有的问题,但是相对而言我尽力做到更多,下面是第一篇的链接:
http://www.cnblogs.com/anytao/archive/2008/08/27/must_net_22.html

后续篇幅还没有完成,谢谢关注:-)

Anytao, 2008-8-27  回复  更多评论
  

只有注册用户登录后才能发表评论。