博客 / 列表

唐青楓 - 深入理解 Volatile:C#.NET 內存可見性與有序性

簡介 Volatile 是 C# 中處理內存可見性和指令重排序的關鍵機制,它提供了對內存訪問的精細控制。在併發編程中,volatile 關鍵字和 Volatile 類都是解決共享變量可見性問題的重要工具。 為什麼需要volatile? CPU 緩存導致的 “內存可見性” 問題 現代 CPU 為提升性能,會將頻繁訪問的變量緩存到核心專屬的緩存(L1/L2/L3)中,而非每次都讀寫主內存。這會導致:

c# , .net

唐青楓 - 你真的理解 Interlocked.Exchange 嗎?C#.NET 原子操作詳解

什麼是 Interlocked.Exchange? Interlocked.Exchange 是 System.Threading.Interlocked 類中的靜態方法,用於原子地替換(交換)一個變量的值,並返回該變量的舊值。整個讀-改-寫過程是不可分割的,在多線程環境中保證線程安全。 核心作用:無鎖地(lock-free)將變量設置為新值,同時獲取舊值。 常見重載: public st

c# , .net

唐青楓 - 深入理解 System.Lazy<T>:C#.NET 延遲初始化與線程安全

什麼是 LazyT? System.LazyT 是 .NET Framework 4.0 引入(位於 System 命名空間)的泛型類,用於實現線程安全的延遲初始化(Lazy Initialization)。它確保一個昂貴的對象或資源只在第一次真正需要時才被創建,並且在多線程環境下保證初始化只發生一次。 核心特性: 延遲計算:值的創建被推遲到第一次訪問 .Value 屬性時。

c# , .net

唐青楓 - 深入理解 Interlocked.CompareExchange:C#.NET 原子操作核心原理

什麼是 Interlocked.CompareExchange? Interlocked.CompareExchange 是 .NET 中 System.Threading.Interlocked 類的最核心原子操作方法。它執行比較並交換(Compare-And-Swap,簡稱 CAS) 操作:在多線程環境下,安全地將變量的值與預期值比較,如果相等則替換為新值,整個過程原子不可中斷。 關鍵特性

c# , .net

唐青楓 - 深入理解 Parallel.ForEachAsync:C#.NET 並行調度模型揭秘

簡介 ┌──────────────┐ │ 數據源枚舉器 │ IEnumerable / IAsyncEnumerable └──────┬───────┘ ↓ ┌────────────────────┐ │ 併發調度器(Pump) │ ← 控制最多 N 個任務 └──────┬─────────────┘ ↓ ┌────────────────────┐ │ a

c# , .net

唐青楓 - 深入理解 C#.NET Parallel:並行編程的正確打開方式

簡介 Parallel 並行編程是 .NET 中利用多核 CPU 進行併發執行的編程模型,主要通過 System.Threading.Tasks 命名空間中的 Parallel 類實現。它允許將任務分解成多個子任務,在多個線程上同時執行,以加速 CPU 密集型操作(如循環計算、數據處理)。 核心組件: Parallel 類:提供靜態方法如 Parallel.For、Parallel.ForEa

c# , .net

唐青楓 - 深入理解 C#.NET Interlocked.Increment:原子操作的核心

簡介 Interlocked.Increment 是 .NET 中一個重要的線程安全操作方法,用於以原子方式遞增變量的值。它位於 System.Threading 命名空間中,提供了一種輕量級的線程同步機制。 這些方法包括: 方法 作用 Increment(ref int location) 原子 +1 Decrement(

c# , .net

唐青楓 - 深入理解 C#.NET IEnumerable<T>:一切集合的起點

簡介 IEnumerableT 是 .NET 中最核心的接口之一,位於 System.Collections.Generic 命名空間中。它代表一個可枚舉的集合,支持在集合上進行迭代操作。 IEnumerableT 是什麼? public interface IEnumerableout T : IEnumerable { IEnumeratorT GetEnumerator(); }

c# , .net

唐青楓 - C#.NET 索引器完全解析:語法、場景與最佳實踐

簡介 索引器(Indexer)是 C# 中的一種特殊屬性,它允許類或結構體像數組一樣使用索引語法(例如 obj[0])來訪問或修改對象內部的成員。簡單來説,它將對象的實例視為“可索引的集合”,提供類似於數組的訪問方式。 核心特性: 類似於屬性(Property),但帶有參數(通常是索引值,如整數或字符串)。 支持 get 和 set 訪問器,與屬性類似。 可以重載

c# , .net

唐青楓 - C#.NET AsyncLock 完全解析:async/await 下的併發控制方案

簡介 AsyncLock 是一種自定義的異步互斥鎖(Mutex Lock),專為異步編程場景設計,用於在 async/await 方法中實現線程安全的互斥訪問。它彌補了 .NET 中傳統 lock 語句(基於 Monitor)的不足,因為 lock 是同步阻塞的,在異步環境中會阻塞線程池線程,導致性能下降或死鎖風險。 核心原理:AsyncLock 通常基於 SemaphoreSlim(1, 1

c# , .net

唐青楓 - 一篇搞定 dotnet ef:EF Core 常用命令與實戰指南

基礎知識 項目 説明 EF Core .NET 的 ORM 框架,支持 Code First、Database First。 dotnet ef 一個 CLI 工具,用於管理 EF Core 遷移、數據庫操作。 安裝方式 通常安裝在項目中(推薦): dotnet add pac

c# , .net

唐青楓 - 深入理解 C#.NET record:不可變對象與值語義的現代實踐

簡介 record 是 C# 9 引入的新引用類型(Reference Type),專門用於數據導向(Data-Oriented)的不可變對象。特別適合用於表示不可變的數據傳輸對象(DTO)、值對象和領域模型。 ⚡ 主要特性: 內置值相等性:兩個 record 實例如果屬性值相同,則被認為相等(值相等)。 簡潔語法:通過“主構造函數”直接定義屬性。 不可變設計:推薦使用 init 訪問器,

c# , .net

唐青楓 - C#.NET struct 全解析:什麼時候該用值類型?

簡介 struct 是 值類型(Value Type),用於封裝一組相關的數據。 與類(class)相比,結構體通常更輕量,適用於小型、短生命週期的對象。 ⚡ 關鍵特點: 存儲在 棧(stack)上(也可能嵌套在堆中,但本質仍是值類型)。 按值傳遞(賦值/參數傳遞時會複製整個結構)。 無需垃圾回收(GC),生命週期由作用域決定。 可包含字段、屬性、方法、構造函數、運算符重載等。

c# , .net

唐青楓 - C#.NET ref struct 深度解析:語義、限制與最佳實踐

簡介 ref struct 是 C# 7.2 引入的一種特殊結構體類型, 它與普通 struct 的最大區別是 嚴格限制其分配位置: ref struct 只能分配在棧(stack)上,不能分配在堆(heap)上。 ⚡ 設計初衷 提高性能:棧分配比堆分配快,並且無需 GC 回收。 提供安全的內存訪問:保證生命週期受控,防止內存泄漏和懸空引用。 適用於需要直接操作內存的場景,例如 Sp

c# , .net

唐青楓 - 告別頻繁 GC:C#.NET PooledList 的設計與使用場景

簡介 PooledListT 是 高性能集合類型,由 Collections.Pooled 提供,用於替代 ListT,通過 對象池 (ArrayPoolT) 複用內部數組來減少 GC(垃圾回收)壓力。 ⚡ 核心目標: 在需要頻繁創建/銷燬 ListT 的場景下,PooledListT 通過數組租借與歸還的機制避免頻繁分配內存,從而提升性能並降低 GC 負擔。 安裝 dotnet add p

c# , .net

唐青楓 - 深入理解 C#.NET 運算符重載:語法、設計原則與最佳實踐

簡介 運算符重載是 C# 提供的一種特性,允許開發者為 自定義類型(類/結構體) 定義運算符的行為。 例如,可以讓 Vector 對象支持 + 運算,而不是僅限於基本類型(int、double 等)。 💡 本質:運算符重載是一個 帶有 operator 關鍵字的靜態方法,通過自定義方法改變運算符的操作行為。 適用範圍與限制 特性 説明 可重

c# , .net

唐青楓 - LINQ 新時代:CountBy、AggregateBy 深度解析(含對比 GroupBy)

簡介 在 .NET 8 之前,LINQ 沒有內置 CountBy 和 AggregateBy 方法,但在 .NET 9(C# 13) 中,LINQ 正式引入了這兩個新擴展方法,極大簡化了數據分組和聚合的寫法。 背景 傳統的分組統計一般使用 GroupBy: var query = list.GroupBy(x = x.Category) .Select(g = ne

c# , .net

唐青楓 - C# Params Collections 詳解:比 params T[] 更強大的新語法

簡介 Params Collections 是 C# 12 中引入的新特性,它擴展了傳統的 params 關鍵字功能,使其不僅支持數組,還能支持各種集合類型。這個特性使得方法能夠接受可變數量的參數,並且這些參數可以自動轉換為指定的集合類型。 關鍵特點: 可變參數:調用者可以傳遞任意數量的參數(包括零個)。 類型安全:params 參數是強類型的,編譯器確保參數類型匹配。 單一 params

c# , .net

唐青楓 - 一次弄懂 C# 內聯數組(Inline Array):高性能數組的新選擇

簡介 內聯數組是 C# 12 和 .NET 8 中引入的一個高級特性,它允許開發者創建固定大小的、在棧上分配或內聯在結構體中的數組。這個特性主要用於高性能場景,可以避免堆分配和垃圾回收的開銷。 性能優勢 內聯數組的主要優勢在於性能: 棧上分配:避免堆分配和垃圾回收 內存局部性:元素在內存中連續存儲,提高緩存命中率 減少指針間接尋址:直接訪問元素,不需要通過數組對象引用 內聯數組 vs 傳

c# , .net

唐青楓 - 一次看懂 C# TimeSpan:時間差操作的完整指南

簡介 TimeSpan 是 .NET 中用於表示時間間隔或持續時間的重要結構體。它提供了豐富的方法和屬性來處理時間跨度,從幾毫秒到幾百萬天都可以精確表示。 概念與特性 TimeSpan 表示一個時間間隔(時間段),而不是具體的時間點。 特性 説明 命名空間 System 結構類型 struct(值類型)

c# , .net

唐青楓 - C# 列表模式(List Patterns)深度解析:模式匹配再進化!

簡介 列表模式是一種模式匹配機制,允許檢查一個集合(例如數組、ListT、或任何實現了 IEnumerableT 的類型)的元素數量、順序以及每個元素的內容。 在 C# 10 之前,模式匹配 (Pattern Matching) 已支持 switch 表達式、類型模式、屬性模式等,但對列表或序列的匹配還不夠直觀。 C# 11 引入 列表模式(List Patterns),讓開發者可以:

c# , .net

唐青楓 - C# 泛型數學:解鎖真正的類型安全數值運算

簡介 C# 11 和 .NET 7 引入了泛型數學(Generic Math)功能,這是一個革命性的特性,允許開發者編寫適用於多種數值類型的通用數學算法。這是通過靜態抽象接口成員實現的,解決了長期以來在泛型代碼中處理數學運算的難題。 為什麼需要“泛型數學”? 以前無法對“數字類型集合”(int/float/decimal/BigInteger/...)做統一的泛型約束(只能 where T :

c# , .net

唐青楓 - C# 原始字符串字面量全面解析:多行字符串終於優雅了!

簡介 C# 11 引入了原始字符串字面量(Raw String Literals),這是一個革命性的特性,極大地簡化了包含大量特殊字符(如引號、反斜槓、換行符等)的字符串處理。 原始字符串字面量允許創建包含任意文本的字符串,而無需轉義特殊字符。它們以至少三個雙引號 """ 開始和結束,並且可以跨越多行。 核心特性與優勢 核心特點 無轉義需求:不需要對引號、反斜槓等特殊字符進行轉義 多行支持:

c# , .net

唐青楓 - C#.NET Record Struct 完全解析:語法、語義與最佳實踐

簡介 Record Structs 是一種值類型的記錄(record),結合了 struct 的值語義和 record 的功能(如自動生成相等性比較、不可變性支持)。它們是 C# 9.0 中引入的引用類型 record(默認 class)的擴展,專為性能敏感場景設計,特別是在需要棧分配或避免 GC 壓力的情況下。 核心特性 值類型:存儲在棧上(除非裝箱),避免堆分配,適合小數據結構。 不可變

c# , .net