一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

深入理解string和如何高效地使用string

  一個月以前我寫了一篇討論字符串的駐留(string interning)的文章,我今天將會以字符串的駐留為基礎(chǔ),進一步來討論.NET中的string。string interning的基本前提是string的恒定性(immutability),即string一旦被創(chuàng)建將不會改變。我們就先來談?wù)剆tring的恒定性。

  一、string是恒定的(immutable)

  和其他類型比較,string最為顯著的一個特點就是它具有恒定不變性:我們一旦創(chuàng)建了一個string,在managed heap 上為他分配了一塊連續(xù)的內(nèi)存空間,我們將不能以任何方式對這個string進行修改使之變長、變短、改變格式。所有對這個string進行各項操作(比如調(diào)用ToUpper獲得大寫格式的string)而返回的string,實際上另一個重新創(chuàng)建的string,其本身并不會產(chǎn)生任何變化。

  String的恒定性具有很多的好處,它首先保證了對于一個既定string的任意操作不會造成對其的改變,同時還意味著我們不用考慮操作string時候出現(xiàn)的線程同步的問題。在string恒定的這些好處之中,我覺得最大的好處是:它成就了字符串的駐留。

  CLR通過一個內(nèi)部的interning table保證了CLR只維護具有不同字符序列的string,任何具有相同字符序列的string所引用的均為同一個string對象,同一段為該string配分的內(nèi)存快。字符串的駐留極大地較低了程序執(zhí)行對內(nèi)存的占用。

  對于string的恒定性和字符串的駐留,還有一點需要特別指出的是:string的恒定性不單單是針對某一個單獨的AppDomain,而是針對一個進程的。

  二、String可以跨AppDomain共享的(cross-appDomain)

  我們知道,在一個托管的環(huán)境下,Appdomain是托管程序運行的一個基本單元。AppDomain為托管程序提供了良好的隔離機制,保證在同一個進程中的不同的Appdomain不可以共享相同的內(nèi)存空間。在一個Appdomain創(chuàng)建的對象不能被另一個Appdomain直接使用,對象在AppDomain之間傳遞需要有一個Marshaling的過程:對象需要通過by reference或者by value的方式從一個Appdomain傳遞到另一個Appdomain。具體內(nèi)容可以參照我的另一篇文章:用Coding證明Appdomain的隔離性。

  但是這里有一個特例,那就是string。Appdomain的隔離機制是為了防止一個Application的對內(nèi)存空間的操作對另一個Application 內(nèi)存空間的破壞。通過前面的介紹,我們已經(jīng)知道了string是恒定不變的、是只讀的。所以它根本不需要Appdomain的隔離機制。所以讓一個恒定的、只讀的string被同處于一個進程的各個Application共享是沒有任何問題的。

String的這種跨AppDomain的恒定性成就了基于進程的字符串駐留:一個進程中各個Application使用的具有相同字符序列的string都是對同一段內(nèi)存的引用。我們將在下面通過一個Sample來證明這一點。

  三、證明string垮AppDomain的恒定性

  在寫這篇文章的時候,我對如何證明string跨AppDomain的interning,想了好幾天,直到我偶然地想到了為實現(xiàn)線程同步的lock機制。

  我們知道在一個多線程的環(huán)境下,為了避免并發(fā)操作導(dǎo)致的數(shù)據(jù)的不一致性,我們需要對一個對象加鎖來阻止該對象被另一個線程 操作。相反地,為了證明兩個對象是否引用的同一個對象,我們只需要在兩個線程中分別對他們加鎖,如果程序執(zhí)行的效果和對同一個對象加鎖的情況完全一樣的話,那么就可以證明這兩個被加鎖的對象是同一個對象?;谶@樣的原理我們來看看我們的Sample:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Artech.ImmutableString
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            AppDomain appDomain1 
= AppDomain.CreateDomain("Artech.AppDomain1");
            AppDomain appDomain2 
= AppDomain.CreateDomain("Artech.AppDomain2");

            MarshalByRefType marshalByRefObj1 
= appDomain1.CreateInstanceAndUnwrap(
"Artech.ImmutableString""Artech.ImmutableString.MarshalByRefType"as MarshalByRefType;
            MarshalByRefType marshalByRefObj2 
= appDomain2.CreateInstanceAndUnwrap(
"
Artech.ImmutableString""Artech.ImmutableString.MarshalByRefType"as MarshalByRefType;

            marshalByRefObj1.StringLockHelper 
= "Hello World";
            marshalByRefObj2.StringLockHelper 
= "Hello World";

            Thread thread1 
= new Thread(new ParameterizedThreadStart(Execute));
            Thread thread2 
= new Thread(new ParameterizedThreadStart(Execute));

            thread1.Start(marshalByRefObj1);
            thread2.Start(marshalByRefObj2);

            Console.Read();            
        }


        
static void Execute(object obj)
        

            MarshalByRefType marshalByRefObj 
= obj as MarshalByRefType;
            marshalByRefObj.ExecuteWithStringLocked();
        }

    }


    
class MarshalByRefType : MarshalByRefObject
    
{
        
Private Fields

        
Public Properties

        
Public Methods
    }

}

NET技術(shù)深入理解string和如何高效地使用string,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产午夜精品视频 | 久久伊人中文字幕 | 亚洲第一在线 | 四虎影免看黄 | 成人a视频 | 九一国产| 成人在线免费 | 欧美五级在线观看视频播放 | 色在线视频免费 | 91在线视频国产 | 精品日韩欧美一区二区三区 | 久久99久久99精品 | 国产91精品福利在线观看 | 一色屋成人免费精品网站 | 国产精品日韩欧美久久综合 | 福利片欧美 | 国产原创中文字幕 | 国产三级网站 | 国产亚洲欧美另类久久久 | 91精品国产高清久久久久久io | 日韩精品永久免费播放平台 | 久久精品国产一区二区 | 国产成人精品视频午夜 | 中文字幕精品视频在线观 | 牛牛碰在线 | 亚洲一级毛片 | 美女张开腿给人网站 | xxxx人成高清免费图片 | 国产精品久久久久久久久ktv | 黄网免费在线观看 | 久久91精品国产91久 | 色综合天天色综合 | 久久综合香蕉久久久久久久 | 大象蕉国产情侣 | 中文成人在线视频 | 在线播放亚洲 | 国产精品热久久毛片 | 亚洲黄v| 激情五月激情综合 | 久久美女精品 | 欧美岛国大片 |