【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配置环境的具体配置