自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)例講解.NET字符串拘留池

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

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

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

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

網(wǎng)友 Ivony和 橫刀天笑的回貼引用資料指出拘留池是進(jìn)程范圍內(nèi)的,因此,有可能以下定義字串常量的代碼不會(huì)導(dǎo)致分配兩次內(nèi)存——因?yàn)榱硪粋€(gè)進(jìn)程可能已經(jīng)在拘留池中創(chuàng)建了“a”或 “ab”這兩個(gè)字串對(duì)象。

  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); 

我對(duì)此結(jié)論有點(diǎn)懷疑,于是到Google和MSDN中查找,發(fā)現(xiàn).NET字符串拘留池的有關(guān)資料很混亂。***決定自己編程作實(shí)驗(yàn)。

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

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

  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);  //動(dòng)態(tài)構(gòu)建的字串,不會(huì)放到拘留池中  
  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);  //強(qiáng)制加入拘留池  
  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.         } 

上述代碼運(yùn)行結(jié)果如下:

  1. j is not interned  
  2. j is interned 


不管你運(yùn)行多少次,也不管你是否同時(shí)運(yùn)行多個(gè)此程序的實(shí)例,始終結(jié)果是一致的,都是上面的結(jié)果。這說明進(jìn)程結(jié)束后,字串拘留池中的與此進(jìn)程所裝載的程序集相關(guān)的字串常量對(duì)象被清除。

現(xiàn)在取消對(duì)outerstr 變量的注釋,結(jié)果變?yōu)椋?/p>

  1. j is interned  
  2. j is interned 


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

還有一個(gè)問題,字串拘留池中的對(duì)象能否跨越不同進(jìn)程邊界共享?

編寫另一個(gè)測試程序:

  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.    } 

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

從這些實(shí)驗(yàn)是否可以得出以下結(jié)論?

當(dāng)進(jìn)程運(yùn)行結(jié)束,此進(jìn)程所加載的程序集中所定義的字串常量對(duì)象會(huì)被CLR從字串拘留池中移除。

因此,CLR字串拘留池中的字串常量是“進(jìn)程和程序集相關(guān)”的。

應(yīng)用程序所定義的字串常量對(duì)象在應(yīng)用程序域裝載程序集時(shí)被加入到字串拘留池中。

所以,字串拘留池中的字串對(duì)象不能跨進(jìn)程共享。不然,我們?nèi)绾谓忉尨a運(yùn)行的結(jié)果?

由于同一進(jìn)程中可以創(chuàng)建多個(gè)應(yīng)用程序域,我還沒有編寫代碼測試字串拘留池中的字串對(duì)象是否可以在屬于同一進(jìn)程的多個(gè)應(yīng)用程序域共享。此問題留待進(jìn)一步探索。

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

補(bǔ)充:

我的測試環(huán)境是Windows 7 + Visual Studio 2010 RC.

原文標(biāo)題:探討一下.NET字串拘留池

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

【編輯推薦】

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

2024-04-01 08:41:39

字符串.NET

2009-12-24 09:49:02

ADO.Net連接池

2009-11-30 14:08:42

PHP字符串原理

2010-02-02 11:27:16

C++字符串

2011-07-21 15:36:40

JAVA

2009-12-15 13:15:11

Ruby字符串

2010-09-13 15:06:40

sql server字

2024-03-04 15:05:37

2015-11-16 10:24:45

Java常量池字符串

2009-12-24 10:06:30

ADO.NET字符串

2010-01-06 10:07:35

.NET Framew

2015-10-27 09:41:16

Javaintern

2010-11-25 15:59:33

字符串.NET

2009-10-13 16:09:27

.NET字符串解析

2009-10-16 13:04:57

VB.NET字符串?dāng)?shù)組

2009-11-12 11:09:56

ADO.NET連接字符

2012-11-12 09:26:06

.NET多線程

2009-11-26 13:52:07

PHP字符串替換函數(shù)s

2009-09-01 17:41:53

C#截取字符串函數(shù)

2011-06-22 18:08:01

Qt TCP 字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)