2014年5月18日 星期日

.NET 與 JavaScript 擴充方法(extension methods)

在BASIC中 Left(String, n) 是取字串 String 左方 n 個字元,  例如:Left("A123456789", 5) 會傳回 "A1234"。
在 C# 與 JavaScript 我們也可以實作 Left 函數,但這樣必須將 Left 函數寫到模組(Module)裡,或者寫成類別(或靜態類別)的方法,但在使用上並不直覺,如果可以像直接操作「"A123456789".Substring(...)」一樣,可以用 "A123456778".Left(5) 清楚對象的操作,而不是叫用全域函數,感覺是不是比較直觀。
C# 的擴充方法
幸好 .Net 自3.0 開始支援擴充方式( JavaScript 可透過 property 達到類似的目的),C# 要達成擴充方法有幾項限制:
1. 必須是 static 類別
2. 方法本身必須是 static
3. 擴充方法只適在基礎型別(如 String, Int, ...)
3. 只要引用定義有擴充方法的類別,擴充方法即可生效

如何撰寫C#的擴充方法(以 字串 Left 為例)
namespace myExtensionMethods
{
    public static class myExtension
    {
        public static string Left(this string s, int length)
        {
            length = Math.Max(length, 0);

            return (s.Length > length ?  return s.Substring(0, length) :  s);

        }
     }
 }
重點在於方法的第一個參數要用  this 型別(例如:this string)

如何使用擴充方法
1. 請先在專案裡引用 myExtension   的 .dll
2. 在要使用擴充方法的原始碼:  using myExtensionMethods;
只要完成上面兩項,則在程式碼裡即可使用  "A123456789".Left(5);

如果問我「擴充方法有什麼好處?」,除了直覺性高外,好像也想不出其他理由,所以使用「擴充方法」純粹個人喜好!

JavaScript 的擴充方法
Javascript 也有類似 .Net 擴充方法的功能,主要是透過物件的 property  來擴充功能
    String.prototype.Left = function(iLen)  {
        return (!iLen || iLen > length ? this.toString() : this.slice(0, iLen));
    }

只要有引用上面的方法,之後的Javascript 也可以直接用 "A123456789".Left(5);

所以透過擴充法,是不是讓 C# 與 Javascript 使用相同(似)的語法就可以處理相同的事情!

沒有留言:

張貼留言