最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET中的字符串駐留池介紹

 更新時(shí)間:2022年03月26日 11:54:52   作者:.NET開發(fā)菜鳥  
這篇文章介紹了.NET中的字符串駐留池,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在.NET中,對于相同的字符串,.NET會(huì)將它們指向同一個(gè)地址,它們是相同的實(shí)例。.NET中的字符串并不會(huì)更新,當(dāng)更改一個(gè)字符串變量時(shí),由于字符串的不可變性,.NET實(shí)際上是新創(chuàng)建一個(gè)字符串,而將變量地址指向新創(chuàng)建的字符串地址。

看下面的一個(gè)例子:

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "hello";
            string str2 = "hello";
            bool tf = object.ReferenceEquals(str1, str2);
            Console.WriteLine(tf);
            Console.ReadKey();
        }
    }
}

程序執(zhí)行結(jié)果

從執(zhí)行結(jié)果我們可以得出結(jié)論:str1和str2指向同一個(gè)內(nèi)存對象,它們是同一個(gè)實(shí)例。

在.NET中,CLR默默地維護(hù)了一個(gè)叫做駐留池(Intern Pool)的表。這個(gè)表記錄了所有在代碼中使用字面量聲明的字符串實(shí)例的引用。這說明使用字面量聲明的字符串會(huì)進(jìn)入駐留池,而其他方式聲明的字符串則不會(huì)進(jìn)入駐留池,也就不會(huì)自動(dòng)享受到CLR防止字符串冗余的機(jī)制的好處了。

看下面一個(gè)例子

using System;
using System.Text;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            StringBuilder sb = new StringBuilder();
            sb.Append("he").Append("llo");
            string str1 = "hello";
            string str2 = sb.ToString();
            bool tf = Object.ReferenceEquals(str1, str2);
            Console.WriteLine(tf);
            bool tf1 = str1 == str2;
            Console.WriteLine($"str1和str2的內(nèi)容是否相同:{tf1}");
            Console.ReadKey();
        }
    }
}

程序執(zhí)行結(jié)果

這里輸出了False。雖然str1和str2是相同的字符串,但是由于str2不是通過字面量的方式聲明的,CLR在為ToString()返回值分配內(nèi)存時(shí),并不會(huì)到駐留池中去檢查是否有值為"hello"的字符串已經(jīng)存在了,所以也不會(huì)讓str2指向駐留池中的對象。

如果希望強(qiáng)制CLR檢查駐留池,以避免冗余的字符串副本,String類的設(shè)計(jì)者提供了一個(gè)名為Intern的類方法。下面是該方法的一個(gè)實(shí)例

using System;
using System.Text;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            StringBuilder sb = new StringBuilder();
            sb.Append("he").Append("llo");
            string str1 = "hello";
            // 在這里強(qiáng)制檢查字符串駐留池
            string str2 = string.Intern(sb.ToString());
            bool tf = Object.ReferenceEquals(str1, str2);
            // 輸出True,因?yàn)闄z查駐留池時(shí),發(fā)現(xiàn)字符串已經(jīng)存在
            Console.WriteLine(tf);
            bool tf1 = str1 == str2;
            Console.WriteLine($"str1和str2的內(nèi)容是否相同:{tf1}");
            Console.ReadKey();
        }
    }
}

程序執(zhí)行結(jié)果

Intern方法接受一個(gè)字符串作為參數(shù),它會(huì)在駐留池中檢查是否已經(jīng)存在參數(shù)所表示的字符串。如果存在,則返回那個(gè)駐留池中的字符串的引用;否則向駐留池中加入一個(gè)新的表示相同值的字符串,并返回這個(gè)字符串的引用。

不過要注意的是,就算Intern方法在駐留池中找到了相同值的字符串,也不能讓您省卻一次字符串內(nèi)存分配的操作,因?yàn)樽鳛閰?shù)的字符串已經(jīng)被分配了一次內(nèi)存了。使用Intern方法的好處在于,如果Intern方法在駐留池中找到了相同值的字符串,此時(shí)雖然在內(nèi)存中存在兩份該字符串的副本(一份是參數(shù),一份是駐留池中的),但是隨著時(shí)間的流逝,參數(shù)所引用的那個(gè)副本會(huì)被垃圾回收掉,這樣對于該字符串內(nèi)存中就不存在冗余了。

