再論 Delegate 與 Lambda

Delegate 和 Lambda 的概念在 2008 年就出來了,Delegate 更是最早最早 (.NET 1.0) 時就已經有的概念,隨著技術的演進,Lambda 讓 Delegate 變得更好使用也更容易發揮,但似乎有些人不這麼認為,所以我還是再講一些吧。

...繼續閱讀 »

[.NET][Design Patterns] 無辜的 Repository Pattern

因為最近分層架構的流行 (拜三隻豬之賜?),愈來愈多人談論起 Repository 的設計,也開始有人認為 Repository 無用,說實在的,Repository 有用於否,存乎一心,當你認為它有用時,隨手寫了它也不會覺得奇怪,但如果一開始就認為它是多餘的,就算人家給你程式產生器,你還是會認為它是多餘的。

...繼續閱讀 »

[.NET] 關於晚期繫結 (Late Binding)

晚期繫結是一種程式語言與作業系統的手法,用意在於避免因為編譯時期的型別檢查機制,導致程式員在編寫程式時,需要處理過多的型別資訊 (Type Information),晚期繫結可以有效的處理在平台之間型別資訊的隔離,讓編譯出來的程式可以在特定的平台之間執行,而不需要被型別資訊綁住,不過也不能過度濫用,除非原生平台就是要用晚期繫結 (例如 JavaScript)。

...繼續閱讀 »

[.NET] Connect(); 的多項宣布:Visual Studio 2015, Visual Studio Community Edition, .NET Open Source, .NET Core Framework, ASP.NET 5

Connect() 研討會在昨晚於 Channel 9 線上開幕,發表了數個 .NET 的未來走向,以及新工具的發表,其中最令人期待的當然就是 Visual Studio 2015,這個代號 VS 14 的新版開發工具,它除了持續性的功能演化外,另一個我們一直在關注的新平台:ASP.NET vNext,正式定名為 ASP.NET 5,這可不是 MVC 5,而是整個平台的版本,而 .NET Framework 本身也分為兩支,一支是原本的 .NET Framework,持續演化並維持與舊版本的相容性,版本號碼為 4.6;另一支則是全新的 .NET Framework,稱為 .NET "Core",這個版本是輕量化的 .NET Framework,所有組件都重新設計,擺脫與 .NET Framework 大多數核心組件的相依性,以作為 Cloud 平台的核心執行引擎,同時它也搭配了 .NET Native 等新一代的執行環境一起釋出,它也是首個正式進軍 Linux 與 Mac 的官方 .NET 平台。

...繼續閱讀 »

[.NET][vNext] .NET vNext @ 2014

