c# 學習筆記06 – I/O 處理

最近幾天段段續續的接著看 c# 的書,慢慢的把語言的基礎介紹看完了。

在 c# Input/Output 處理的方式,是使用 stream model(串流模型),有 3 個基礎的類別:FileStream、MemoryStream、BufferedStream,這三個類別都是繼承自最基礎的 Stream 類別。

處理字元串流的部分,基礎類別是TextReader TextWriter, 一般不會直接使用這個類別,這二個基礎類別也沒有 public constructor 可供使用,通常是用 StreamReader 包住一個已經開好的 Stream 讀取資料,再配合ReadLine() 使用。Writer 的使用方式也類似這樣子,先開一個串流,再用 StreamWriter 包住。BinaryReader BinaryWriter 類別則是可以直接把 c# 的資料型別使用二進位的方式儲存起來,好處是在使用檔案上的資料進行運算的時候,系統不用再把字串的表示轉換為位元組的表示,再進行運算,可以直接就運算,效能上會好一點。

再來是 c# 的 delegate 和 event 的介紹。這部分是 c# 中比較難了解的,而且所使用的模式和 java 的不同。參考資料是蔡學鏞所寫的以下這二篇文章:
函數指標的進化論 (上)
函數指標的進化論 (下)
.NET 中標準的事件處理者格式如下:

void handler(object source, EventArgs arg)  {
  //.....
}

另外,因為大部分簡單的事件處理,並不會使用到 EventArgs 這個基礎型別來傳送參數給事件處理者,所以 .NET 內部預先定義了一個委派型別 EventHandler, 所使時,就不用再宣告 delegate 了。直接可以用 public event EventHandler SomeEvent; 進行事件的宣告。

c# 還有支援前置處理器(preprocessor) 和命名空間(namespace)。
前置處理器的使用方式。很像 c 語言所支援的,是指加在程式中以 # 開頭的指令,但是不支援定義常數和巨集的部分,只支援定義記號,像是 #define TEST。namespace 的用法,有點像是 java package 的觀念,為了避免相同名字的類別和變數互相衝突,大致上的使用方式如下。

namespace  Counter {
    class Count {
        //.....
    }
}

目前定義了以下幾個前置處理器指令:
#define symbol
#undef symbol
#if symbol-expression
#elif
#else
#endif
#region region-name
#endregion
以上這 2 個是用在 Visual Studio IDE 中,用來定義一個可延伸或精簡的區域
#warning warning-message
#error error-message //compiler 碰到時,產生 error message,並停止運作
#line number “filename"

同時,也有巢狀的命名空間,二個相同名字的命名空間,也會自動的合併起來。

在使用的時候,使用 using 可以引入命名空間,這樣在使用命名空間中的類別名稱時,可以不用打整個完整的命名空間+類別名,只要打類別的名字就可以了。
using 的另一種型式是 using alias = name 使用例子如下:

using Count = Counter.CountDown;

這樣就可以直接用 Count 代替 Counter.CountDown 這麼長的名字了。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: