c#中關於string的特性介紹以及註意事項

来源:https://www.cnblogs.com/xiaoXuZhi/archive/2019/11/07/XYH_String.html

string類型在我們實際項目開發中是一個最使用的類型,sting是一個引用類型,但是在實際使用中又有其特殊性所在,他是一個是:密封類、只讀類。在使用過程需要註意:避免不必要的記憶體開銷、避免不必要的裝箱操作。 ...


前言

  string類型在我們實際項目開發中是一個最使用的類型,string是一個引用類型這一點大家都知道,但是在實際使用過程中,大家會發現string和我們常見的引用類型使用還真不一樣,看下麵的一個簡單例子:

        static void Main(string[] args)
        {
            string hello = "my name is yuanHong";
            Console.WriteLine(string.Format("加工前的值:{0}", hello));

            ///// 對hello進行加工
            MachHello(hello);

            Console.WriteLine(string.Format("加工後的值:{0}", hello));

            Console.ReadLine();
        }

        /// <summary>
        /// 對hello進行加工
        /// </summary>
        /// <param name="hello"></param>
        private static void MachHello(string hello)
        {
            hello = string.Format("{0},Nice to meet you",hello);
        }

   程式運行的實際結果是:前後值都一樣沒有發生改變,如果按照引用類型看分析,也該是加工前後期值是不一樣的,那是為什麼呢?是不是有一種感覺字元串又像是值類型呢?好下麵我們就一起探討一下string的特殊性所在。

 

string內部實現簡介

  首先:是要說明的是string是被sealed修飾,不能繼承。

  其次:通過上面的string底層源碼,我們發現,在底層實現上實際上是用的char數組來實現,在初始化一個字元串時,系統都已經初始化了char數組的大小。

     string在創建時都固定化了大小,並且是只讀,不能修改

        在實際使用過程中,我們對string的改變,實際上在內部是重新創建了一個新的字元串

        字元串在作為函數參數傳遞時,實際上是拷貝了一份數據傳遞

  最後:現在我們在回頭看最開的程式結果我們就不難明白其為什麼會出現這樣的現象了

 

string使用註意點

 1、避免額外的存儲空間開銷

  避免用+號來拼接字元串:

  看下麵的一個實例:

string str1 = "yuan";
str1 = str1 + "hong";
//// 這樣會創建兩個字元串3個字元串對象

string strNew = "yuan" + "hong";/// 等效於 strNew="yuanhong",其實在編譯後也就是這個效果
//// 只會創建一個字元串對象

 

  再看一個實例:

 

//// 下麵是兩種方式實現返回一個字元串123

//// 方式1 
string v11="1";
string v22=v11+"2";
string v33=v22+"3";
retun v33;
//// 採用方式1:系統會創建5個string對象

//// 方式2
//// 採用方式2:系統只會創建4個string對象
string v1="1";
string v2="2";
string v3="3";
retun v1+v2+v3;

//// 從記憶體開銷誰行來說,明顯方式2要優於方式1

 

  在實際開發中,如果對字元串對象頻繁的拼接操作,建議使用StringBuilder

  當然c#中也有一隻簡化字元串拼接方式:String.Format ,其實其內部實現原理也就是 StringBuilder

  2、儘量少的裝箱

  直接上代碼實例:

 

string str1 = "yunghong" + 66;

string str2 = "yunghong" + 66.ToString();

//// 查看編譯後的代碼,發現第一行代碼,需要有一個裝箱操作,裝箱操作,需要增加不必要的記憶體開銷,第一:需要給值類型本身分佈記憶體,同時還要給類型指針和同板塊索引分配記憶體開銷

 

總結:

  在實際開發中需要註意一下幾點:

  1、避免裝箱操作

  2、避免使用+號拼接字元串

 


您的分享是我們最大的動力!

更多相關文章
  • Aspose.Words for .NET是用於執行各種文檔管理和操作任務,支持生成,修改,轉換,呈現和列印文檔,而無需在跨平臺應用程式中直接使用Microsoft Word。同時支持所有流行的Word處理文件格式,並允許將Word文檔導出或轉換為固定佈局文件格式和最常用的圖像、多媒體格式。 我們很 ...
  • 前言 隨著 .NET Core 3.1 的第二個預覽版本發佈,微軟正式將 C++/CLI 移植到 .NET Core 上,從此可以使用 C++ 編寫 .NET Core 的程式了。 由於目前僅有 MSVC 支持編譯此類混合代碼,並且由於涉及到非托管代碼,因此 C++/CLI 目前不能跨平臺,只支持 ...
  • 關於String為值類型還是引用類型的討論一直沒有平息,最近一直在研究性能方面的問題,今天再次將此問題進行一次明確。希望能給大家帶來點幫助,如果有錯誤請指出。 來看下麵例子: //值類型 int a = 1; int b = a; a = 2; Console.WriteLine("a is {0} ...
  • System.IO.Pipelines是一個新的庫,旨在簡化在.NET中執行高性能IO的過程。它是一個依賴.NET Standard的庫,適用於所有.NET實現。 Pipelines誕生於.NET Core團隊,為使Kestrel成為業界最快的Web伺服器之一。最初從作為Kestrel內部的實現細節 ...
  • 前言 最近在做智能家居平臺,考慮到家居的控制需要快速的響應於是打算使用redis緩存。一方面減少資料庫壓力另一方面又能提高響應速度。項目中使用的技術棧基本上都是大家熟悉的springboot全家桶,在springboot2.x以後操作redis的客戶端推薦使用lettuce(生菜)取代jedis。 ...
一周排行
  • static void Main(string[] args) { string url = "https://go.microsoft.com/fwlink/?linkid=2108895&amp;clcid=0x409"; DownloadBigFile(new Uri(url), "ssms.... ...
  • 1. 使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作 什麼是REST 什麼是REST REST一詞最早是在2000年,由Roy Fielding在他的博士論文《Architectural Styles and the Design of Network-base ...
  • wpf 兩個自定義控制項 一個是IP控制項,一個滑動條。先看下效果圖 IPControl 1、實際工作中有時需要設置IP信息,就想著做一個ip控制項。效果沒有window自帶的好,需要通過tab切換。但也能滿足使用。廢話不多說直接上代碼 IPControl.xaml IPControl.xaml.cs 2 ...
  • 近期和幾位做嵌入式開發的朋友閑聊過程中,一位朋友抱怨到:這C#太難用了,我想在N個窗體(或者是N個用戶組件之間)傳遞值都搞不定,非得要定義一個全局變數來存儲,然後用定時器來刷新值,太Low了。我急切的回答道:這很簡單,不就是委托的事嘛。那你來一個示例啊:朋友道。此為這篇博客的起因,所以此篇博客對於有 ...
  • 在面對對象編程中,類的三大特性分別為封裝,繼承,多態。其中多態的具體實現,依賴於三個方法,也就是虛方法,抽象類和介面。 多態的具體作用是什麼呢?或者說多態的存在有什麼意義呢?多態的存在有效的降低了程式的耦合度,在使用的時候,不僅可以表現大家都有的共性,還能在必要的時候突出一些特殊的的個性。 那麼如何 ...
  • [toc] 前言 在之前已經提到過,公用類庫Util已經開源,目的一是為了簡化開發的工作量,畢竟有些常規的功能類庫重覆率還是挺高的,二是為了一起探討學習軟體開發,用的人越多問題也就會越多,解決的問題越多功能也就越完善, 倉庫地址: "April.Util_github" , "April.Util_ ...
  • 【ASP.NET Core學習】在ASP.NET Core 種使用Entity Framework Core介紹,包括如何添加Entity Framwork Core,創建模型和遷移到資料庫,查詢數據,保存數據,使用事務,處理併發衝突 ...
  • 環境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔術方法並巧妙構造特殊屬性調用一系列函數或類方法以執行某種敏感操作的調用堆棧反序列化常用魔法函數前言我所理解的 POP Chain:利用魔 ...
  • 當創建隊列jobs、監聽器或訂閱伺服器以推送到隊列中時,您可能會開始認為,一旦分派,隊列工作器決定如何處理您的邏輯就完全由您自己決定了。 嗯……並不是說你不能從作業內部與隊列工作器交互,但是通常情況下,哪怕你做了,也是沒必要的。 這個神奇的騷操作的出現是因為“InteractsWithQueue”這 ...
  • 在說正題之前先解釋一下交換機模式是個籠統的稱呼,它不是一個單獨的模式(包括了訂閱模式,路由模式和主題模式),交換機模式是一個比較常用的模式,主要是為了實現數據的同步。 首先,說一下訂閱模式,就和字面上的意思差不多主要就是一個生產者,多個消費者,同一個消息被多個消費者獲取,先看一下官網的圖示 整體執行 ...
x