良好的代碼組織與高效的字串操作是開發品質的關鍵。本文介紹 #region 預處理器指令提升代碼可讀性,並深度對比 String(不可變)與 StringBuilder(可變)的特性、方法與效能差異。
#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 私有方法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 "
適用於大量字串拼接、修改場景,避免產生大量中間 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 非執行緒安全 |
IEnumerable<char>、IComparable、IEquatable;StringBuilder 僅 ISerializablethis[int];StringBuilder 可讀寫 this[int]string.Create、StringBuilder.AppendInterpolatedStringHandler (.NET 6+) 高效格式化Utf8StringBuilder (System.Text.Primitives) 直接操作 UTF-8 位元組System.IO.Pipelines 或 StreamWriter 串流寫入根據場景選擇 String 或 StringBuilder,並善用 #region 組織代碼結構,是編寫高品質 C# 代碼的基本素養。