程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Visual C# 2005搶先預覽

Visual C# 2005搶先預覽

編輯:C#入門知識
  注意:本文是在產品發行前編寫的,因此無法保證內文細節與實際產品完全相符。本文的信息僅代表文件出版時產品的情況,只可作為計劃時參考。文件中信息如有變更恕不另行通知。
 
  簡介

  Microsoft Visual Studio 的下一版 (代號為 Whidbey) 明顯增強了 C# 的功能,包括創新的語言結構、新編譯器功能、大幅提升了開發人員的生產力、加強調試功能等等。在程序語言創新功能方面,C# Whidbey 發行版本支持泛型(Generics)、iterator (迭代器)、部份類型,以及匿名方法。 Whidbey 的新編譯器功能可讓開發人員直接在代碼中禁用編譯器警告,或驗證 ECMA/ISO 一致性。 Whidbey 也將具有數種生產力增強功能,包括重構 (refactoring)、 代碼展開、代碼格式化、增強 IntelliSense 等許多功能。調試功能也有加強,新功能包括增強的 datatips (信息快顯)、調試的可視化工具、設計時的表達時式評估等等。 本文僅概括地介紹 Whidbey 中的新功能,我們將繼續加入客戶所需的新功能。

  語言創新功能

  泛型

  泛型是 Whidbey 中 C# 語言最主要的新功能之一。 C# 的泛型可允許類、結構、接口與方法,依其存儲與處理的數據類型加以參數化。 泛型所以好用,因為許多常見類別與結構,可依其存儲與處理的數據類型加以參數化。這些稱為“泛型類聲明”和“泛型結構聲明”。同樣地,許多 接口定義合約,可依其處理的數據類型加以參數化。這些稱為“泛型接口聲明”。方法也可依其類型加以參數化,以便實現“泛型算法”,這些稱之為“泛型方法”。

  在下面的例子中,我們創建了一個 Stack 泛型類聲明,其中指定了類型參數,叫做 ItemType,在聲明之後的尖括弧中予以聲明。 泛型 Stack 類實例不會強迫在對象之間來回轉換,而是接受創建時的類型,並不加轉換地存儲該類型的數據。 ItemType 類型參數的作用有如占位符,直到使用時才指定實際 類型。請注意,ItemType 用於內部項目數組的元素類型、Push 方法的參數類型,以及 Pop 方法的返回類型:

public class Stack
{
 private ItemType[ ] items;
 public void Push(ItemType data) {...}
 public ItemType Pop() {...}
}
  如下列簡短例子所示,使用 Stack 泛型類聲明時,可指定泛型類所用的實際類型。 在此種情況下,我們通過在名稱後的尖括號內 指定“類型形參”來要求 Stack 使用 int 類型:

Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();
  這樣,我們便創建了一個新的“構造類型”Stack<int>,其中 Stack 聲明內部的每個 ItemType 將被取代為提供的 int 類型形參。事實上,建立 Stack<int> 的新實例時,為了存儲效率的考慮,項目數組的原本存儲類型現在為 int[],而非 object[]。此外,當將 int 推壓到堆棧時,不再需要對它進行轉換。甚至,從堆棧取出項目時,不再需要明確地將它轉換為適當的類型,因為 Stack 這個特別的類在其數據結構中,將 int 以其原本的類型存儲。

  若要存儲非 int 項目至 Stack,必須由 Stack 建立不同的構造類型,並指定新類型形參。假如有一個簡單的 Customer 類,且我們希望使用 Stack 來存儲。要達到這個目的,只需使用 Customer 類作為 Stack 的類型形參,就可輕松地重復使用代碼:

Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
Customer c = stack.Pop();
  當然,一旦建立了以 Customer 為類型形參的 Stack,則僅可以存儲 Customer 對象 (或派生自 Customer 類的對象)。 泛型提供“強類型檢驗”(strong typing),亦即我們無法再以下列不當方式將整數存儲 在 stack 中:

Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
stack.Push(3); // compile-time error
Customer c = stack.Pop(); // no cast required
  部分類型

  部份類型允許單一類型,如一個類,分散至多個文件中。此功能對 Visual Studio 等代碼生成器最為有用,它能將生成的代碼與使用用者編寫的代碼分開存儲在不同的文件中。藉由此方式,設計工具可以輕易地剖析與重新產生 代碼,而不會影響到用戶所編寫的代碼。例如:

