91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET中的字符串駐留池是什么

發布時間:2022-03-28 09:16:21 來源:億速云 閱讀:121 作者:小新 欄目:開發技術

小編給大家分享一下.NET中的字符串駐留池是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在.NET中,對于相同的字符串,.NET會將它們指向同一個地址,它們是相同的實例。.NET中的字符串并不會更新,當更改一個字符串變量時,由于字符串的不可變性,.NET實際上是新創建一個字符串,而將變量地址指向新創建的字符串地址。

看下面的一個例子:

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

程序執行結果

.NET中的字符串駐留池是什么

從執行結果我們可以得出結論:str1和str2指向同一個內存對象,它們是同一個實例。

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

看下面一個例子

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的內容是否相同:{tf1}");
            Console.ReadKey();
        }
    }
}

程序執行結果

.NET中的字符串駐留池是什么

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

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

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 = string.Intern(sb.ToString());
            bool tf = Object.ReferenceEquals(str1, str2);
            // 輸出True,因為檢查駐留池時,發現字符串已經存在
            Console.WriteLine(tf);
            bool tf1 = str1 == str2;
            Console.WriteLine($"str1和str2的內容是否相同:{tf1}");
            Console.ReadKey();
        }
    }
}

程序執行結果

.NET中的字符串駐留池是什么

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

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

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

以上是“.NET中的字符串駐留池是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清远市| 安溪县| 潮安县| 马鞍山市| 武穴市| 兰州市| 涞水县| 陆川县| 永泰县| 泾源县| 渝中区| 常山县| 大渡口区| 永新县| 平舆县| 正安县| 西吉县| 临汾市| 松原市| 濮阳市| 郑州市| 奉新县| 华容县| 肥城市| 田阳县| 峡江县| 山西省| 张家口市| 伊通| 临夏县| 兴国县| 德清县| 和田县| 资源县| 葫芦岛市| 星座| 色达县| 交城县| 三穗县| 太谷县| 曲阜市|