.NET Framework 才剛宣佈 4.5.2 沒多久,隨即在 TechEd 2014 North America 上宣布 .NET Framework 的 vNext 版本,它也是 ASP.NET vNext 的核心,這次的 .NET vNext 倒不會看到在 BCL (Base Class Library) 上有多少改變,倒是為了配合微軟的新策略,大量引進 Open Source 的概念,將原本專屬於微軟的相關技術都開放,並且針對 Device 和 Cloud 的應用情境做專屬的最佳化,讓 .NET 在 Device 和 Cloud 都能獲得最佳表現,同時也讓 .NET 可以跨出 Windows 平台 (之前只有 Mono,微軟希望有更多的平台加入...

...繼續閱讀 »

[.NET][LINQ] Any() vs. Count() 何時可用? 何時不可用?

LINQ 語法中有兩個很令人玩味的方法,一個是 Any(),另一個則是 Count(),Any() 的功能是判斷集合中是否有物件,Count() 則是用來計算集合中的物件數量,功能其實很像,以一般的使用習慣來說,我們多半會使用 Count() 來判斷集合中是否有物件,而且在大多數的情況下是沒問題的。

...繼續閱讀 »

[Software Development] 關於序列化 (Serialization) 這件事

要是寫程式,一定多多少少會需要讀寫資料,畢竟 Program = Data Structure + Algorithm,只是大多數的情況下,資料的讀寫多半是對資料庫,而資料庫內的檔案實際讀寫由 DBMS 自己控制,開發人員基本上是碰不到的,但是資料不是只會存在資料庫內,像是檔案系統 (File System),網路資料或是其他可能的資料儲存地,而像這些不同的資料保存,都需要由開發人員自己處理 I/O 的工作...

...繼續閱讀 »

[.NET] PropertyGrid 控制項的進階使用:自訂資料檢視與編輯器

最近這一個月事情還真不少,不斷的在嘴砲和務實的角色之間切換,也寫了不少的程式碼,而且為了因應今年 9/13-15 的微軟大拜拜 (Tech.days) 的課程,我還特別寫了支範例程式準備要在課堂上 demo 用,這支範例程式是 Windows Azure Platform 上的服務管理應用程式,核心均來自 Service Management APIs,很快的,就在 Tech.days 2011 Taiwan 研討會中將正式釋出...

...繼續閱讀 »

[Security] 判別式存取控制表 (Discretionary Access Control List) 實作:階段 2,誰能存取,我決定。

我們在階段 1 中已經完成了最基本的 DACL 資料結構,能針對簡單的 CRUD 權限做控制,但一般來說權限設定沒那麼簡單 (尤其是複雜度高又講求安全的系統),很多程式或系統有時無法只單純用 CRUD 就可以解決...

...繼續閱讀 »

[Security] 判別式存取控制表 (Discretionary Access Control List) 實作:旗標的概念

在前一篇文章中,我簡單的說明了 DACL 的資料結構組成,以及簡單的存取方法,如果資料長度愈長的話,可以設定的權限就愈多,也可以有更多的組合,但資料量仍然可以控制在很小的長度,這是因為在 DACL 中,每個權限都是一個旗標值 (flag),而一個 bit 就代表一個旗標,所以 bit 多的話旗標就愈多,一個 byte 可以容納 8 個 bits,也就是可以有 8 種旗標,之所以會選擇位元來作為旗標,是因為 bit 的值不是 0 就是 1,單純有力。

...繼續閱讀 »

[Security] 判別式存取控制表 (Discretionary Access Control List) 實作:原型概念

判別式存取控制表 Discretionary Access Control List (DACL),這個自由度頗高的存取控制方法,在 Windows 以及其他作業系統中已行之有年,它最大的特色就是使用者和群組可以擁有自己的存取控制設定,而系統物件也可以擁有自己的存取控制項目,也就是說系統物件不會只有 CRUD 四種權限,還可以因為物件的特性而定義額外的權限,例如存取詮釋資料 (metadata), 列印 (printing) 或是下載檔案 (download) 等權限,discretionary 這個字有 "任意的","無條件的" 的意思,而 DACL 也是讓消費者和生產者可以擁有自己的權限設定,只需要在存取時進行檢查即可。

...繼續閱讀 »

[.NET] 有關強式名稱 (Strong Name) 的兩三事

Strong Name 是 .NET Framework 中很特殊的一個特性,大多數的 .NET 開發人員不會使用到這樣東西,不過如果是從事 Framework 或是可轉散布型的軟體的開發人員,就需要知道這東西,因為它是一種組件識別 (asembly Identify) 機制,透過 Storng Name,它可以讓使用該組件的開發人員能確定這個組件是來自於建置的廠商或開發人員,而不是從中被竄改過。

...繼續閱讀 »

[.NET] 產生具有多個值,multipart/form-data 的 HTTP POST 訊息

這個功能是在設計 Facebook Graph API Client Library 時碰到的問題,在 Graph API 中的 Publish_Stream 中有一項上傳相片的功能,這個功能內有一個 message 和 access_token 參數,而原本我們學習的 HTTP 技術本身大多都是沒有混合二進位和字串值的參數,所以當時碰到這個問題時,一時想不到什麼解決方法,後來搜尋到 RFC 2188: Returning Values from Forms: multipart/form-data,這份文件說明了在 HTTP POST 訊息中使用多種格式訊息的作法,它可以用在許多 REST-based API 的系統,它可以混合多種資料格式並一次傳送,當然非文字的資料必須要編碼為二進位字串。

...繼續閱讀 »

[.NET] 使用 HTTP Handler 部署不同作業系統版本的 ActiveX Control

筆者在 ActiveX 控制項開發的封裝部署一文的最後,曾經提到 Windows XP 和 Windows Vista/7 的部署差異,這會讓開發人員需要依照作業系統的不同來撰寫 INF 檔案來自動化安裝,而且還要在網頁中偵測不同的作業系統給予不同的 CAB 檔案,但我們有一些方法來簡化這個部份的處理,讓開發人員可以在不動一行 <object> 宣告下,支援 Windows XP 和 Windows Vista/7 的作業系統環境。其實方法很簡單,只要使用 HTTP Handler 就能做到了。

...繼續閱讀 »

Dependency Walker

有使用過 Windows Server 2003 SDK 之前版本或是 Visual Studio.NET 2003 之前版本的開發人員都知道,在隨附的工具中,有一個工具可以拿來偵測該執行檔或 DLL 還需要哪些 DLL,並且可以看到在 DLL 或 EXE 中開放的 C 函式,這個工具稱為 Dependency Walker (depends.exe)

...繼續閱讀 »

日期與時間的運算

好像不少人都不知道時間是可以相減的,而且不會太難,DateTime 有覆寫 "-" 這個運算子,所以只要 DateTime2 - DateTime1,或是 DateTime - TimeSpan 都可,不過它傳回來的是一個 TimeSpan (時間幅度) 的物件,可以由這個物件中的方法來取得兩個時間的差異。

...繼續閱讀 »