// Form1Designer.cs
public partial class Form1: System.Windows.Forms.Form
{
 // 設計器代碼
 void InitializeComponent() { ... }
}

// Form1User.cs
public partial class Form1
{
 // 用戶代碼
 void Mouse_Click(object sender, MouseEventArgs e) { ... }
}

  匿名方法

  匿名方法可視為將代碼塊作為參數來傳遞的功能。一般而言,匿名方法可以在期望使用委托的任何地方被替換。以下為最簡單的例 子:

button1.Click += delegate { MessageBox.Show("Click"); };
  在此需要注意一些事項。首先,以內聯方式編寫方法是合法的。其次,返回類型或方法參數都沒有描述。第三,delegate 關鍵字被用來位移此結構。在此並未列出返回類型,因為編譯器會自行“推斷”。 亦即編譯器已知預期的項目(EventHandler),因此將檢查所定義的匿名方法是否可被轉換成該方法。

  在先前的例子中,您可能會發現並未列出參數。 這是因為代碼塊中並不需要這些參數。若要使用這些參數,聲明將如下所示:

button1.Click += delegate(object sender, EventArgs e)
{
 MessageBox.Show(sender.ToString());
};
  請注意,必須指定類型與參數名稱。

  Iterator

  Iterator 類似於 C# 中的 foreach 語句,可簡化集合裡的重復 (iterate) 過程。目前,使用 foreach 關鍵字可輕易地在集合內進行重復。不過,編寫使用 foreach 的集合,必須實現 IEnumerable 與 IEnumerator 接口,並且分別建立 Enumerator 類/結構。Iterator 可減輕這類例行代碼的工作負擔,並可讓框架開發人員輕易地公開可列舉的集合。例如:

class List: IEnumerable
{
 private T[] elements;
 public IEnumerator GetEnumerator()
 {
  foreach (T element in elements)
  {
   yield element;
  }
 }
}
  上面代碼使用了一個新的關鍵字 yield。yield 僅可用於返回 IEnumerator、IEnumerable 或其它泛指對等類型的方法。Iterator 也可以參數的形式來命名與傳遞,不過,在大部份 情況下,命名的 iterator 將返回 IEnumerable,而非 IEnumerator。例如:

class List
{
 private T[ ] elements;
 public IEnumerable Range(int from, int to)
 {
  while (from < to) yield elements[from++];
 }
}
  別名限定詞 (全局命名空間限定詞)

  代碼產生器目前所面臨的問題之一是如何確保不要干擾用戶所編寫的代碼,或 Visual Studio 等代碼產生工具所建立的代碼。一般建議代碼產生器盡可能嚴格使用合格的類型。若要在 C# 中嚴格使用合格的類型將面臨一個問題,也就是無法在根命名空間搜尋類型。為了解決此問題, 全局命名空間限定詞引入了“::”運算符,作為命名空間或類型名稱前置詞。如此,開發人員能在代碼中以明確的方式 引用根命名空間,如下所示。

namespace Acme
{
 namespace System
 {
  class Example
  {
   static void Main()
   {
    // In Visual Studio 2003, looking up
    // System.Console.WriteLine would have
    // started in the Acme.System namespace.
    ::System.Console.WriteLine("Hello");
   }
  }
 }
}
  靜態類

  靜態類具有僅含靜態方法的私有構造函數,可用來取代建立密封類(sealed class)的設計模式。將靜態修飾詞(static)置於類聲明中,便可 表示靜態類。例如:

public sealed class Environment
{
// Keep class from being created
private Environment() { }
}
  現在可用下列方式編寫:

