首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 預處理器指令與字串處理:#region 代碼摺疊、String 與 StringBuilder 深度對比

     編輯:關於C#

良好的代碼組織與高效的字串操作是開發品質的關鍵。本文介紹 #region 預處理器指令提升代碼可讀性,並深度對比 String(不可變)與 StringBuilder(可變)的特性、方法與效能差異。

一、#region 代碼區塊摺疊

#region 資料庫連線與查詢
public void Insert(string sql)
{
    MySqlConnection conn = new MySqlConnection();
    conn.ConnectionString = mysqlconstr;
    MySqlCommand cmd = new MySqlCommand(sql, conn);
    OpenConnection(conn);
    // ...
}
#endregion

效果:Visual Studio 編輯器左側出現 +/- 摺疊圖示,點擊可收合/展開區塊。編譯時 #region/#endregion 完全移除,不影響 IL。

適用場景

  • 邏輯模組分組:#region 初始化、#region 事件處理、#region 私有方法
  • 大量生成代碼區隔
  • 暫時隱藏穩定不常修改的代碼段

注意

  • 不支援巢狀摺疊(VS 2022+ 已支援)
  • 過度使用反而降低可讀性,建議配合「區域大綱」功能
  • 不影響編譯、除錯、部署

二、String 不可變字串核心方法

string 別名 System.String,不可變參考型別。所有「修改」操作實則回傳新實例。

string s = "Larger than me";

Console.WriteLine(s.Clone());           // 回傳自身引用
Console.WriteLine(s.CompareTo("Larger than me")); // 0 相等
Console.WriteLine(s.Contains("than"));  // True
Console.WriteLine(s.EndsWith("me"));    // True
Console.WriteLine(s.Equals("Larger"));  // False
Console.WriteLine(s.IndexOf('L'));      // 0
Console.WriteLine(s.Insert(1, "you"));  // "Lyouarger than me"
Console.WriteLine(s.LastIndexOf('m'));  // 13
Console.WriteLine(s.Length);            // 14
Console.WriteLine(s.PadLeft(20, 'y'));  // "yyyyyyLarger than me"
Console.WriteLine(s.PadRight(20, 'x')); // "Larger than mexxxxxx"
Console.WriteLine(s.Remove(5));         // "Larger"
Console.WriteLine(s.Replace('a', 'y')); // "Lyrger thyn me"
Console.WriteLine(s.Split(' '));        // 字串陣列
Console.WriteLine(s.StartsWith("Lar")); // True
Console.WriteLine(s.Substring(2, 6));   // "rger t"
Console.WriteLine(s.ToCharArray());     // char[]
Console.WriteLine(s.ToLower());         // "larger than me"
Console.WriteLine(s.ToUpper());         // "LARGER THAN ME"
Console.WriteLine(s.Trim());            // 移除首尾空白
Console.WriteLine(s.TrimEnd('m','e'));// "Larger than "

三、StringBuilder 可變字串高效操作

適用於大量字串拼接、修改場景,避免產生大量中間 String 物件造成 GC 壓力。

StringBuilder sb = new StringBuilder("Larger than me"); // 容量 16 或字串長度
StringBuilder sb2 = new StringBuilder("Hello", 100);   // 指定初始容量

Console.WriteLine(sb.Append(" new"));       // 尾端追加
Console.WriteLine(sb.AppendLine(" loveme")); // 追加並換行
Console.WriteLine(sb.Capacity);             // 當前容量
Console.WriteLine(sb.EnsureCapacity(20));   // 確保最小容量
Console.WriteLine(sb.Insert(0, "insert"));  // 指定位置插入
Console.WriteLine(sb.Length);               // 當前長度
Console.WriteLine(sb.MaxCapacity);          // 最大容量 (Int32.MaxValue)
Console.WriteLine(sb.Remove(1, 2));         // 移除指定範圍
Console.WriteLine(sb.Replace('e', 'y'));    // 字元替換
Console.WriteLine(sb.ToString());           // 轉為 String

四、效能對比與選擇指南

場景推薦理由
少量拼接(<5次)String + / String.Concat編譯器優化,可讀性佳
迴圈/大量拼接StringBuilder避免 O(N²) 物件分配
固定模板格式化string.Format / $""語意清晰
高效能緩衝區StringBuilder + 容量預估減少擴容複製
跨執行緒String (不可變天生安全)StringBuilder 非執行緒安全

五、關鍵差異總結

  • 記憶體:String 修改產生新物件;StringBuilder 就地修改內部緩衝區
  • 繼承:String 密封類別;StringBuilder 可繼承(罕見)
  • 介面:String 實作 IEnumerable<char>、IComparable、IEquatable;StringBuilder 僅 ISerializable
  • 索引器:String 唯讀 this[int];StringBuilder 可讀寫 this[int]
  • 字串池:String 字面常數駐留;StringBuilder 無此機制

六、現代化補充

  • string.Create、StringBuilder.AppendInterpolatedStringHandler (.NET 6+) 高效格式化
  • Utf8StringBuilder (System.Text.Primitives) 直接操作 UTF-8 位元組
  • 大量文字處理考慮 System.IO.Pipelines 或 StreamWriter 串流寫入

根據場景選擇 String 或 StringBuilder,並善用 #region 組織代碼結構,是編寫高品質 C# 代碼的基本素養。

String 方法輸出 StringBuilder 方法輸出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved