[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

作者: Anytao  來源: 博客園  發布時間: 2008-10-13 11:10  閱讀: 4066 次  推薦: 0   原文鏈接   [收藏]  
 

系列文章導航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.NET] 第四回:后來居上:class和struct

[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透

[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this

[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始

[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理

[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊

[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途

[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)

[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)

[你必須知道的.NET] 第十三回:從Hello, world開始認識IL

[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在

[你必須知道的.NET] 第十五回:繼承本質論

[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創建始末(上)

[你必須知道的.NET] 第十九回:對象創建始末(下)

[你必須知道的.NET]第二十回:學習方法論

[你必須知道的.NET]第二十一回:認識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

 

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

 

說在,開篇之前

走鋼絲的人,在刺激中體驗快感。帶著問題思考,在問題上迸發火花。

或者給問題以答案,或者給答案以問題,你可能永遠無法看清全部,但是總能從一點突破很多。事實的關鍵就在于面對問題,我該如何思考?

String Interning(字符串駐留)就是這樣一個值得思考的話題,帶著問題思考,我們至少要理清以下幾個問題:

  • 什么是string?
  • 什么是字符串駐留?
  • 字符串駐留的運行機制及執行過程?
  • 字符串駐留的其他問題?

帶著幾個問號,你必須知道的.NET,繼續更多體驗。

 

1 帶著問題?

帶著問題思考,是技術探索的最佳實踐, 每當我收到很多朋友來函探討技術的問題,總能給我很多的技術思索和驚喜,今天我們的話題就是由一個朋友的來函開始的,你可以通過鏈接打開KiMoGiGiTo 王濤 的問題一文中精彩絕倫的思考和探討,帶著他的提問,引著我的思考,完成本文對string的一點點探討。

首先,本文也無一例外的從8個測試開始,也希望讀者能沿著這幾個簡單的示例來思考答案。如果對此包含熱情,不妨可以試試,你開始了嗎?

        // Release : code01, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com 
        static void Main() 
        { 
            string s1 = "abc"; 
            Console.WriteLine(string.IsInterned(s1) ?? "null"); 
        }

這是個簡單的例題,可以很快給出答案。

        // Release : code02, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s1 = "ab"; 
            s1 += "c"; 
            Console.WriteLine(string.IsInterned(s1) ?? "null"); 
        }

稍加修改,這回的答案又該如何分析,我們繼續。

        // Release : code03, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s1 = "abc"; 
            string s2 = "ab"; 
            s2 += "c"; 
 
            string s3 = "ab"; 
 
            Console.WriteLine(string.IsInterned(s1) ?? "null"); 
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
 
            Console.WriteLine(string.IsInterned(s3) ?? "null"); 
        }

如果上述執行過程,你能很快給出答案,那么恭喜了,第一關看來不是那么費勁,我們接著思考,繼續第二關:

        // Release : code04, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s1 = "abc"; 
            string s2 = "ab"; 
            string s3 = s2 + "c"; 
 
            Console.WriteLine(string.IsInterned(s3) ?? "null"); 
        }

還有一個,我們繼續

        // Release : code05, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
 
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
 
            string s1 = "abc"; 
        }

你的答案怎么是?我們還是接著迎接挑戰:

        // Release : code06, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
 
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
 
            string s1 = GetStr(); 
        }         
 
        private static string GetStr() 
        { 
            return "abc"; 
        }

這是第二關了,你的思考肯定還在繼續,我們第三關也呼之欲出:

        // Release : code07, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        public const string s1 = "abc"; 
 
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
 
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
        }

最后一個,沖出藩籬:

        // Release : code08, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        public static string s1 = "abc"; 
 
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
 
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
        }

過關斬將,三輪PK,是英雄比高。不管怎樣,你的答案和思考,肯定會讓大家對string刮目相看,是否和你一直以來的認識統一呢?在此感謝KiMoGiGi 給我的啟示。有了問題,我們更需要的是思考、探討和反思。

 

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()