static method, instance method
behaviors設計核心原則:是否依賴物件狀態實例方法 : string.Substring()靜態方法 : char.ToUpper()總結有些事,必須「由我親自完成」。像是「寄信給某個人」、「打開我家的門」、「改變自己的心情」。這些行為,都需要知道「我是誰」 , 要有具體的對象,行為才有意義
在程式裡,這樣的行為就像 實例方法(Instance Method)。它依附在一個物件上,只有當那個物件存在(例如某個字串、某個人、某個訂單),方法才能運作,因為它需要用到那個物件的內部狀態
但有些事,誰都能做。像是「把字變成大寫」、「計算兩個數的和」、「取得目前時間」。它們不需要知道「我是誰」,只要照著規則執行,就能得到相同的結果
類型
是否依賴物件狀態
範例
設計意圖
實例方法 (Instance Method)
✅ 是
string.Substring()
方法的邏輯需要使用「該物件的資料」。
靜態方法 (Static Method)
❌ 否
char.ToUpper()
方法不依賴任何物件,只根據輸入參數運算。
因為它要「從這個字串」取出一部分,也就是它需要知道 ...
EFCore - Tranaction and SaveChanges
SaveChanges() 和 Transaction 的關係TransactionScope 的時間限制錯誤記錄在資料庫的世界裡,一次或多次資料修改(INSERT、UPDATE、DELETE)必須放在 交易(Transaction) 裡,這樣如果其中一步錯了,整個動作都可以 rollback 回去,確保資料不會半途修改一半
SaveChanges() 就是 EF Core 幫你「把所有變動打包起來執行」的動作。而 EF Core 為了確保這個過程的資料一致性,在執行時會自動幫你開一個 Transaction
狀況
EF Core 內部會自動開啟交易嗎?
SaveChanges() 會自動 Commit 嗎?
備註
✅ 你 沒有 手動開交易
✅ 是
✅ 是
SaveChanges() 自動包一個 transaction,執行完自動 commit
⚠️ 你 手動開了交易 (BeginTransaction())
❌ 否(你已經開了)
❌ 否(尊重你控制的交易)
SaveChanges() 只會執行 SQL,不會幫你 commit
當你呼叫 context.SaveCh ...
Generic - 記憶の箱
記憶之箱🌸 泛型與快取🔹 記憶之箱✨✨ 登入人生 online總結
我們的大腦,其實就像一個會自動學習的「快取系統」。有些經驗,一次就讓我們記得深刻;有些事情,卻需要多次重複才會留下印象。有些回憶被時間淘汰、過期了,就像舊的快取資料一樣,被默默清除;但也正因為如此,新的經驗才能被寫入,人生才不會停在原地
程式中的 泛型(Generic),讓我們能用同一套邏輯,處理不同型別的資料;人生中,我們也在學習如何用同樣的「思考模式」,面對不同的狀況。無論是人際關係、工作挑戰、或自我成長,我們都在建立一個「屬於自己的泛型快取」——那些經驗的抽象化、情緒的緩存、學習的積累,都讓我們在未來遇到類似情境時,不必從零開始
泛型不僅在計算和包裝上有用,在快取機制中也能發揮強大的作用。透過泛型快取類別,我們可以建立一個通用的快取解決方案,適用於任何型別的資料
🔹 SimpleCache1234567891011121314151617181920212223242526272829303132333435363738394041void Main(){ var cache = ne ...
Generic - 型越の魂
靈魂與肉身想解決甚麼問題型別參數化「重複邏輯,只是型別不同」讓「資料結構或工具類別」可重複使用總結學習「靈魂,不屬於肉身;邏輯,也不該屬於型別。」
我們都知道,肉體只是外殼,靈魂才是本質。人如此,程式亦然。在軟體的世界裡,邏輯就像靈魂,它決定了一段程式「該怎麼思考」;而型別(Type)就像肉體,負責「具體地呈現」
在泛型出現以前,我們若想讓容器能「存放不同型別」的資料通常會用 object 來實作
1234567ArrayList list = new ArrayList();list.Add(123);list.Add("ABC");// 問題來了int n = (int)list[0]; // OKint m = (int)list[1]; // ❌ runtime error
這樣雖然「兼容」了所有型別,但有兩個致命缺點
你要手動轉型 (casting),而且有風險(可能轉錯)
編譯器無法幫你檢查型別錯誤,只能等執行時爆掉
泛型 (Generics) 是一種「延後決定型別」的程式設計方法,它讓你寫出對型別沒有限制,但仍然安全可重用的 ...
SQL - 時の雫
從時間欄位出發 → 做運算或分段 → 推導出狀態或統計結果
💼 三種常見的時間分析模式
類型
說明
範例
關鍵函式
① 時間差模式 (Time Gap)
用「時間差」判斷狀態或剩餘時間
HR 系統判斷誰快退休
DATEDIFF, DATEADD, CASE WHEN
② 時間分群模式 (Time Bucketing)
把連續的時間切成段落來統計
每月、每日、每週銷售分析
MONTH, DATEPART, DATEADD
③ 時間對齊模式 (Time Rounding)
把時間「取整」對齊成標準區間
每分鐘、每小時登入量
DATEADD(DATEDIFF(...))
💼 查詢的共通術式
技術重點
說明
DATEADD / DATEDIFF
處理時間偏移與差距(加減天、月、年)
DATEPART / MONTH / YEAR
擷取時間單位(分群依據)
CASE WHEN
將數值轉成語意化狀態
CTE (WITH)
建立暫存結果,讓查詢更乾淨易讀
分群 (GROUP BY)
對時間區間進行統計彙 ...
SQL Injection
💼 FromSqlInterpolated1234var user = "johndoe";var blogs = context.Blogs .FromSqlInterpolated($"EXECUTE dbo.GetMostPopularBlogsForUser {user}") .ToList();
FromSqlInterpolated 接受 FormattableString(即 $”…”)做為參數。EF Core 會把內插的值({user})自動轉成 DbParameter(例如 @p0),並把 SQL template 與參數分開傳給底層 provider(SqlClient)。用在執行 Stored Procedure 或 raw SQL 且要保留可讀性的情境很好用。如果有多個參數,寫法同樣直觀:$”EXEC proc {p1}, {p2}”。
FromSqlInterpolated 並不是把整個字串插入後再送出;EF 會解析 FormattableString.Format 與 Form ...
Asynchronous Programming - 第十四章 :async lambda
LINQ ForEach() 與 async / await
問題的起點 — async lambda 與 Fire-and-Forget 陷阱問題的起點 — async lambda 與 Fire-and-Forget 陷阱解法 1:簡單但不平行解法 2:真正的非同步 + 平行執行LINQ 的 Select 不會「馬上執行」Codesummary新的一年,動力滿格,誓言要變成更好的自己,我們開始報名課程、立下目標、說要健身、要學語言、要創業,那一刻就像丟出一個 Task 嚷嚷著我會做到的承諾。但接下來,沒有積極安排「等待與驗收」,例如固定回顧、截止日、交付物、找人督促,生活的 ForEach 將忙碌的人生繼續往下跑,我們會很快進入下一堆事情。最後你回頭看 results 可能是空的、有的只有一半(做到一半被別的事用掉了)、有時看起來做了很多,但沒有一個真正可用的成果,問題不在是否努力,是因為沒設計「誰來等你完成」!!!
12345urls.ForEach(async url =>{ var response = await client.GetAsync(ur ...
Asynchronous Programming - 第十三章:Task.WhenAll
跑腿什麼時候觸發了任務執行?下載檔案預覽ValidatorsTask.WhenAll 最高?WaitAll 與 WhenAll展現阻塞的差異你叫三個小弟幫你跑腿
Gina 去買雞蛋Bill 去買牛奶Lily 去買麵包
你不會等 Gina 回來才讓 Bill 去,你會同時叫他們出門,然後你說:「等你們全部都回來,我們再一起做早餐!」這就是 Task.WhenAll ,等全部人回來,再開始做接下來的事
它的本質是,把很多 Task 包裝成「一個新的 Task」,這個新 Task 會在所有子 Task 都完成後才完成 (to execute multiple asynchronous tasks concurrently,and wait for all of them to complete)
12345678910111213141516171819async Task Main(){ var tasks = new List<Task>(); foreach (var i in Enumerable.Range(1, 3)) { tasks.Add ...
EF Core - TransactionScope vs BEGIN TRAN/COMMIT
TransactionScope與COMMIT TRAN
transactionScope or BEGIN TRANTransactionScopeBEGIN TRAN / COMMIT TRAN兩者怎麼互動強迫建立不同的連線,確保觸發 MSDTC操作summary「如果用 TransactionScope 包了一段程式,裡面又在 SQL 裡手動開 BEGIN TRAN,那最後誰決定要不要真的 commit?」
只要你在 using 範圍內操作資料庫,EF 或 ADO.NET 會自動參與這個「環境交易 (Ambient Transaction)」。如果沒呼叫 scope.Complete(),在離開 using 時就會自動 rollback
123456789using (var scope = new TransactionScope()){ // 這裡做的所有 DB 操作(只要使用相同的連線)都會自動參與這個交易 DoSql1(); DoSql2(); // 決定是否 commit scope.Complete();}
這 ...
EF Core Attach() 與 Entry().State 進行更新
使用 EF Core Attach() 與 Entry().State 進行更新
小船什麼是 Entry()Entity 的五種狀態 (EntityState)Entry(record).State = EntityState.Modified 是什麼意思如果只想更新部分欄位Attach(record) 是什麼Primary Key 的狀況單純 Attach() 未指定 Id 值先查一筆,再 Attach()Attach() 指定 Id 值的 EntityAttach() 後修改某屬性Entry().State = EntityState.ModifiedSetValues() 只更新有修改的欄位SetValues() 的靈活應用summary在資料的海洋裡,每一筆 Entity 都像一艘小船。有的剛啟航(Added),有的正返港(Modified),有的靜靜停泊(Unchanged),而有的早已脫離航道(Detached)。
EF Core 就像港口的管理員,它用 Entry() 觀察著每艘船的狀態,用 Attach() 告訴它:「這艘船其實還在港裡,只是暫時沒動而已。」在 EF ...








