Visual Studio 2005的那些事兒
原創【51CTO獨家特稿】2010年4月12日是微軟Visual Studio 2010正式版發布的日子。作為Visual Studio的用戶,您是否還記得自己使用的第一個Visual Studio版本?是否還記得CODE出第一段代碼時的興奮?是否還記得那無數個尋找Bug的日日夜夜?51CTO開發頻道帶您一起走進Visual Studio歷史,今天我們要介紹的是——Visual Studio 2008。
前言:4月份就要發布Visual Studio2010了,它的Beta2版我已經從網上下載下來嘗鮮了,對于普通開發人員來說,VS2010與時俱進地增加了很多新的特性以適應新的開發要求,比如增加了多定向支持、并行計算和云計算等,并且在VS2010中也針對VC++做了很大的支持。
作為一個.NET開發人員,我經歷了支持.NET開發的VS的各個版本。下面一個開發人員的角度來談談我對Visual Studio 2005的感受。
記得最早我練習ASP.NET是用Dreamweaver來練習的,C#代碼和HTML都在一個ASPX頁面中,很不方便管理。后來別人向我介紹了VS2002,這是第一個支持.NET開發VS開發工具,它所支持的.NET版本是.NET 1.0。它采用了網頁與代碼分離的模式,是開發人員可以將主要注意力放在業務邏輯處理上,大大提高了開發速度。
Visual Studio 2002推出沒多久微軟就推出了Visual Studio 2003,Visual Studio 2003支持的.NET版本是.NET 1.1,普通的開發人員可能都不知道Visual Studio 2002與Visual Studio 2003及.NET 1.0與.NET 1.1之間有哪些區別。
Visual Studio 2005的當年的推出讓大家馬上感覺到有很大的變化,有點耳目一新的感覺。
在編程語法特性上增加了泛型、可空類型等。
泛型
在Visual Studio 2005以前即使遇到特定集合類型,也只能使用通用的集合類型來存儲,這樣一來在集合中存取值類型數據時存在著裝箱和拆箱過程,而且由于在.NET1.1中集合類型被設計成用來存儲object對象,所以無法對存入的數據的類型進行保證,在Visual Studio 2005中這個得到了解決,那就是泛型集合。
例如,在Visual Studio 2003中的實現:
- /// <summary>
- /// 使用ArrayList的例子
- /// summary>
- public void ArrayListDemo()
- {
- //聲明一個集合,只存儲int類型數據
- ArrayList integerList = new ArrayList();
- integerList.Add(1);//沒有問題
- integerList.Add("one");//可以添加
- for (int i = 0; i < integerList.Count; i++)
- {
- int value = (int)integerList[i];//對第二個數操作時會拋出異常
- }
- }
- 在Visual Studio 2005中的實現:
- /// <summary>
- /// 使用泛型集合的例子
- /// summary>
- public void ListDemo()
- {
- //聲明一個只存儲int類型數據的泛型集合
- List<int> integerList = new List<int>();
- integerList.Add(1);//沒有問題
- //integerList.Add("one");//此句不能編譯通過
- for (int i = 0; i < integerList.Count; i++)
- {
- int value = integerList[i];//此處無需做類型轉換
- }
- }
using關鍵字
using關鍵是用引入命名空間之外,在Visual Studio 2005中還可以用來釋放一些實現了IDisposable接口的類,using 語句按照正確的方式調用對象上的 Dispose 方法,并(在您按照前面所示方式使用它時)會導致在調用 Dispose 時對象自身處于范圍之外。在 using 塊中,對象是只讀的并且無法進行修改或重新分配。using 語句確保調用 Dispose,即使在調用對象上的方法時發生異常也是如此。通過將對象放入 try 塊中,并在調用 finally 塊中的 Dispose,可以獲得相同的結果;實際上,這就是編譯器轉換 using 語句的方式。
比如執行對數據庫的增刪改查操作,在Visual Studio 2005以前我們可能會這么寫:
- /// <summary>
- /// 執行Update/Delete/Insert類型的SQL語句,并返回受影響的行數
- /// summary>
- /// <param name="sql">要執行的Update/Delete/Insert類型的SQL語句param>
- /// <param name="commandType">執行SQL語句的類型,如是文本型還是存儲過程param>
- /// <param name="parameters">執行存儲過程時所需要的參數param>
- /// <returns>returns>
- public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
- {
- //定義SqlConnection對象
- SqlConnection connection = null;
- //定義SqlCommand對象
- SqlCommand command = null;
- //定義執行語句之后受影響的行數
- int affectedRows = 0;
- try
- {
- connection = new SqlConnection(connectionString);
- command = new SqlCommand(sql, connection);
- foreach (SqlParameter parameter in parameters)
- {
- command.Parameters.Add(parameter);
- }
- command.CommandType = commandType;
- connection.Open();//打開連接
- //執行對數據庫的操作
- affectedRows = command.ExecuteNonQuery();
- }
- finally//在finally中執行關閉和釋放SqlConnection及SqlCommand的操作
- {
- if (connection != null && connection.State == ConnectionState.Open)
- {
- connection.Close();
- }
- if (command != null)
- {
- command.Dispose();
- }
- }
- return affectedRows;
- }
- 在Visual Studio 2005中我們完全可以這么寫:
- /// <summary>
- /// 執行Update/Delete/Insert類型的SQL語句,并返回受影響的行數
- /// summary>
- /// <param name="sql">要執行的Update/Delete/Insert類型的SQL語句param>
- /// <param name="commandType">執行SQL語句的類型,如是文本型還是存儲過程param>
- /// <param name="parameters">執行存儲過程時所需要的參數param>
- /// <returns>returns>
- public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
- {
- //定義執行語句之后受影響的行數
- int affectedRows = 0;
- using (SqlConnection connection = new SqlConnection(connectionString))
- {
- using (SqlCommand command = new SqlCommand(sql, connection))
- {
- command.CommandType = commandType;
- foreach (SqlParameter parameter in parameters)
- {
- command.Parameters.Add(parameter);
- }
- connection.Open();//打開連接
- //執行對數據庫的操作
- affectedRows = command.ExecuteNonQuery();
- }
- }
- return affectedRows;
- }
通過是用using語句大家可以明顯看出代碼更簡潔了,并且是用using語句之后的效果和使用try{}finally{}的效果是一樣的。
安全的類型轉換
在開發中經常存在一些轉換,比如從字符串類型轉換成數值類型及從一種引用類型轉換成另一種引用類型,在早期的版本中一旦出現不能轉換的情況就會拋出異常,實際上系統處理異常的開銷比較大,因而沒有必要在所有情況下都拋出異常,在Visual Studio 2005中針對這種情況進行了改進。
如下:
- /// <summary>
- /// VS2003中的寫法
- /// summary>
- public void VS2003()
- {
- int version1 = 0;
- //下面的轉換如果不成功就會拋出異常
- version1 = int.Parse("zhoufoxcn");//這句會拋出異常
- object str = "Hello Visual Studio 2005";
- //下面轉換如果失敗就會拋出異常
- Button btn = (Button)str;//因為string類型與Button類型之間不能轉換,所以會拋出異常
- }
- /// <summary>
- /// Visual Studio 2005及更高版本的做法
- /// summary>
- public void Visual Studio 2005()
- {
- int version2;
- //如果轉換成功parseSuccess為true,version2為對應字符串轉換成的數值
- //如果轉換不成功則parseSuccess為false,version2的值不可用
- bool parseSuccess = int.TryParse("zhoufoxcn", out version2);//這句永遠不會拋出異常
- if (parseSuccess)
- {
- //這里使用轉換后的數值
- }
- object str = "Hello Visual Studio 2005";
- //下面轉換如果成功則btn不為null
- //如果不成功則btn為null,但是不會拋出異常
- Button btn = str as Button;//因為string類型與Button類型之間不能轉換,所以btn為null
- if (btn != null)
- {
- //這里處理能轉換的情況
- }
- }
局部類
在Visual Studio 2005中還引入了局部類的概念,這樣對一個類的定義可以放在多個物理文件中,在編譯的時候編譯器會自動將屬于統一個類的代碼編譯成一個完整的類定義。
如下面的代碼:
- ///
- /// Person類的部分定義1,物理文件名為Person1.cs
- ///
- public partial class Person
- {
- public int Age { get; set; }
- }
- ///
- /// Person類的部分定義2,物理文件名為Person2.cs
- ///
- public partial class Person
- {
- public string Name { get; set; }
- }
編譯的時候會將這兩部分編譯到一個完整的類定義中,最終編譯的Person類總會有Age和Name兩個屬性。這種情況應用在WinForm開發和ASP.NET開發中都有體現,在WinForm中假如有一個窗體名為Form1,那么就有Form1.cs和Form1.designer.cs兩個物理文件都是Form1類的局部類。在ASP.NET中一個ASPX頁面對應的aspx.cs也是一個局部類。使用局部類的好處是可以將展示代碼和邏輯代碼分開,最終編譯時會生成一個完整的類的定義。
在ASP.NET開發中也增加了很多亮點,比如增強了可視化編程,在VS2003中用戶控件在被使用的頁面處于設計視圖下不是可視化的,只能在運行后才能看到用戶控件最終的樣子,這個在開發時多少有些不方便。除此之外還增加了如下功能:增加了ASP.NET Development Server組件、內置文件夾、母版頁及主題等。
ASP.NET Development Server
圖 ASP.NET Development Server
在VS2002及VS2003中開發ASP.NET應用程序只能使用IIS,每個ASP.NET應用都會作為IIS的一個網站或者虛擬目錄,因為開發者的機器上必須安裝IIS,而且最好按照先安裝IIS再安裝VS的步驟進行,否則就需要向IIS注冊.NET Framework(早年我曾經為這個問題抓狂過,所以我在《ASP.NET夜話》第一章中特地說了這個注意事項)。而且使用這種開發,部署和調試都不是太方便,因為默認的ASP.NET應用會在IIS根目錄下創建虛擬目錄,如果沒有更改的話一點系統出現問題不能啟動恐怕你的代碼也不好找回來了(這種情況我也遇見過)。
在Visual Studio 2005中內置了ASP.NET Development Server這個組件,這樣開發者的機器上就不必再安裝IIS了,而且我們可以基于文件系統開發,這樣我們可以任意指定ASP.NET應用程序的存放位置,這樣調試和部署起來就相當方便了,源代碼管理也很方便。自從出現了ASP.NET Development Server這個組件之后很多ASP.NET開發人員甚至干脆不在開發的機器上安裝IIS這個組件了,取而代之的就是ASP.NET Development Server這個組件(如果部署ASP.NET應用仍需要專業的Web服務器)。
母版頁
在我們做Web應用的時候,經常會遇到一些頁面之間有很多相同的顯示部分和行為,如果每個頁面都去重復編寫這些代碼,那就是一件非常麻煩的事情。因此在ASP.NET2.0中提出了母板頁的概念,我們可以把多個頁面之間相同的行為和顯示部分放到母板頁中,只需要為每個頁面編寫不同的部分即可,這樣如果我們對公共部分需要變化僅僅更改母板頁就能達到目的。母板頁的文件后綴名為.master,一個網站中允許定義多個母板頁。
母板頁不能單獨呈現,也就是我們不能在瀏覽器中直接輸入母板頁的url地址進行訪問,必須依賴于內容頁才能呈現。
下面是新建一個母板頁的源代碼:
- <%@ Master Language="C#" AutoEventWireup="true" CodeFile="FrontPage.master.cs" Inherits="FrontPage" %>
- >
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>無標題頁title>
- head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
- asp:contentplaceholder>
- div>
- form>
- body>
- html>
在母板頁中有一個“
而一個內容頁的代碼如下:
- <%@ Page Language="C#" MasterPageFile="~/FrontPage.master" AutoEventWireup="true"
- CodeFile="MyPage.aspx.cs" Inherits="MyPage" Title="Untitled Page" %>
- <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
- asp:Content>
在內容頁中有一個
通過母版頁使我們在一組頁面間共享結構和內容更加方便。
內置文件夾
如果我們使用Visual Studio 2005及更高版本,我們可能會注意到以下情況:
可以看到同樣是文件夾,App_Data目錄和js目錄的圖標在Visual Studio 2005中就是不一樣,像App_Data這類文件夾的就是內置文件夾,在運行的時候Web服務器會對這類文件夾有特殊的措施,比如像App_Data這類文件夾是不能直接在瀏覽器地址欄里輸入URL進行訪問的。這樣如果我們采用的是文件型數據庫的話(如Access),我們就可以將mdb文件放到這個文件夾下,這樣即使別人知道URL地址正確的URL地址也沒有辦法通過URL來下載,而在Visual Studio 2005及以前版本中,我們只能通過其它辦法保護自己的敏感數據了。
更方便的ASP.NET應用程序發布方式
在VS2002和VS2003中沒有提供脫離源代碼發布ASP.NET應用的方式,這樣一來開發的ASP.NET就需要將源代碼連同項目一起提供給使用者(個人客戶或者公司客戶),這樣一來整個項目的細節全部暴露給了使用者,而現在軟件公司的開發模式基本上都是不提供源代碼給使用者,所以在早期很多開發人員都在想辦法讓ASP.NET應用程序中的cs文件編譯進dll中發布,早期筆者也曾經這么做過,配置和操作過程比較復雜,而在Visual Studio 2005中這個就不再是問題了,在Visual Studio 2005中可以一鍵解決這個問題。
在Visual Studio 2005中鼠標右鍵點擊ASP.NET應用項目,在彈出的菜單中選擇“發布網站”就會彈出發布網站的對話框,選擇一個目錄之后就可以發布了。發布網站成功之后就可以將發布成功后的文件夾(包含了整個ASP.NET應用正確運行的全部資源,如css、javascript、html和ASPX及dll)部署到Web服務器上,更改開發中的環境配置為運行時的環境配置即可正常運行和瀏覽了。比起以前的版本,這個過程極其方便。
除此之外,還增加了GridView、TreeView等控件使我們的開發效率大大提高了。而AccessDataSource、SqlDataSource、ObjectDataSource數據源控件的引入使得新手更加容易上手了。
總結
Visual Studio 2005是一款非常成功的產品,起著很重要的承上啟下的作用。它是對VS2003等以前版本的質的提高,有很多功能比如類型轉換、代碼段管理、母版頁、網站發布、using語句等語法和編譯器功能是筆者從Visual Studio 2005后一直都在使用,這些特性確實方便了代碼編寫和調試,有些還能提高程序的健壯性和性能,從而也提高了開發人員的開發效率。
Visual Studio 2005歷史回放
Visual Studio 2005專業版外包裝盒
舊金山當地時間2005年11月7日。在Cheap Trick樂隊的音樂助威聲中,微軟終于正式發布了Visual Studio 2005和SQL Server 2005。微軟公司CEO Steve Ballmer出席了發布儀式。
SQL Server的上次升級已經是五年前的事情了,而這次二者新版本的發布加上剛剛發布的.NET Framework 2.0,都是為2006年Windows Vista而作的一種準備。Ballmer承認它們來得有些晚了,不過他重點強調了新版本的一些重大改進。
Visual Studio 2005極大地改進了性能表現和安全性,以滿足微軟所謂的“企業級(enterprise-grade)”應用。同時微軟還發布了高端版本的Visual Studio 2005 Team System,主要針對程序員、測試員以及軟件架構師,可以在一個團隊之間建立有效的協作,其售價也是不菲,高達$10939。
作者簡介
周金橋,網名周公,微軟2008年7月MVP,51CTO專家堂成員。微軟山西.NET俱樂部技術負責人。超過6年的Web開發經驗,擅長ASP.NET、程序性能和安全優化。
【編輯推薦】
- Visual Studio 2005 IDE的使用技巧和竅門
- 在VS 2005和ASP.NET 2.0中處理CSS樣式表
- 用VS2005.NET進行三層結構應用程序的開發
- 在Visual Studio 2005中實現VB重構
- 詳細概述VS2005配置環境的具體配置