熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

Visual C# 3.0 新特性概覽

2013-11-15 12:49:51  來源: ASP編程 
在發布Visual Studio 和C#之後微軟公司又馬不停蹄的展示了人們所期望的C#的下一代版本C# 盡管C# 並沒有標准化微軟還是在PDC(專業程序員會議)發布了一個預覽版本因此心急的程序員可以看到一些所期望的特性這也是本文所討論的主要內容

  ·隱式類型本地變量

  ·匿名變量

  ·擴展方法

  ·對象和Collection初始化符

  ·Lambda表達式

  ·查詢表達式

  ·表達式樹

  隱式類型本地變量

  C# 引進了一個新的關鍵字叫做VarVar允許你聲明一個新變量它的類型是從用來初始化符變量的表達式裡隱式的推斷出來的也就是說如下的表達式是有效的格式

var i = ;

  這一行使用了來初始化符變量i注意這裡i被強類型到整型它不是一個對象或者VB的變量也不帶有其他對象或者變量的負載

  為了保證使用var關鍵字進行聲明的變量的強類型特性C#要求你將賦值(初始化符)放到和聲明(聲明符)的同一行同樣初始化符必須是一個表達式不能是一個對象或者collection初始化符也不能為null如果多個聲明符對同一個變量存在那麼它們必須在編譯時被視作相同類型

  另一方面隱式類型數組可以使用一點不同的格式如下所示

var intArr = new[] {} ;
  上面一行的代碼將聲明intArr為int[]

  var關鍵字允許你使用匿名類型的實例因而這些實例就是靜態類型的所以當你創建一個包含一組數據的對象的實例的時候你不必要預先定義一個類可以同時支持這個結構和在一個靜態類型變量裡的數據

  匿名變量

  C# 使得你可以靈活的創建一個類的實例而無需先寫這個類的代碼所以你可以這樣寫代碼

new {hair=black skin=green teethCount=}
  上一行代碼通過new關鍵字的幫助創建了有三個屬性的類型hairskin和teethCount這樣C#編譯器就會創建一個類如下

class __Anonymous
{
 private string _hair = black;
 private string _skin = green;
 private int _teeth = ;
 public string hair {get { return _hair; } set { _hair = value; }}
 public string skin {get { return _skin; } set { _skin = value; }}
 public int teeth {get { return _teeth; } set { _teeth = value; }}
}

  事實上如果另外一個滿足了相同的名稱和類型順序的匿名類型也被創建了編譯器也會聰明的只創建一個匿名類型來支持兩個實例來使用同樣因為實例都是一個類的簡單實例它們可以進行互換因為類型實際上是一樣的

  現在你擁有了這個類但是你還需要一些東西來支持以上的類的某個實例這就是var關鍵字的作用它讓你擁有一個以上匿名變量的實例的一個靜態類型實例這裡有一個簡單好用的匿名類型的使用例子

var frankenstein = new {hair=black skin=green teethCount=}

  擴展方法

  擴展方法使你能夠使用額外的靜態方法來擴展各種類型不過它們是非常有限的也只能在實例方法不足夠的情況下才作為候補使用

  擴展方法只能在靜態類中被聲明並且以關鍵字this放在方法的第一個參數前來標識如下就是一個有效的擴展方法的例子

public static int ToInt(this string s)
{
 return ConvertToInt(s) ;
}

  如果一個包含以上方法的靜態類被使用using關鍵字引進ToInt犯法將會出現在已有的類型中(雖然比現有的實例方法優先級低)你可以這樣編譯和執行代碼

string s = ;
int i = sToInt();

  這使得你可以充分享用各種以有的內建的或者定義的類型的擴展特性並且給它們加上新的方法

  對象和Collection初始化符

  C# 被希望來允許你包含一個初始化符從而指定一個新創建的對象或者collection的初始值這使得你能夠一步結合聲明和初始化

  舉例來說你可以這樣定義CoOrdinate類

public class CoOrdinate
{
 public int x ;
 public int y;
}

  你然後可以使用一個對象初始化符來聲明和初始化一個CoOrdinate對象就像這樣

var myCoOrd = new CoOrdinate{ x = y= } ;

  也許你要問為什麼不要像下面這樣做呢?

