成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實例講解.NET字符串拘留池

開發 后端
本文是從一道面試題引出的例子,提到了.NET字符串拘留池。我們希望通過本實例讓大家更好的了解拘留池的概念。

本文將從.NET字符串拘留池講起,希望大家在今后碰到這樣的問題時,能正確處理。公共語言運行庫通過維護一個表來存放字符串,該表稱為拘留池,它包含程序中以編程方式聲明或創建的每個唯一的字符串的一個引用.因此,具有特定值的字符串的實例在系統中只有一個。

XiaoMing在博客園上發表的《年前的面試經歷(二) 》中回貼眾多,其中談到一個面試題:string a = "a" + "b"到底分配幾次內存。

這涉及到CLR內部的.NET字符串拘留池(string interning pool)問題。

網友 Ivony和 橫刀天笑的回貼引用資料指出拘留池是進程范圍內的,因此,有可能以下定義字串常量的代碼不會導致分配兩次內存——因為另一個進程可能已經在拘留池中創建了“a”或 “ab”這兩個字串對象。

  1. string s1 = "a";  
  2. string s2 = "a";  
  3. string s3 = "a" + "b";  
  4. Console.WriteLine(s1);  
  5. Console.WriteLine(s2);  
  6. Console.WriteLine(s3); 

我對此結論有點懷疑,于是到Google和MSDN中查找,發現.NET字符串拘留池的有關資料很混亂。***決定自己編程作實驗。

String類有一個IsInterned()方法用于檢測一個字串是否在拘留池中,另一個Intern()方法用于將一個字串加入拘留池中。

為此,我寫了以下測試代碼:

  1. class Program  
  2.     {  
  3.         //static string outerstr = "j";    
  4.          
  5.         static void Main(string[] args)  
  6.         {  
  7.              
  8.             string str = new string('j',1);  //動態構建的字串,不會放到拘留池中  
  9.             if (string.IsInterned(str) == null)  
  10.                 Console.WriteLine(str + " is not interned");   //不在拘留池  
  11.             else  
  12.                 Console.WriteLine(str+ " is interned"); //在拘留池  
  13.  
  14.             Console.ReadKey();  
  15.             string s = string.Intern(str);  //強制加入拘留池  
  16.           //再次檢測  
  17.            if (string.IsInterned(str) == null)  
  18.                 Console.WriteLine(str + "is not interned");  
  19.             else  
  20.                 Console.WriteLine(str+ " is interned");  
  21.             Console.ReadKey();             
  22.         } 

上述代碼運行結果如下:

  1. j is not interned  
  2. j is interned 


不管你運行多少次,也不管你是否同時運行多個此程序的實例,始終結果是一致的,都是上面的結果。這說明進程結束后,字串拘留池中的與此進程所裝載的程序集相關的字串常量對象被清除。

現在取消對outerstr 變量的注釋,結果變為:

  1. j is interned  
  2. j is interned 


這說明程序集中的常量“j”在裝載時被加入到了字串拘留池中,所以才有上述結果。

還有一個問題,字串拘留池中的對象能否跨越不同進程邊界共享?

編寫另一個測試程序:

  1. class Program  
  2.    {  
  3.          
  4.        static void Main(string[] args)  
  5.        {  
  6.  
  7.            string str = new string('j', 1);  
  8.            Console.WriteLine(string.IsInterned(str)==null);    
  9.            Console.ReadKey();  
  10.        }  
  11.    } 

不管前一個測試程序是否在運行,上述代碼始終輸出true,說明“j”這個字串沒有在拘留池中,此進程無法獲取另一個進程追加到字串拘留池中的“j”字串。

從這些實驗是否可以得出以下結論?

當進程運行結束,此進程所加載的程序集中所定義的字串常量對象會被CLR從字串拘留池中移除。

因此,CLR字串拘留池中的字串常量是“進程和程序集相關”的。

應用程序所定義的字串常量對象在應用程序域裝載程序集時被加入到字串拘留池中。

所以,字串拘留池中的字串對象不能跨進程共享。不然,我們如何解釋代碼運行的結果?

由于同一進程中可以創建多個應用程序域,我還沒有編寫代碼測試字串拘留池中的字串對象是否可以在屬于同一進程的多個應用程序域共享。此問題留待進一步探索。

有無高人能徹底解釋清楚這一問題?

補充:

我的測試環境是Windows 7 + Visual Studio 2010 RC.

原文標題:探討一下.NET字串拘留池

鏈接:http://www.cnblogs.com/bitfan/archive/2010/03/02/1676733.html

【編輯推薦】

  1. .NET Framework字符串相關操作細節介紹
  2. 詳解.NET字符串解析的具體過程
  3. 改進C#連接字符串的性能
  4. .NET Lambda表達式的語義:字符串列表范例
  5. C#字符串的幾種常用方法
責任編輯:彭凡 來源: 博客園
相關推薦

2024-04-01 08:41:39

字符串.NET

2009-12-24 09:49:02

ADO.Net連接池

2010-02-02 11:27:16

C++字符串

2009-11-30 14:08:42

PHP字符串原理

2009-12-15 13:15:11

Ruby字符串

2011-07-21 15:36:40

JAVA

2010-09-13 15:06:40

sql server字

2024-03-04 15:05:37

2012-11-12 09:26:06

.NET多線程

2010-11-25 15:59:33

字符串.NET

2009-10-13 16:09:27

.NET字符串解析

2009-10-16 13:04:57

VB.NET字符串數組

2009-11-12 11:09:56

ADO.NET連接字符

2009-12-24 10:06:30

ADO.NET字符串

2010-01-06 10:07:35

.NET Framew

2015-10-27 09:41:16

Javaintern

2015-11-16 10:24:45

Java常量池字符串

2009-11-26 13:52:07

PHP字符串替換函數s

2009-09-01 17:41:53

C#截取字符串函數

2011-06-22 18:08:01

Qt TCP 字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费成年网站 | 黄色成人亚洲 | 日韩免费一级 | 欧美成人一级 | 91精品一区二区三区久久久久 | 黄色片a级 | 日本黄色大片免费 | 国产乱码精品一区二三赶尸艳谈 | 九九色九九 | 亚洲视频在线看 | 日韩欧美精品一区 | 精品不卡 | 国产精品综合一区二区 | 精品国产免费一区二区三区演员表 | 欧洲性生活视频 | 日韩视频免费在线 | 国产中文字幕亚洲 | 在线免费看黄 | 精品国产欧美一区二区三区成人 | 国产日韩欧美精品一区二区 | 久久精品免费观看 | 激情网五月天 | 欧美一区二区大片 | 欧美在线一级 | 精品欧美黑人一区二区三区 | 日韩三级在线观看 | 日韩免费看视频 | 97超碰在线免费 | www.狠狠操| 91新视频 | 成人欧美一区二区三区黑人孕妇 | 国产乱码精品一区二三赶尸艳谈 | 91精品久久久久久久久中文字幕 | 久久国内精品 | 在线免费观看视频黄 | 成人不卡视频 | 九色91视频 | 精品成人69xx.xyz | 黄视频网址 | 综合精品久久久 | 日本不卡视频在线播放 |