當(dāng)你的程序中存在某個(gè)方法,可以根據(jù)不同的上下文環(huán)境創(chuàng)建并返回一個(gè)很長的字符串,而在程序運(yùn)行的過程中它會(huì)經(jīng)常返回同樣的字符串時(shí),你可能就要考慮使用Intern方法來提高內(nèi)存的使用率了。不過同樣值得注意的是,使用Intern方法讓一個(gè)字符串存留于駐留池中也有一個(gè)副作用:即使已經(jīng)不存在任何其它引用指向駐留池中的字符串了,這個(gè)字符串仍然不一定會(huì)被垃圾回收掉。也就是說即使駐留池中的字符串已經(jīng)沒有用處了,它可能也要等到CLR終結(jié)時(shí)才被銷毀。當(dāng)你使用Intern方法的時(shí)候,也應(yīng)該考慮到這個(gè)特殊的行為。

到此這篇關(guān)于.NET字符串駐留池的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#使用正則表達(dá)式實(shí)例

    C#使用正則表達(dá)式實(shí)例

    正則表達(dá)式(regular expression)是用來快速、高效地處理文本數(shù)據(jù)的工具。被處理的文本可以小到一個(gè)電子郵件地址,也可以大到一個(gè)多行文本輸入框中的文本數(shù)據(jù)。正則表達(dá)式不僅可用來確認(rèn)一段文本是否與一個(gè)預(yù)定義的模式相匹配,還可以用于從文本中抽取符合某一模式的數(shù)據(jù)。
    2008-04-04
  • .Net?Core微服務(wù)rpc框架GRPC通信實(shí)際運(yùn)用

    .Net?Core微服務(wù)rpc框架GRPC通信實(shí)際運(yùn)用

    這篇文章介紹了.Net?Core微服務(wù)rpc框架GRPC通信實(shí)際運(yùn)用,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • .Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)

    .Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)

    這篇文章介紹了.Net設(shè)計(jì)模式之建造者、生成器模式(Builder),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • .Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge)

    .Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge)

    這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 詳解Asp.net 5中的ApplicationBuilder

    詳解Asp.net 5中的ApplicationBuilder

    這篇文章介紹了Asp.net 5中的ApplicationBuilder,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • ASP.NET中HiddenField隱藏域控件的使用方法

    ASP.NET中HiddenField隱藏域控件的使用方法

    本文主要介紹ASP.NET中HiddenField控件的基礎(chǔ)使用方法、事件以及配合javascript的一些使用,希望能幫到大家。
    2016-04-04
  • asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信

    asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信

    這篇文章介紹了asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • asp.net UpdaeProgress的簡單用法

    asp.net UpdaeProgress的簡單用法

    這個(gè)控件相比其他控件,屬性少 使用簡單,就先把這個(gè)控件的一般使用方法簡單紀(jì)錄下
    2008-10-10
  • ASP.NET中Label控件用法詳解

    ASP.NET中Label控件用法詳解

    本文主要介紹Label控件的詳細(xì)用法,雖然很基礎(chǔ),但是我感覺很有必要,希望對大家有所幫助。
    2016-04-04
  • .NET設(shè)計(jì)模式之UML類圖介紹

    .NET設(shè)計(jì)模式之UML類圖介紹

    這篇文章介紹了.NET設(shè)計(jì)模式之UML類圖,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

巴彦县| 吕梁市| 鹤岗市| 靖西县| 廉江市| 乌恰县| 襄汾县| 岳西县| 巴塘县| 沁源县| 苏州市| 淄博市| 汝城县| 宁阳县| 台山市| 浏阳市| 涟源市| 西平县| 准格尔旗| 睢宁县| 鹰潭市| 长寿区| 云龙县| 八宿县| 拉孜县| 高淳县| 塘沽区| 恩施市| 旅游| 乡城县| 敦化市| 容城县| 库车县| 常山县| 哈密市| 喀喇| 凤冈县| 老河口市| 辉南县| 龙泉市| 开阳县|