2012年1月26日 星期四

繪製圖形

命名空間 System.Drawing 提供建立或修改影像 (image) 的方法。 例如:

  • add circles, lines, and other shapes
  • create charts from scratch
  • edit and resize pictures
  • change the compression ratios of pictures
  • crop and zoom pictures
  • add copyright logos or text to pictures

序列化物件

什麼是序列化 (Serialization)

當宣告一個字串或數值變數並給定一些資料後,若須要將這些資料儲存起來,我想這沒多大問題,甚至自訂一個格式,日後還可以把它讀入相同型別的變數。 不過,如果這個變數是一個自訂的類別,例如 Employee ,或者一個 .NET 參考型別,如 Font、Hashtable、Datatable 類別等等,那你又會如何儲存呢? 這時,我們需要將物件資料轉成某個特定格式,這樣子才有辨法儲存至檔案、或者傳送給另一個程式、或者透過網路傳輸。 這樣子的一個轉換過程,就稱為 序列化 (Serialization)

序列化可分成二個階段:

  • 序列化 (Serializing) : 將一個 object 轉換成線性的 byte[] 資料,以方便資料的儲存與傳輸。
  • 還原序列化 (Deserializing) : 將先前序列化的資料轉換成 object。

使用影像(Images)

Image class

Image 類別是 GDI 用來處理影像的類別,但是 Image 是一個抽象基底類別,必須藉由 Image.FromFileImage.FromStream 方法,才可建立 instances。 或者由它的二個繼承類別來處理: BitmapMetafile

  • Bitmap 類別:靜態影像。透過提供載入、儲存和管理點陣影像的其他方法,增強 Image 類別的功能。
  • Metafile 類別:動能影像。透過提供記錄和檢視向量影像的其他方法,增強 Image 類別的功能。

XML 序列化

什麼是 XML

  • XML 是一種以文字為主的標準化格式,可用來儲存應用程式的資訊,且具可讀性。
  • XML 可以儲存任何型別的資料,包括文件、圖片、音樂、二進位檔案等資訊。

文字設定

如何在圖形中加入文字

步驟如下:

自訂序列化

當我們使用 BinaryFormatterXmlSerializer 去序列化一個類別時,系統會依設定幫我們直接產生序列化後的資訊。 但是,如果遇到版本的問題,或者某些類別不支援序列化時,導至還原序列化後的資訊不符合需求, 這時候就是使用自訂序列化的時候,也就是覆寫.NET Framework內建的序列化程式,並自行撰寫程式碼以控制序列化後的資訊。 使用自訂序列化,可以在不破壞該類別的前提下,達到上述問題的解決。

如何實作自訂序列化

若要自訂序列化,就要實作 ISerializable 介面,並且將 Serializable 屬性套用到該類別即可。

要實作 ISerializable 介面,就必須實作以下二件事:

  1. 實作 GetObjectData 方法,在這方法中填入序列化所需的資訊到 SerializationInfo 物件之中。
  2. 建立用來還原序列化時的特殊建構函式。

這個方法和建構函式的參數都是 SerializationInfoStreamingContext 型別。
GetObjectData 方法之中,主要必須撰寫的程式碼,就是使用 AddValue 方法,將想要序列化的變數,以 name/value 方式加入到 SerializationInfo 物件之中。
使 SerializationInfo 這個物件具有足夠的序列化資訊,以便在還原序列化過程中用來重建該物件。

2012年1月16日 星期一

集合類別

比較表

CollectionDictionaryCollection<T>Dictionary<T,U>
基本型 ArrayList Hashtable List<T> Dictionary<T,U>
字串型別 StringCollection StringDictionary :1 key -> 1 value
NameValueCollection :1 key -> n value
List<T> Dictionary<T,U>
Bool型別 BitArray
連續型的 Stack :LIFO
Queue :FIFO
Stack<T>
Queue<T>
item 順序 SortedList :順序依 key 值自動排序
OrderedDictionary :順序維持加入的順序
SortedList<T,U>
SortedDictionaryt<T,U>
Dictionary<T,U>
存取效能 ListDictionary :適合項目小於 10 個的集合。
HybridDictionary :項目無法預期時,這個類別會自動調整。
Dictionary<T,U>

正規表示式

文字處理是很頻繁的例行工作,Regular Expression 正是一個複雜,但有效率的文字處理技術。
RegExp簡單的觀念就是先建立一組 pattern 字串, 再用這組字串去和資料做筆對。
例如判斷字串中是否含有"abc",或者含有email,或者含有身份證格式的文字....

編碼與解碼

什麼是編碼與解碼

「碼」:將原本的資訊,以特別的代號來表示,只要知道每種代號的意義,就能以代號來獲知原本的資訊。 例如:._ _... _._. 就是摩斯電碼。還有像 ASCII, BIG5, UTF8 ... 都是一種「碼」。

  • 編碼(encoding):將一組 Unicode 字元轉換成位元組序列的處理程序。( string to byte[] )
  • 解碼(decoding):將已編碼的位元組序列轉換成一組 Unicode 字元的處理程序。( byte[] to string)

我們都知道,電腦中的文字,都必須使用某種編碼標準(encoding standard)進行編碼(encoding)後,才可以存放在記憶體或檔案中。只是這個編碼與解碼的過程,通常系統都會自動幫我們處理。 不過,有時候我們還是必須手動處理這個編碼與解碼的過程,例如:要將資料和Unix系統交換時,或者要以指定的編碼標準處理文字檔案等等。 其實,每一種編碼標準都是為了轉換 byte value 與 character。 就像 ASCII 就是一種老舊但也是最廣泛使用的編碼標準之一。 例如其中 0x41 = A, 0x61 = a ...。 不過,因為這個編碼標準對非英語系的支援非常有限,所以也就延伸出各種 Unicode 的編碼標準以支援各種語言。

