擴展方法使你能夠使用額外的靜態方法來擴展各種類型。不過它們是非常有限的,也只能在實例方法不足夠的情況下才作為候補使用。
擴展方法只能在靜態類中被聲明,並且以關鍵字"this"放在方法的第一個參數前來標識,如下就是一個有效的擴展方法的例子:
public static int ToInt32(this string s)
{
return Convert.ToInt32(s) ;
}
如果一個包含以上方法的靜態類被使用"using"關鍵字引進,ToInt32犯法將會出現在已有的類型中(雖然比現有的實例方法優先級低),你可以這樣編譯和執行代碼:
string s = "1";
int i = s.ToInt32();
這使得你可以充分享用各種以有的內建的或者定義的類型的擴展特性,並且給它們加上新的方法。
對象和Collection初始化符
C# 3.0被希望來允許你包含一個初始化符,從而指定一個新創建的對象或者collection的初始值。這使得你能夠一步結合聲明和初始化。
舉例來說,你可以這樣定義CoOrdinate類:
public class CoOrdinate
{
public int x ;
public int y;
}
你然後可以使用一個對象初始化符來聲明和初始化一個CoOrdinate對象,就像這樣:
var myCoOrd = new CoOrdinate{ x = 0, y= 0} ;
也許你要問,為什麼不要像下面這樣做呢?
var myCoOrd = new CoOrdinate(0, 0) ;
注意:我從來沒有為我的類聲明過一個接受兩個參數的構造器。事實上,使用一個對象初始化符來初始化對象等同於調用一個無參數(缺省)構造器並且給相關量賦值。
類似的,在C#3.0裡你可以輕松的用一種更加簡潔的方式給collection賦值,如下的C# 2.0的代碼:
List<string> animals = new List<string>();
animals.Add("monkey");
animals.Add("donkey");
animals.Add("cow");
animals.Add("dog");
animals.Add("cat");
可以縮短為:
List<string> animals = new List<string> {"monkey", "donkey", "cow", "dog", "cat" } ;
Lambda表達式:匿名方法的濃咖啡
C# 1.X允許你在方法裡寫代碼段,你可以輕松的使用委托(delegate)來調用。委托無疑是有用的,並且可以在框架裡任意使用,但是在很多實例裡你必須為了使用它而聲明一個方法或者一個類。因此,為了給你一個更加容易和簡潔的編碼方式,C# 2.0允許你使用匿名方法替換標准調用到委托。如下代碼可以在.Net1.1或者更早的版本看到:
class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = new DemoDelegate(SayHi);
myDelegate();
}
void SayHi()
{
Console.Writeline("Hiya!!") ;
}
}