在BASIC中 Left(String, n) 是取字串 String 左方 n 個字元, 例如:Left("A123456789", 5) 會傳回 "A1234"。
在 C# 與 JavaScript 我們也可以實作 Left 函數,但這樣必須將 Left 函數寫到模組(Module)裡,或者寫成類別(或靜態類別)的方法,但在使用上並不直覺,如果可以像直接操作「"A123456789".Substring(...)」一樣,可以用 "A123456778".Left(5) 清楚對象的操作,而不是叫用全域函數,感覺是不是比較直觀。
在 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){
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);
}
}
}
如何使用擴充方法
1. 請先在專案裡引用 myExtension 的 .dll2. 在要使用擴充方法的原始碼: using myExtensionMethods;
只要完成上面兩項,則在程式碼裡即可使用 "A123456789".Left(5);
如果問我「擴充方法有什麼好處?」,除了直覺性高外,好像也想不出其他理由,所以使用「擴充方法」純粹個人喜好!
JavaScript 的擴充方法
Javascript 也有類似 .Net 擴充方法的功能,主要是透過物件的 property 來擴充功能
String.prototype.Left = function(iLen) {
return (!iLen || iLen > length ? this.toString() : this.slice(0, iLen));
}
return (!iLen || iLen > length ? this.toString() : this.slice(0, iLen));
}
只要有引用上面的方法,之後的Javascript 也可以直接用 "A123456789".Left(5);
所以透過擴充法,是不是讓 C# 與 Javascript 使用相同(似)的語法就可以處理相同的事情!
沒有留言:
張貼留言