public static sealed class Environment
{
...
}
  利用靜態類取代上述設計模式的優點,在於如果不慎聲明“實例方法”,編譯器可報告錯誤。

  編譯器增強功能

  內嵌警告控制

  Whidbey 另一項新功能可讓開發人員借助指定的編譯器指令,控制是否要報告特定代碼區域的警告信息。此指令與 #pragma 語句相當類似。以下 是使用 pragma 關鍵字的例子,可使編譯器針對特定代碼塊,禁用錯誤報告。

#pragma warning disable 135
// Disable warning CS135 in this block
#pragma warning restore 135
  命令行選項

  Whidbey 包含數項編譯器新選項。 以下是每種新選項的簡要說明 :

  /warnaserror:在 Visual Studio .NET 2003 的 warnaserror 命令行選項中,可讓開發人員將所有編譯器警告皆以錯誤來處理。在 Whidbey 中,此功能進一步擴充,讓開發人員控制是否要將特定的警告視作錯誤來處理。以下例子示范如何標示 618 之外的所有警告,將之視為錯誤來處理。

csc /warnaserror /warnaserror-:618?...

  另一種方式,則是如下列例子所示,將單一警告標示為錯誤:

csc "/warnaserror:1595 ...
/errorreport:<string>:errorreport

  命令行選項控制 Dr. Watson 產生編譯器的報告。

  有關 Dr. Watson 的詳細信息,參見:

www.microsoft.com/technet/prodtechnol/winxppro/proddocs/drwatson_setup.asp (英文)。

  以下為 errorreport 選項可用的參數:

/errorreport:prompt:此選項顯示關於錯誤信息的對話框。

/errorreport:send: 此選項指示當編譯器發現內部錯誤時,“毋須”用模式對話框提示用戶。不過,編譯器仍需繼續編譯,並傳送錯誤報告。原本出現在 對話框中的文字,將顯示在命令行。

/errorreport:none:此選項指示毋須將錯誤信息傳送至 Microsoft。此行為同樣見之於 Visual Studio 2002 與 Visual Studio 2003,是默認選項。
 
/langversion:<<string>:langversion 命令行選項的主要功能 是啟用嚴格的 ECMA/ISO 一致性。當此選項設為 ISO-1,針對 Whidbey 所有不符合標准的功能,編譯器皆報告錯誤。

/keycontainer、/keyfile、/delaysign:這些選項用來取代同一名稱的屬性,以便在指派命令行形參時有更大的彈性。

  生產力增強功能

  重構

  C# Whidbey IDE 現在可支持重構。“重構”可讓開發人員在重建代碼時,自動處理許多常見的工作。有關重構的詳細信息,參見:www.refactoring.com (英文)。

  例如,開發人員利用內建的重構支持,可使用重新命名重構,在原始代碼中自動重新命名變量的過程。

  目前在 Whidbey Technical Preview 中可用的重構功能為:

  撷取方法
  重新命名
  撷取接口
  封裝欄位
  變更方法簽署
  取代 Arraylist

  下圖示范如何在代碼編輯器中,從上下文菜單中直接使用重構功能。


圖一 重構器菜單

  調用 [重命名] 重構時,將會出現 [預覽變更] 對話框。此對話框列出變量名稱在注釋或代碼中的位置。[預覽變更] 對話框的上下文菜單也可讓用戶直接跳至 引用該變量的原始代碼位置。


圖二 重命名重構的預覽變更
  代碼展開

  代碼展開可填補(fill-in-the-blank)代碼片斷,減少重復性工作的輸入動作,並簡化在應用程序中加入 foreach 語句等常見構造的過程。開發人員若要存取代碼展開功能,可利用 上下文菜單並選取展開,或是直接利用可配置的代碼展開快捷鍵。


圖三 代碼展開
  下面的代碼展開例子示范了使用 forr 代碼展開,以相反的順序往返集合。 光標置於醒目提示的黃色文字區域,此處可作為用戶配置值的占位符。下面例子中,forr 代碼展開使用倒序順序讀取 myList 泛型集合中的每個元素。


