2014年7月30日 星期三

在Windows XP設定dir的alias為ls

之前使用Windows的時候常常會打錯指令,在cmd中輸入ls。今天查到方法可以設定dir的alias。只要使用Windows內建的tool叫doskey就可以設定macro。
例如:
doskey ls=dir
不過這個設定並不會自動儲存,下次再開啟cmd後就會消失。因此我們需要把設定存在一個設定檔中,來自動設定,步驟如下:
  1. 把alias存成一個檔案,這邊假設我們把檔案存在c:\bin\cmd_autoruns.cmd,檔案內容格式如下:
    doskey ls=dir
    doskey ..=cd ..
  2. 建立一個batch檔,來設定自動執行剛才我們建立的指令,檔名取為set_cmd_autorun.cmd,檔案內容如下
    reg add "hkcu\software\microsoft\command processor" /v Autorun /t reg_sz /d c:\bin\cmd_autoruns.cmd
  3. 點擊剛才建立的batch檔,完成設定

2014年7月11日 星期五

[C#] Extension Method

C#3.0之後提供extension method這個功能,簡單來說就是讓你在現有的type中加入新的的method。一般是用在內建型態或是sealed class上,一般的type我們可以透過繼承的方式來加入新method,但是我們沒辦法修改內建型態,因此extension method就派上用場了。
Extension會有以下這些特徵:
  1. 必須在非generic的static class中,並且宣告為static method
  2. Method最少要有一個參數
  3. 第一個參數用this關鍵字宣告
  4. 第一個參數不能有this以外的修飾詞,例如out或ref
  5. 第一個參數型態不能是pointer type
以下是一個extension method的範例
public static class StringHelper
{
    public static bool IsCapitalized (this string s)
    {
        if (string.IsNullOrEmpty(s)) return false;
        return char.IsUpper(s[0]);
    }
}
IsCapitalized就是string type的extension method,我們可以這樣使用它:
Console.WriteLine("Test".IsCapitalized());
其實這段呼叫在編譯時候會被修改成去呼叫static method,背後的細節被compiler隱藏起來。
Console.WriteLine(StringHelper.IsCapitalized("Test"));
總結一下,extension method背後會做以下轉換:
arg0.Method(arg1, arg2, ...);  // Extension method call
StaticClass.Method(arg0, arg1, arg2, ...);  // Static method call
Interface也可以被extended,範例如下:
public static T First (this IEnumerable sequence)
{
    foreach (T element in sequence)
        return element;

    throw new InvalidOperationException("No elements!");
}
...
Console.WriteLine("Test".First());   // Output: T