博客 / 列表

唐青楓 - 深入理解 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

唐青楓 - C#.NET 範圍與索引(Range、Index)完全解析:語法、用法與最佳實踐

簡介 C# 8.0 引入了範圍(Ranges)和索引(Indices)功能,提供了更簡潔、更直觀的語法來處理集合中的元素和子集。這些功能大大簡化了數組、字符串、列表等數據結構的操作。 索引(Indices) 從末尾開始的索引 使用 ^ 運算符表示從末尾開始的索引: int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 傳統方式獲取最後一個元素

c# , .net

唐青楓 - 告別 if-else:C#.NET 模式匹配讓代碼更優雅的正確方式

簡介 模式匹配是 C# 7.0 開始引入的革命性特性,它提供了更簡潔、更強大的方式來檢查和提取數據中的信息。隨着每個版本的更新,模式匹配功能不斷強化,成為現代 C# 開發的核心特性。 模式匹配允許將輸入表達式與各種特徵進行匹配,支持多種模式類型。它主要用於: is 表達式:檢查並可能聲明變量。 switch 語句:傳統分支邏輯。 switch 表達式:更簡潔的表達式形式(C# 8.0 引入

c# , .net

唐青楓 - 一文理解 C#.NET Tuples:從基礎到高級應用

簡介 元組是 C# 中用於存儲一組固定數量、可能不同類型的值的數據結構。它是值類型(ValueTuple),在內存中分配於棧上(除非作為對象引用使用),因此性能較高。元組的主要用途是: 臨時組合數據,而無需創建專用類型。 從方法返回多個值。 在解構或模式匹配場景中簡化代碼。 C# 元組基於 System.ValueTuple 結構,引入於 .NET Framework 4.7 和 .NE

c# , .net

唐青楓 - C#.NET 集合表達式詳解:新時代的集合初始化方式

簡介 集合表達式(Collection Expressions)是 C# 12.0(隨 .NET 8.0 發佈於 2023 年)引入的一項新特性,用於以簡潔、聲明式的方式創建和初始化集合(如數組、列表、字典等)。集合表達式通過 [...] 語法提供了一種更直觀的方式來定義集合,減少樣板代碼並提高可讀性。 背景和作用 集合表達式旨在解決傳統集合初始化(如 new ListT { ... } 或 ne

c# , .net

唐青楓 - 一文搞懂 C#.NET DateTimeOffset:時間戳、時區與偏移量全掌握

簡介 DateTimeOffset 是 System 命名空間中的結構體,用於表示特定時間點及其相對於協調世界時(UTC)的偏移量。相比 DateTime,它更適合處理跨時區場景,確保時間數據在全球化應用中的一致性和精確性。 定義:System.DateTimeOffset 表示帶有固定時區偏移量的點時間。 用途:既保留了 UTC 時間戳,也攜帶了相對於 UTC 的偏移量(Offset),在

c# , .net

唐青楓 - C#.NET DateTime 最強入門到進階:格式化、轉換、UTC、時區全覆蓋

簡介 DateTime 是 System 命名空間中用於表示日期和時間的結構體,廣泛用於處理時間相關的操作,如存儲、計算、格式化等。 DateTime 結構概述 定義:System.DateTime 是一個值類型(struct),表示自公元 0001 年 1 月 1 日午夜 00:00:00(DateTime.MinValue)起經過的“刻度”(ticks,1 tick = 100 納秒)數。

c# , .net