ArrayList 集合

集合物件的特性:允許資料項目的增減,可以巡覽集合中的資料項目。

Stack、Queue 集合

ArrayList 中,我們可以直接存取集合中任何一個資料項目,但有時候我們並不需要如此功能,只需要可以循序存取集合中的項目即可。 在 .Net 裡,提供了二個循序串列 (sequential list) 物件:QueueStack 。 這二個物件的特色是,可以在一個步驟中,由集合中取出資料項目,並同時將該資料項目由集合中移除。

Dictionaries

什麼是 Dictionaries

當資料型態具有 key/value 特性時,就可以使用 Dictionary 類型的集合。它可以用來建立索引表,將任意的 key 與 value 做關連對應。.NET Framework 包含下列 Dictionary 類別:

  • Hashtable :最基本的字典集合,每個項目都是儲存在 DictionaryEntry 物件中的 key/value 組。可透過 key 取得項目的 value。
  • SortedList :類似 Hashtable,會自動以 key 排序集合內的項目。
  • ListDictionary :當集合項目少於10個時,採用這個集合類別效率較佳。
  • HybridDictionary :使用這個集合,當集合項目少於10個時,會採用 ListDictionary ,若項目變大時,會自動轉成 Hashtable
  • OrderedDictionary :類似 Hashtable ,但集合中的項目會依加入的先後順序排列,不像 Hashtable 是依 hashcode 排列。

底下二個是比較特殊類似字典的集合

  • StringDictionary :類似 Hashtable ,但 key/value 都只允許字串型別, Key 不能重複,一個 key 只能對應一個 value 。
  • NameValueCollection :類似 Hashtable ,但 key/value 都只允許字串型別, Key 不能重複,一個 key 可以對應多個 value 。

下列幾點是有關於 Dictionary 的幾點特性:

  • 每個項目都是儲存在 DictionaryEntry 物件中的 Key/Value。
  • Key 必需唯一的。
  • Value 可以是 null ,而且不一定要是唯一的。
  • IDictionary 實作分為三類:唯讀、固定大小、變數大小。
    • 唯讀的 IDictionary 物件無法修改。
    • 固定大小的 IDictionary 物件不允許加入或移除項目,但允許修改現有項目。
    • 變數大小的 IDictionary 物件允許加入、移除和修改項目。

Specialized Collections

前面介紹的集合,其組成項目都是由 Object 構成,當要擷取資料項目時就會用到cast objects。

System.Collections.Specialized 命名空間底下,定義了一些僅允許特定型別的集合類別。 例如:

Generic Collections

How Generics Work

Generics簡述

Generics 是.Net2.0才加入的功能。是一種型別參數的概念,也就是當class或method在設計時,可以先擱置型別,直到用戶端程式要使用時再行處理型別。 目的在於避免run time時需要boxing/unboxing的情況。泛型可以用在.Net中的許多地方,但是最常見的就屬泛型集合類別。

2012年1月7日 星期六

檔案系統

何謂 File System Classes

System.IO 命名空間包含 FileDirectory 等類別,提供管理檔案和目錄的功能。
因為這些物件的方法是靜態 (Static) 或共用成員,所以可以直接使用它們,而不需要先建立類別的執行個體。

與檔案相關的類別,大至可分成二類:

資訊提示(Information):

資訊提示類別大都繼承自FileSystemInfo 基底類別。提供與檔案系統相關的資訊,如 FileInfoDirectoryInfo

公用程式(Utility)。

公用程式類別則提供對檔案系統的操作功能,如 FileDirectoryPath 等類別。

讀寫檔案

何謂 Stream

資料流基本概念

資料流是一種循序或隨機存取資料的方法。也就是針對 byte[] 中的資料做循序或隨機的存取。

壓縮資料流

認識 Compress Stream

.NET Framework 提供二個類別,用來處理壓縮資料。

  • GZIP:使用 GZipStream 類別表示 GZIP 資料格式,它無失真檔案壓縮和解壓縮的工業標準演算法。
  • Deflate:使用 DeflateStream 類別表示結實 (Deflate) 演算法,該演算法是無失真檔案壓縮和解壓縮的工業標準演算法。它使用 LZ77 演算法和 Huffman編碼的組合。

隔離儲存區

什麼是隔離儲存區 (Isolated Storage)

隔離儲存區是為了考量系統安全性,將應用程式限定在少許權限的區域中運作,又可以滿足程式儲存資料的需求。 意思就是該區域中的資料只有該 App 能夠存取,其他的 App 無法存取。 .NET Framework 提供了這樣子的一個儲存機制,用以將應用程式和資料產生關聯,藉以提供資料隔離和安全。 有了隔離儲存區,程式碼不再需要使用唯一的路徑去存取檔案系統中的檔案,而且資料也可進一步受到保護以避免遭受其他應用程式的影響。

隔離儲存區中的資料是依照 user 、 domain 、 assembly 來隔離的。 例如,可依使用者資訊和程式碼組件將資料隔離,限定該隔離區內資料的讀取權限僅限該程式碼,以提升這些資料的安全性,以免受到其他應用程式的影響。 這個機制常應用在ClickOnce相關程式中。