var myCoOrd = new CoOrdinate( ) ;

  注意我從來沒有為我的類聲明過一個接受兩個參數的構造器事實上使用一個對象初始化符來初始化對象等同於調用一個無參數(缺省)構造器並且給相關量賦值

  類似的在C#裡你可以輕松的用一種更加簡潔的方式給collection賦值如下的C# 的代碼

Listanimals = new List();
animalsAdd(monkey);
animalsAdd(donkey);
animalsAdd(cow);
animalsAdd(dog);
animalsAdd(cat);

  可以縮短為

Listanimals = new List{monkey donkey cow dog cat } ;

  Lambda表達式匿名方法的濃咖啡

  C# X允許你在方法裡寫代碼段你可以輕松的使用委托(delegate)來調用委托無疑是有用的並且可以在框架裡任意使用但是在很多實例裡你必須為了使用它而聲明一個方法或者一個類因此為了給你一個更加容易和簡潔的編碼方式C# 允許你使用匿名方法替換標准調用到委托如下代碼可以在NET或者更早的版本看到

class Program
{
 delegate void DemoDelegate();
 static void Main(string[] args)
 {
  DemoDelegate myDelegate = new DemoDelegate(SayHi);
  myDelegate();
 }
 void SayHi()
 {
  ConsoleWriteline(Hiya!!) ;
 }
}

  在C# 使用匿名方法你必須這樣重寫代碼:

class Program
{
 delegate void DemoDelegate();
 static void Main(string[] args)
 {
  DemoDelegate myDelegate = delegate()
  {
   ConsoleWriteline(Hiya!!);
  };
  myDelegate();
 }
}

  盡管匿名方法對基於方法的委托調用更進了一步但是Lambda表達式允許你用更加簡潔功能性的格式寫匿名方法

  你可以將Lambda表達式作為一個參數列表來編寫代碼跟在=>後面再跟上一個表達式或者語句以上的代碼可以用如下的代碼替換

class Program
{
 delegate void DemoDelegate();
 static void Main(string[] args)
 {
  DemoDelegate myDelegate = () =>ConsoleWriteLine(Hiya!!) ;
  myDelegate();
 }
}

  盡管Lambda表達式顯得更加簡潔實際上他們也是一個匿名方法的功能性超集特別的Lambda表達式提供了如下的額外的功能

  ·它們允許參數類型是被推斷的匿名方法要求你必須清楚的陳述每個類型的狀態

  ·它們可以支持查詢表達式或C#語句

  ·它們可以被看作使用表達式樹的數據這是不能用匿名方法來做的

  查詢表達式

  這個特性使得你可以在C#中使用SQL類似風格的語句也被稱作LINQ(語言集成查詢)

  舉例來說你可以這樣描述你的數據

ublic class CoOrdinate
{
 public int x ;
 public int y;
}

  在C#裡你可以像下面一樣輕松的聲明一個數據庫表的邏輯等同式

// Use Object and collection initializers
Listcoords = ;

  現在你的數據可以作為一個collection來實現 IEnumerable你可以輕松的像如下方式查詢數據

var filteredCoords =
from c in coords
where x ==
select (cx cy)

  在以上SQL風格的格式中fromwhereselect是查詢表達式用到了C# 的一些特性如匿名類型擴展方法隱式類型本地變量等這樣你可以使用SQL風格的格式將無聯系的數據整合一起來工作

  每個查詢表達式實際上轉變為一個C#的調用

where x ==
  將會轉換為

coordswhere(c =>cx == )

  你可以看到這個看上去很像一個可怕的Lambda表達式和擴展方法C# 還有其他很多關於它們的查詢表達式和規則

  表達式樹

  C# 包含了一個新類型允許表達式能夠當作運行時的數據使用這個類型SystemExpressionsExpression只是一個內存中一個lambda表達式的重新表達結果是你的代碼可以在運行時修改和檢查Lambda表達式

  如下是一個表達式樹的例子

Expressionfilter = () =>ConsoleWriteLine(Hiya!!) ;
  使用如上的表達式樹的方法你可以使用過濾器變量中的各種屬性來檢查樹的內容

  結束語

  C# 提供了一些新的特性使得你可以更輕松的完成一個程序員和架構設計師的工作同時也保持了程序語言的嚴謹和清晰的結構

  C# 目前還處於襁褓中還將在未來的數月中長大但是它所能改變的一切緊靠其強大的後盾NET框架它的體系結構和設計模式值得你的關注
From:http://tw.wingwit.com/Article/program/ASP/201311/21713.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.