圖四 forr 代碼展開
  代碼展開為可擴充的 XML 文檔,可由用戶定制或創建。


圖五 "forr" 代碼擴充的 XML 格式

  格式化

  原始代碼的格式化因人而異,Visual Studio Whidbey 包含數種選項,可讓開發人員自定義和控制原始代碼的格式。這些格式化選項包括大括號、間距、換行與對齊。您可以選擇讓 IDE 自動格式化代碼,或僅格式化指定的原始代碼區段。如圖六所示,它示范了將大括號置於新的一行,並可視化預覽所選格式化的選項。


圖六 格式化選項與預覽窗格

  配置文件

  雖然開發人員可充分自定義 IDE 的字體、窗口與格式化,但若要與團隊成員共享配置,或要將配置轉移至其它電腦,則是相當困難的工作。Whidbey 的新增功能可讓您輕易地導入與導出 IDE 配置,以便在電腦之間轉移,或團隊成員彼此共享。


圖七 導入與導出配置對話框

  增強 IntelliSense

  IntelliSense 已增強功能,以便識別泛型類型。在下圖中,IntelliSense 了解 myList 代表整數列表,並提供彈出式菜單說明,指出 myList 的 Add 方法期望接受的整型數據類型。


圖八 Intellisense 理解泛型類型

  IntelliSense 也增強了有關異常處理的能力。加入 try/catch 區塊時,catch 處理例程將自動過濾可用的選項,僅顯示異常類型的清單。


圖九 處理異常的 IntelliSense

  IntelliSense 也增強了有關屬性的功能。在下列例子中,加入屬性時將過濾可用的選項,僅顯示屬性類型清單。


圖十 處理屬性的 IntelliSense

  用戶類型與關鍵字彩色顯示

  復審原始代碼時,區分類型與關鍵字最好的方法便是在 IDE 中以不同顏色來顯示。Whidbey 的新功能可用特殊的顏色來顯示用戶類型與關鍵字,從而加強了原始代碼的可讀性。


圖十一 以不同顏色顯示用戶類型與關鍵字

  新的生成(Build)系統

  Whidbey 的生成系統已大幅加強。新生成系統稱為 MSBuild,使用可擴充的機制來描述生成的過程。用戶可利用 XML 編寫自定義工作,自行建立其生成系統。以下例子示范一個簡單的 MSBuild 文檔,其編譯工作調用 C# 編譯器,編譯所有擴展名為 .cs 的文件。

- <Project>
<Item Type="Compile" Include="*.cs" />
- <Target Name="Build">
<Task Name="Csc" Sources="@(Compile)" />
</Target>
</Project>

  缺省可搜尋隱藏文字

  對於 [尋找和替換] 窗口最常見的要求,是希望改變默認設置,以便缺省設置可搜尋已摺疊的文字 (例如,區域內的文字)。在 Visual Studio 2003 中,缺省設置不能搜尋隱藏文字,Whidbey 缺省設置則可搜尋隱藏文字。


圖十二 在尋找和替換對話框中搜尋隱藏文字

  對象浏覽器的改進

  開發人員經常使用對象浏覽器來檢視數據類型,許多開發人員希望加入結果過濾功能。Whidbey 的對象浏覽器可讓開發人員根據命名空間、對象類型、字母順序等等條件來過濾與排序數據。


圖十三 對象浏覽器的改進

  更易使用的窗口停靠功能

  為了讓在 IDE 中更易使用窗口停靠功能,現在提供了透明向導,可用來將窗口停靠於 IDE 的左、右與底端。


圖十四 停靠窗口

  IDE 的自動存儲功能

  為了避免遺失信息 (例如,不小心關閉尚未保存修改的文件),IDE 現在可定期自動存儲您的工作。若 IDE 當掉,重新啟動後,將詢問您是否要復原您的工作。


圖十五 自動保存文件

  變更追蹤

  變更追蹤可讓您輕易地看出存儲與未存儲代碼之間的差異。

  在下圖中,您將發現最左邊窗格某些區段的代碼以不同顏色來顯示。以黃色顯示的代碼,代表尚未存儲的新代碼;以綠色顯示的代碼,代表已存儲的新代碼。既非黃色也非綠色的代碼,代表一開啟文件時便已存在的代碼。


