<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      《你必須知道的.NET》網(wǎng)站 | Anytao技術(shù)博客 

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

      發(fā)布日期:2008.8.27 作者:Anytao
      ? 2008 Anytao.com ,Anytao原創(chuàng)作品,轉(zhuǎn)貼請(qǐng)注明作者和出處。

      說在,開篇之前

      走鋼絲的人,在刺激中體驗(yàn)快感。帶著問題思考,在問題上迸發(fā)火花。

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

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

      • 什么是string?
      • 什么是字符串駐留?
      • 字符串駐留的運(yùn)行機(jī)制及執(zhí)行過程?
      • 字符串駐留的其他問題?

      帶著幾個(gè)問號(hào),你必須知道的.NET,繼續(xù)更多體驗(yàn)。

                                                                                                                            www.anytao.com

       

      1 帶著問題?

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

       

       

      快捷參考

                                                                                                                            www.anytao.com

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

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

      這是個(gè)簡(jiǎn)單的例題,可以很快給出答案。

              // 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"); 
              }

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

              // 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"); 
              }

      如果上述執(zhí)行過程,你能很快給出答案,那么恭喜了,第一關(guān)看來不是那么費(fèi)勁,我們接著思考,繼續(xù)第二關(guān):

              // 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"); 
              }

      還有一個(gè),我們繼續(xù)

              // 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"; 
              }

      你的答案怎么是?我們還是接著迎接挑戰(zhàn):

              // 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"; 
              }

      這是第二關(guān)了,你的思考肯定還在繼續(xù),我們第三關(guān)也呼之欲出:

              // 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"); 
              }

      最后一個(gè),沖出藩籬:

              // 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"); 
              }

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

      2 欲求思考

      欲求思考,則從基本開始,對(duì)于理解整個(gè)string intern機(jī)制是大有裨益的,因此深入的第一步就從基本概念開始。隨著我們分析的層層深入,就會(huì)發(fā)現(xiàn)看似曲折的結(jié)果,原來不過如此而已,這正是技術(shù)探求的最佳方式。

      什么是string

      什么是string呢,提起這個(gè)問題,我想下面的圖例可以給出一點(diǎn)啟示:

      string在本質(zhì)上就是一連串的有順序的字符集合。

      簡(jiǎn)單的說,string就是char[],而在.NET中string頭一回具有了類的概念,暗合了.NET一切皆為對(duì)象的大一統(tǒng)格局?;貧w本質(zhì),我們重新審視如此另類而多彩的string,你會(huì)不禁明白,string本質(zhì)上就是一個(gè)16位Unicode字符數(shù)組。打開string的Disassemble代碼,我們可直擊其本質(zhì):

          [Serializable, ComVisible(true)]
          public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
          {
          }

      結(jié)合string的定義,我們可以看出其基本的特性主要包括:

      • 引用類型,string本質(zhì)上是引用類型,相關(guān)內(nèi)容參考《你必須知道的.NET》 對(duì)值類型和引用類型的討論。
      • 字符串恒等性。
      • 字符串駐留性,本文的研究重點(diǎn)。
      • 密封性,由sealed關(guān)鍵字可見,sealed特性為實(shí)現(xiàn)字符串恒等性和字符串駐留機(jī)制,提供了基礎(chǔ)保證,具體的原因參見《你必須知道的.NET》 關(guān)于string的相關(guān)論述。

      關(guān)于這些特性并非本文關(guān)注的熱點(diǎn),還有大量的命題值得我們關(guān)注,總結(jié)起來還可包括:

      • 字符串比較:以等價(jià)規(guī)則而非恒等規(guī)則進(jìn)行比較。
      • 常用方法:Trim()、ToLow()、Replace()、Split()、PadRight()、SubString()和Join()
      • 格式化。
      • 轉(zhuǎn)移字符。
      • StringBuilder,另一個(gè)重要的話題。
      • Encoding,編碼。
      • Culture & Internationalization,語言文化。
      • overloads == ,==重載。

      由此可知,string真是一個(gè)豐富而多彩的技術(shù)倉庫,飽含了.NET技術(shù)中很多精髓與技巧,我們不可能在本文中盡述其然,更多的論述和分析可以參考以下信息:

       

       

      快捷參考

      關(guān),你可以參考:

      • string的更多技術(shù)與規(guī)則,可以參考《你必須知道的.NET》 8.3節(jié)“如此特殊:大話String”
      • 等價(jià)規(guī)則和恒等規(guī)則,可以參考《你必須知道的.NET》 8.2節(jié)“規(guī)則而定:對(duì)象判等”

                                                                                                                            www.anytao.com

      接下來,本文的主題閃亮登場(chǎng)。

      什么是字符串駐留(String Interning)

      回歸經(jīng)典,我們首先給出MSDN對(duì)于字符串駐留的一點(diǎn)討論:

      公共語言運(yùn)行庫通過維護(hù)一個(gè)表來存放字符串,該表稱為拘留池,它包含程序中以編程方式聲明或創(chuàng)建的每個(gè)唯一的字符串的一個(gè)引用。因此,具有特定值的字符串的實(shí)例在系統(tǒng)中只有一個(gè)。

      例如,如果將同一字符串分配給幾個(gè)變量,運(yùn)行庫就會(huì)從拘留池中檢索對(duì)該字符串的相同引用,并將它分配給各個(gè)變量。

      之所以,將string這個(gè)熟悉的命題拿出來造輪子,并不是再造個(gè)輪子自己陶醉。關(guān)于string的輪子,實(shí)在太多了,而且個(gè)個(gè)不順眼,它就像編程的精靈,四處可見隨處都有。string是如此的重要,以至于CLR必須以特殊的方式來實(shí)現(xiàn)對(duì)string類型的管理、存取和布局,在這些復(fù)雜的特殊表象中,字符串駐留機(jī)制是string特殊性的集中體現(xiàn),它的基本原理可以概括為:

      • CLR維護(hù)一個(gè)類似于哈希表的內(nèi)部結(jié)構(gòu),用于維護(hù)對(duì)于字符串的統(tǒng)一管理。
      • 但JIT編譯時(shí),CLR首先查找哈希表,如果沒有找到匹配的字符串記錄,則在托管堆中創(chuàng)建新的string實(shí)例,并為哈希表添加一個(gè)鍵值對(duì)記錄;下一次查找相同string時(shí),則只返回該記錄的值給第二次創(chuàng)建的string對(duì)象。
      • 通過這種方式,字符串駐留機(jī)制有效實(shí)現(xiàn)了對(duì)string的池管理,節(jié)省了大量的內(nèi)存空間。

      詳細(xì)的字符串駐留機(jī)制,敬請(qǐng)參考:

       

      快捷參考

      關(guān)于字符串駐留機(jī)制的詳細(xì)過程,不是本文所要解決的主要問題,你可以參考:

                                                                                                                            www.anytao.com

      我們可以從code01盡情領(lǐng)略字符串駐留機(jī)制的基本原理,然而關(guān)于字符串駐留,并不是幾句簡(jiǎn)單原理就能全面概括的問題。

      注意:動(dòng)態(tài)創(chuàng)建的字符串是不執(zhí)行字符串駐留機(jī)制的,例如通過:

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

      但是對(duì)于“動(dòng)態(tài)”二字的把握并非一件簡(jiǎn)單的事情,什么情況下執(zhí)行字符串駐留,而什么時(shí)候不會(huì)執(zhí)行字符串駐留,在.NET spec中我并沒有找出足夠精確的正解來闡釋這個(gè)問題,例如code06示例中,string s1 = GetStr(); 的位置很大程度上決定了是否執(zhí)行字符串駐留條件,從code06示例的結(jié)果可見,string.IsInterned(s2)并未收獲返回“abc”的預(yù)期結(jié)果,而下面的示例則又給出意想不到的答案:

              // Release : code10, 2008/08/25                
              // Author  : Anytao, http://www.anytao.com
              static void Main()
              {
                  //在這個(gè)位置返回abc
                  string s1 = GetStr();
       
                  string s2 = "ab";
                  s2 += "c";
                  Console.WriteLine(string.IsInterned(s2) ?? "null");
              }
       
              private static string GetStr()
              {
                  return "abc";
              }

      對(duì)比code06和code10,我們發(fā)現(xiàn)不同的只是string s1 = GetStr(); 的位置,而結(jié)果卻大相徑庭。

      為什么?

      位置的不同而導(dǎo)致觸發(fā)字符串駐留機(jī)制是否執(zhí)行的條件不同,這正是我們通過實(shí)例反向驗(yàn)證的最佳體現(xiàn)。那么,你的思考呢?

      這些看似熟悉的問題,其實(shí)都值得推敲,本文沒有太多的精力兼顧所有,只能在邊緣之余探討一下遺留在字符串駐留機(jī)制中一些并不是很清楚的問題,算是對(duì)字符串駐留機(jī)制的進(jìn)一步探討,主要包括:

      • CLR的加載過程。
      • intern pool在什么時(shí)候創(chuàng)建,如何創(chuàng)建?
      • 駐留機(jī)制的簡(jiǎn)述。
      • 方法的調(diào)用過程。
      • 介紹IsInterned和Intern方法。
      • string intern的失效和弊端。

      以解決本文開題的幾個(gè)典型的問題,同時(shí)順便解答KiMoGiGiTo 王濤 的問題中提出的問題。下面我們一一揭開這些問題的神秘面紗。

      作為字符串駐留機(jī)制探討的第一篇,我們從問題出發(fā)引出對(duì)于字符串駐留的定義和概念,在未來的篇章中除了說明上述問題之外,我們還將力圖解釋開篇8個(gè)示例的個(gè)中結(jié)果,并對(duì)可能的情況和問題進(jìn)行一些對(duì)比性的推敲。

      事實(shí)上,由string intern而引發(fā)的技術(shù)論題,還有很多值得我們品味和玩味,這也正是這個(gè)本文及其后續(xù)篇章力圖做出的努力。

       

      敬請(qǐng)期待,本篇后文。。。

       

      Anytao | 2008-08-27 | 你必須知道的.NET

      http://www.anytao.com/  | Blog: http://anytao.cnblogs.com/ | Anytao創(chuàng)作品,轉(zhuǎn)貼請(qǐng)注明作者和出處,留此信息。

       

      特別鳴謝

      Jeffery Richter,對(duì)于我的問題,Jeffery先生及時(shí)給出自己的見解,讓我頓時(shí)感受到大師的品格。

      KiMoGiGi,是他的問題帶來本文的思考,這些難得的線索構(gòu)成了我們進(jìn)行探討的基礎(chǔ)話題,巧婦難為無米之炊,因此需要特別感謝。

       

      參考文獻(xiàn)

      (Book)Martin Fowler,Refactoring: Improving the Design of Existing Code

      (cnblog)http://www.rzrgm.cn/flier/archive/2004/07/08/22307.html 

      (cnblog)http://www.rzrgm.cn/artech/archive/2007/05/31/765773.html

       

      溫故知新

      [開篇有益]
      [第一回:恩怨情仇:is和as]
      [第二回:對(duì)抽象編程:接口和抽象類]
      [第三回:歷史糾葛:特性和屬性]
      [第四回:后來居上:class和struct]
      [第五回:深入淺出關(guān)鍵字---把new說透]
      [第六回:深入淺出關(guān)鍵字---base和this]
      [第七回:品味類型---從通用類型系統(tǒng)開始]
      [第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理]
      [第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊]
      [第十回:品味類型---值類型與引用類型(下)-應(yīng)用征途]
      [第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)]
      [第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)]
      [第十三回:從Hello, world開始認(rèn)識(shí)IL]
      [第十四回:認(rèn)識(shí)IL代碼---從開始到現(xiàn)在]
      [第十五回:繼承本質(zhì)論]
      [第十六回:深入淺出關(guān)鍵字---using全接觸]
      [第十七回:貌合神離:覆寫和重載]
      [第十八回:對(duì)象創(chuàng)建始末(上)]
      [第十九回:對(duì)象創(chuàng)建始末(下)]
      [第二十回:學(xué)習(xí)方法論]
      [第二十一回:認(rèn)識(shí)全面的null]

       

      ? 2008 Anytao.com 原創(chuàng)作品,轉(zhuǎn)貼請(qǐng)注明作者和出處,留此信息。

      本文以“現(xiàn)狀”提供且沒有任何擔(dān)保,同時(shí)也沒有授予任何權(quán)利。
      This posting is provided "AS IS" with no warranties, and confers no rights.

      posted @ 2008-08-27 00:06  Anytao  閱讀(10045)  評(píng)論(53)    收藏  舉報(bào)
      主站蜘蛛池模板: 高清不卡一区二区三区| 天堂va蜜桃一区二区三区| 在线亚洲妇色中文色综合| 亚洲第一狼人天堂网伊人| 国产v综合v亚洲欧美大天堂| 一二三三免费观看视频| 久久香蕉国产线熟妇人妻| 亚洲av中文一区二区| 国产免费高清69式视频在线观看| 欧洲码亚洲码的区别入口| 国产成人综合欧美精品久久| 99在线精品国自产拍中文字幕| 亚洲sm另类一区二区三区| 蜜桃无码一区二区三区| 国产精品亚洲mnbav网站| 国产中文字幕精品在线| 彭水| 日韩大片看一区二区三区| 97精品亚成在人线免视频| 狠狠做五月深爱婷婷天天综合| 国产精品天干天干综合网| 青青草一区二区免费精品| 熟女人妻视频| 人妻少妇偷人作爱av| 国产sm调教折磨视频| 午夜福利免费视频一区二区| 97午夜理论电影影院| 人妻少妇精品系列| 欧美大胆老熟妇乱子伦视频| 久久久无码精品亚洲日韩蜜臀浪潮| 国产精品日韩中文字幕熟女| 亚洲一区二区约美女探花| 亚洲成熟女人av在线观看| 国产盗摄xxxx视频xxxx| 海门市| 熟女精品视频一区二区三区| 四虎亚洲国产成人久久精品| 激情综合色综合久久综合| 国产成人午夜一区二区三区 | 亚洲国产精品久久久久4婷婷| 成人精品一区日本无码网|