[C#] 屬性中的屬性: 自訂 Attributes

不知讀者們有沒有遇到過如下的狀況? 假設你需要從某個 CSV 檔案中匯入資料; 我們已經知道每個欄位是什麼。然後你為這份資料建立了類別, 也為每一個需要的欄位建立了屬性。當然, 你也一定知道每一個欄位是第幾欄, 但是 Visual Studio 並不知道。你必須每次都去查, 才能知道哪個欄位是哪一欄。假設 CSV 檔案內容如下

...繼續閱讀 »

[Regex] 正規表示式的應用

許多人很害怕 Regular Expressions, 除了它的確不好學之外, 主要是因為大家普遍不太了解它能拿來做什麼。所以我在這裡要陸續舉出一些實際上的應用範例, 向讀者們示範 Regular Expression 在實際生活中能幫我們解決什麼問題。依照我的慣例, 當我想到什麼, 就會在原來的文章裡直接修改, 不另做通知, 也不會再寫另一篇新的文章...

...繼續閱讀 »

[入門] .Net 非同步處理與同步機制全解析 (三)

.Net 4.5 新增的 Async/Await 功能也出來一陣子了, 我相信有許多人都已經對它相當熟悉。不過我在本文中要把重點往回拉一點點, 談一下 .Net 中早已提供的非同步功能。坦白說, 這才是我一開始想寫的東西。

在「[入門] .Net 非同步處理與同步機制全解析 (一)」一文中, 我們已經看過以手動方式叫出執行緒以進行非同步作業的方法。在這裡, 我要介紹以委派方式以進行非同步作業的方法。如果你不熟悉「委派」(Delegate) 的話, 你可以參考「ASP.NET 事件與委派詳論」一文, 順便復習一下「委派」與「事件」之間的密切關聯。基本上, 委派本質上可以說就是所謂的 "Function Pointer"。而且, 其實在 .Net 中, 委派的機制其實還套用了某種設計模式, 讓使用者可以以廣播方式進行訊息傳遞...

...繼續閱讀 »

當隨機不再隨機的時候

前幾天, 我寫了一個 Unit Test, 用來測試一個非同步的資料庫寫入方法。如果我一次寫入一百筆, 那麼結果很順利; 寫入兩百筆, 也很順利; 一路測到一千筆, 都很順利, 都能夠在一秒之內成功結束。直到測到一千一百筆, 突然這個 Unit Test 執行不完了。我看到測試總管中狀態條不停地跑, 完全沒有停止的跡象, 直到我把測試取消為止。一開始, 我懷疑這是 .Net 的非同步機制出了問題。莫非是因為非同步處理機制一次應付不了太多 task? 但是應該不是如此; 我以前在同一部機器上測試非同步或平行作業時, 都是以一次幾萬筆的方式在做的...

...繼續閱讀 »

解決 .Net 日期與 SQL 日期的匹配問題

雖然這是一個陳年的老問題, 我在實際應用中卻從來沒有踫到過 -- 直到今天。當然, 這也是一個陷阱; 如果我不是以前看過其他人的討論, 我恐怕會百思不得其解。這個問題很簡單, 相信許多人都有經驗: 把一個日期欄位寫進資料庫, 再取出來時, 發現兩個日期並不相等。它的陷阱在於, 這兩個日期有完全相同的年、月、日、時、分、秒, 但是寫進去 SQL 之後, 再讀出來, 它的 millisecond 值卻不同。Ticks 也不同。這個問題使得我的單元測試始終過不了...

...繼續閱讀 »

[Winform] 自訂 app.config 區段

在撰寫 Windows Form 程式時, 我們時常會在 app.config 中放入一些參數。如果把它們存放在 appSettings 區段中, 那麼我們就可以很方便地使用 ConfigurationManager.AppSettings["MyKey"] 取出。但是, 如果我們要放進去的資料稍為複雜一點, 操作起來就沒那麼直覺。例如, 我們可以將鍵值以 a-XXX, b-XXX 方式命名, 再使用字串處理方式分出群組。一般而言, 我們通常不會在 app.config 中存入大量資料, 也不會存入太複雜的資料 (否則你應該使用更適合的格式檔案, 例如 XML 或 JSON), 更不會進行大量且持續的存取, 所以上述做法是 OK 的。然而, 如果你和我一樣有奇怪的潔癖, 或許你也會覺得上述做法有點 low。我們就是要去找最有彈性的做法 (明明就用不到)...

...繼續閱讀 »

[Winform] 在 RichTextBox 中著色的偷懶小技巧

在寫 Windows Form 時, 如果不花錢的話, 那麼除了 TextBox 這個文字控制項, 就只剩 RichTextBox 可用了。可惜的是, 雖然都是 RichTextBox, Winform 裡的 RichTextBox 卻不像 WPF 的 RichTextBox 那樣可以賦予方便的屬性。因此, 即使只是對 RichTextBox 裡的文字做著色這般簡單的動作, 都不見得容易, 也不直覺。例如, 我需要在 RichTextBox 裡把某些文字以紅色標示; 如果是網頁程式的話...

...繼續閱讀 »

[Regex] .Net 4.5 中新增的 Regex 建構式參數

我曾在「[Regex] 值得注意的 Regular Expression 樣式的潛在風險」一文中介紹過, Regex 樣式中若含有無意或惡意的某些寫法時, 可能會造成形同 DoS (Denial of Service, 阻斷式攻擊) 的問題, 使得伺服器運算器陷入無窮無盡的空轉運算中。事實上, 在撰寫正規運算式的樣式時, 的確很容易寫出有問題的樣式, 很多時候甚至不是刻意造成的; 愈是初學者, 愈容易造成這個問題...

...繼續閱讀 »

[入門] T4 入門教學

T4 是從 Visual Studio 2008 之後加入的新功能, 目的是提供一個文字範本, 讓開發者以動態方式產生文字內容, 例如程式碼。或許你會覺得 "T4" 這個名字很奇怪, 但事實上它是 "Text Template Transformation Toolkit" 縮寫。因為它的開頭字母剛好是四個 T, 所以就稱為 T4。Visual Studio 本身大量地使用 T4 作為動態程式碼的輸出工具。當然, 我們也可以使用 T4 來產生我們自己的程式碼。不過, 我們不僅可以產生程式碼, 基本上, 我們可以使用它來產生各種文字...

...繼續閱讀 »

[WinForm] 如何在 WinForm 應用程式中開啟 Console 視窗

時常寫 Windows Form 程式的朋友一定知道, 我們在 Windows Form 程式中一樣可以使用 Console.Write() 方法。這些訊息可以在 Visual Studio 中的「輸出視窗」裡看見。然而, Visual Studio 本身就有許多訊息顯示在輸出視窗裡, 所以我們時常有可能漏掉某些訊息沒看到, 或者需要不停地往回捲動, 才能找到。此外, 如果你希望這些訊息是能夠讓使用者看到的, 該怎麼辦? ...

...繼續閱讀 »

[入門] .Net 非同步處理與同步機制全解析 (二)

這一篇入門教學距離上一篇([入門] .Net 非同步處理與同步機制全解析 (一))已經有足足三年多的時間。之所以延宕那麼久, 主要是因為微軟已經開始提供平行處理及非同步機制的功能更新; 許多功能及用法不停地出現, 連我自己都搞不清楚, 所以我也沒辦法繼續著手這一系列文章。直到 .Net Framework 4.5 開始, 我覺得應該可以算是一個適當時機, 可以繼續來寫這個系列文章了...

...繼續閱讀 »

在 Console 程式中讓文字保持在同一行顯示

我們都知道我們可以在 Console 程式中以 Console.WriteLine 和 Console.Write 輸出文字到一個命令視窗裡。但是不管是 Write 或者 WriteLine 方法, 文字的走向都是向右、向下的, 從來不會回頭。因此, 如果你的輸出文字太多, 就會需要捲頁; 如果超過差不多12頁以後, 它只會保留12頁(大約是288行左右), 更上方的文字通通會被截掉, 再也看不見了。有沒有辦法讓我們既看到輸出結果, 又能讓這些輸出的文字不要佔據那麼多空間呢...

...繼續閱讀 »

[SQL] SQL 安裝與配置小小最佳實務

我個人算不上什麼驚天動地的 SQL 專家, 只是一個離不開 SQL 的開發人員而已。在這篇文章裡, 我也不打算講什麼高深的 SQL 理論或技巧, 只打算把我個人研究出來的小小 SQL 管理心得拿來給大家分享。我還記得以前在設置開發環境時, 經常被 SQL 搞得七暈八素。不是怎樣都連不上資料庫, 就是必須牢記在什麼情況下要先裝 SQL, 後裝 VS, 再裝 SQL Management Studio 等等。不過時序來到 VS2013, 我發現似乎所有的事情都變得簡單了, 而且穩定。不過, 坦白說, 過去的陰影始終籠罩在心裡, 所以我把我的成功經驗寫在下面, 萬一有人又遇到類似的問題, 或許可以參考我的方法, 成功率也許高一點 (至少我自己試過是成功的)。此外, 我也要分享一個許多人不知道或者不熟悉的管理小技巧...

...繼續閱讀 »

Linq2Excel 的陷阱與處理方法

Linq2Excel 是一個非常方便好用的小工具, 它是一個 Excel 專用的 LINQ Provider, 可以讓我們很快速地讀取 Excel (包括 Excel 2013) 的試算表。我們可以直接在 Visual Studio 中透過 NuGet 取得, 目前的版本是 1.7.1。如果你對這個套件有興趣, 你可以參考「LINQ - 實作 LinqToExcel」這篇文章, 足以讓你快速入門...

...繼續閱讀 »

[ASP.NET] 在 App_Code 下存取外部 Assembly

App_Code 是一個 ASP.NET 網站專案的特殊子目錄。如果你的專案不是 Web Site 專案而是 Web Application 專案, 你並不需要、也不應該特別建立一個 App_Code 子目錄來存放你的程式碼 -- 除非是為了某種特殊的目的。例如, 如果你希望幫網站加入動態產生版本的功能的話, 那麼你可以建立 App_Code 子目錄 (在這裡都使用 Web Application 專案), 並且在這個子目錄下隨便建立一個如下的類別檔...

...繼續閱讀 »