圖十六 變更追蹤

  新的 Windows Forms 控件

  Whidbey 的 Windows Forms 新增數種控件,從改進的數據顯示控件 (例如,GridView),到全新的控件,如可播放音樂的 Sound 控件),以及可自定義菜單的 Winbar 控件。


圖十七 Winbar 控件

  新 Web Forms 控件

  ASP.NET 加強了數種功能,可大幅提升開發人員的生產力。這些功能部份包含在 ASP.NET 的新控件類中,例如,“個人化”、“安全性”、“驗證”與“浏覽”。

  控件對齊

  在 Whidbey 中,在設計工具中更容易對齊控件。在下列例子中,當用戶拖曳 button 2 時,將出現一組對齊線,以視覺化的方式顯示 button 1 如何對齊 button 2。


圖十八 對齊控件

  控件的智能標簽

  控件中加入了“智能標簽”,用來顯示與該控件關聯的常見工作,例如,格式化與連接數據源。


圖十九 控件的智能標簽

  建立 Web 項目更快捷

  若要在 Whidbey 中建立 Web 項目,不需要先行安裝 IIS。只要選取要建立的網站,Visual Studio 可讓您在文件共享點建立網站,以便在本機上執行與調試。

  Yukon 項目支持

  Visual Studio Whidbey 也支持生成 SQL Server 下一版 (代號為 Yukon) 的應用程序。


圖二十 建立 SQL Server 的 Yukon 項目

  調試工具增強功能

  增強 Datatips

  在 Visual Studio .NET 2003 的調試模式中,只要將光標置於簡單的變量上 (例如,字符串),便可顯示變量值。Whidbey 大幅增強此功能,以處理更復雜的類型。在下圖中,Datatips 顯示復雜類型的信息,並可詳細顯示該類型的層次信息。


圖二十一 增強的 Datatips

  可視化工具

  在 Visual Studio .NET 2003 中,要在調試工具中檢視 Datasets、bitmaps 等復雜類型並不容易。可視化工具可在調試模式中,以 可視化的方式來表示數據。例如,可依下圖所示的方式,直接從自動變量窗口(Autos Window)中選取 XML 可視化工具,以便以可視化的方式來表示 XML 字符串的內容。可視化工具可加以擴充,讓開發人員與組件供應商可為自定義類型自行建立可視化的方式。


圖二十二 可視化工具選項


圖二十三 XML 可視化工具

  新的符號服務器選項

  若要在 Visual Studio 2003 中使用符號服務器,必須配置如下的系統環境變量:

_NT_SYMBOL_PATH=srv*E:\Cache\Symbols*http://msdn.microsoft.com/download/symbols;

  這必須在調試之前執行。在 Whidbey 中,比較容易配置多個符號服務器位置,以及配置本機符號快取的路徑。您可以在進入中斷模式後再配置符號 服務器,當您知道調試符號尚未載入時,此功能相當有用。


圖二十四 符號服務器選項

  設計時表達式評估

  在 Whidbey 中,即時窗口(Immediate window)可用來在設計時評估表達式,而毋須編譯與執行應用程序。 在下面例子中,直接從即時 窗口調用 Add 方法,毋須離開設計時環境。


圖二十五 設計時在即時窗口中評估方法

  可配置的安全權限

  Whidbey 可讓開發人員配置不同的安全權限來調試應用程序,簡化以不同安全特性認證信息來測試的過程。


圖二十六 可配置的安全權限

  小結

  Visual Studio Whidbey 建立在 Visual Studio 2002 與 Visual Studio 2003 的成就之上,讓開發人員具有更高的生產力。包括新語言構造、編譯器功能、生產力增強功能,以及調試工具增強功能等等,使得開發人員能夠以更短的時間建立功能更強大的應用 程序,並專注於編寫代碼。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved