C#3.0 新特性預覽

來源:互聯網
上載者:User
來源:van''s zone - 部落格園
  微軟最近的動作頻繁,C#2.0規範才剛推出不久,我還沒來的及完全消化C#2.0中的所有新特性,而今又推出了C#3.0,在短短几年中,微軟就對C#進行了兩次大的升級,為C#加入了許多新的特性,從而使C#變得更加強大也更加現代了。下面我就把C#3.0中的新特性的要點列出來,以供大家快速探索。
  第一個特性:隱式類型化本地變數

  這個特性非常簡單,有些JavaScript的影子,我們可以統一使用使用"var"關鍵字來聲明局部變數,而不再需要指明變數的確切類型了,變數的確切類型可通過聲明變數時的初始值推斷出來。這樣一來,可以大大簡化我們聲明局部變數的工作量了,下面是一個例子:

1: class LocalVariables : AppRunner.AbstractApplication
2: {
3: public override void Run()
4: {
5: var intValue = 5;
6: var stringValue = "This is a string";
7: var customClass = new LocalVariables();
8:  var intArray = new int[3] { 1, 2, 3 };
9:
10: foreach (var value in intArray)
11: Console.WriteLine(value);
12: }
13: }
  上面的代碼將被解析成:

1: class LocalVariables : AppRunner.AbstractApplication
2: {
3: public override void Run()
4: {
5: int intValue = 5;
6: string stringValue = "This is a string";
7: LocalVariables customClass = new LocalVariables();
8: int[] intArray = new int[3];
9:
10: foreach (int value in intArray)
11: Console.WriteLine(value);
12: }
13: }
  要特別注意的是,由於變數的類型是通過變數初始值推斷而來的,所以在聲明變數的同時必需為變數指定初始值。並且,變數並不是沒有類型的,變數一旦初始化之後,類型就確定下來了,以後就只能儲存某種類型的值了,比如上面的stringValue的類型經推斷為string,所以該變數就只能儲存string類型的值了。
  第二個特性:匿名型別

  有些時候我們需要臨時儲存一些運算的中間結果,特別是當這些中間結果是由多個部份組成時,我們常常會去聲明一個新的類型,以方便儲存這些中間結果。表面上看起來這很正常,而細想之後就會發現,這個新類型只服務於這個函數,其它地方都不會再使用它了,就為這一個函數而去定義一個新的類型,確實有些麻煩。

  現在,C#3.0中的匿名型別特性就可以很好的解決上面提到的問題,通過匿名型別,我們可以簡單使用new { 屬性名稱1=值1, 屬性名稱2=值2, ..... , 屬性名稱n=值n }的形式直接在函數中建立新的類型,看下面這個例子:

1: class AnonymousType : AppRunner.AbstractApplication
2: {
3: public override void Run()
4: {
5: var anonymousType1 = new {
6: CardNumber = "10001", Name = "van's", Sex = true
7: };
8:
9: Console.WriteLine(anonymousType1.CardNumber);
10: Console.WriteLine(anonymousType1.Name);
11:
12: var anonymousType2 = new {
13: CardNumber = "10002", Name = "martin", Sex = true
14: };
15:
16: anonymousType2 = anonymousType1;
17: }
18: }
  在新類型中只能有欄位成員,而且這些欄位的類型也是通過初值的類型推斷出來的。如果在聲明新的匿名型別時,新類型的欄位名、順序以及初始值的類型是一致的,那麼將會產生相同的匿名型別,所以上例中anonymousType1和anonymousType2的類型是相同的,自然能進行anonymousType2=anonymousType1的賦值。
  第三個特性:隱式類型化數組

  這個特性是對隱式類型化本地變數的擴充,有了這個特性,將使我們建立數組的工作變得簡單。我們可以直接使用"new[]"關鍵字來聲明數組,後面跟上數組的初始值列表。在這裡,我們並沒有直接指定數組的類型,數組的類型是由初始化列表推斷出來的。

1: class AnonymousTypeArray : AppRunner.AbstractApplication
2: {
3: public override void Run()
4: {
5: var intArray = new[] { 1, 2, 3, 4, 5 };
6: var doubleArray = new[] { 3.14, 1.414 };
7: var anonymousTypeArray = new[] {
8: new { Name="van's", Sex=false, Arg=22 },
9: new { Name="martin", Sex=true, Arg=23 }
10: };
11:
12: Console.WriteLine(intArray);
13: Console.WriteLine(doubleArray);
14: Console.WriteLine(anonymousTypeArray[0].Name);
15: }
16: }
  上面的代碼中,anonymousTypeArray變數的聲明同時運用了隱式類型化數組和匿名型別兩種特性,首先建立匿名型別,然後再初始值列表,推斷出數組的確切類型。
  第四個特性:物件建構者

  我們在聲明數組時,可以同時對其進行初始化,這樣就省去了很多麻煩,但是在建立類的對象時,這招可就不靈了,我們要麼調用該類的建構函式完成對象的初始化,要麼就手工進行初始化。這兩種方法都不太方便,使用建構函式來對對象進行初始化時,我們為了某種靈活性,可能需要編寫建構函式的多個重載版本,實在是麻煩。

  C#3.0中加入的物件建構者特性,使得對象的初始化工作變得格外簡單,我們可以採用類似於數組初始化的方式來初始化類的對象,方法就是直接在建立類對象的運算式後面跟上類成員的初始化代碼。具體樣本如下:

1: class Point
2: {
3: public int X { get; set; }
4: public int Y { get; set; }
5:
6: public override string ToString()
7: {
8: return "(" + X.ToString() + ", " + Y.ToString() + ")";
9: }
10: }
11:
12: class Rectangle
13: {
14: public Point P1 { get; set; }
15: public Point P2 { get; set; }
16:
17: public Rectangle()
18: {
19: P1 = new Point();
20: P2 = new Point();
21: }
22:
23: public override string ToString()
24: {
25: return "P1: " + P1 + ", P2: " + P2;
26: }
27: }
28:
29: class ObjectBuilder : AppRunner.AbstractApplication
30: {
31: public override void Run()
32: {
33: Point thePoint = new Point() { X = 1, Y = 2 };
34: Console.WriteLine("Point(X, Y) = {0}", thePoint);
35:
36: Rectangle theRectangle = new Rectangle() {
37: P1 = { X = 1, Y = 1 }, P2 = { X = 100, Y = 200 }
38: };
39: Console.WriteLine(theRectangle);
40: }
41: }
  我們在定義Point類的X和Y屬性時,只須寫上該屬性的get和set訪問器聲明,C#編譯器會自動為我們產生預設的get和set作業碼,當我們需要定義簡單屬性時,這個特性非常有用。

  我們以new Point() { X = 1, Y = 2 }語句,輕鬆的完成了對Point類的初始化工作。在建立類的對象時,我們可以按照需要去初始化類的對象,只要在類的建立運算式後跟上要初始化屬性的列表即可,且可以只對需要初始化的屬性賦初值,而無需把所有屬性的初始值都寫上去。

  在theRectangle對象的初始設定式中,我們首先對P1屬性進行初始化,然而P1屬性也是一個自訂的類型,所以P1屬性的初始化是另一個類型(Point)的初始設定式,我們可以這樣的方式來對更加複雜的類型進行初始化。

  未完待續.........

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.