在本篇文件中,我们将讨论编程人员在使用 ASP.NET 开发应用程序时需要注意的 10 个技巧,这些技巧涉及从缺省的控件、表单名的改变到 StringBuilder 类的使用,有助于编程人员能够尽快地适应 .NET 环境。
1 、在使用 Visual Studio .NET 时,除直接或非引用的对象外,不要使用缺省的名字。
.NET 带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用 Notepad 或 WordPad 等任意的文本编辑器进行编辑。如果不愿意,我们并非一定要使用 Visual Studio .NET 作为集成开发环境。但使用了 Visual Studio .NET ,我们可以在 Windows 文件管理器中看到文件,或在 Visual Studio .NET 之外从文本编辑器中浏览文件的内容。
使用 Visual Studio .NET 作为集成开发环境有许多好处,其中最显著的好处是它极大地提高了生产效率。使用 Visual Studio. NET ,我们能够在付出较小代价的情况下更快地开发软件。作为集成开发环境一部分的 IntelliSense 提供自动的代码完成、在输入方法或函数时提供动态帮助、语法错误的实时提示,以及其他能够提高生产效率的功能。
象其他复杂的工具那样,在学会如何充分发挥它的作用和掌握其“习性”前, Visual Studio .NET 也会使我们产生一种挫折感。有时,它象一个难以了解的黑盒子,会生成大量的文件和许多无用的代码。
Visual Studio .NET 的一个功能是,无论是类、控件或表单中的对象,它都能够为新对象提供缺省名字。例如,如果我们创建了一个新的 ASP.NET Web Application ,其缺省的名字将是 WebApplication1 。我们可以在“新工程”对话框中方便地改变该应用的名字,但同时改变的只是该应用程序的名字空间的名字及其所在的虚拟目录,源代码文件的缺省名字仍然是 WebForm1.aspx 和 WebForm1.aspx.cs ( C# 工程)或 WebForm1.aspx.vb ( VB.NET 工程)。
我们可以在方案浏览器中改变 ASPX 和代码使用的文件名字,但 Web 页类的名字仍然将是 WebForm1 。如果在该 Web 表单上生成一个按钮,其缺省的名字将是 Button1 。事实上,所有控件的名字都是由控件的类型和数字组成的。
我们能够,也应该将应用程序中所有的表单和控件的名字都修改成有意义的名字。对于较小的演示性程序而言,缺省的名字还能够胜任,但如果应用程序由多个表单,每个表单上有许多按钮和标签时,象 frmStartup 、 frmDataEntry 和 frmReports 这样的表单名就比 Form1 、 Form2 和 Form3 这样的名字更易于理解和维护。
如果表单上控件要在代码的其他地方引用,使它有一个有意义的名字就更重要了。 btnOK 、 btnCancel 和 btnPrint 这样的名字使看代码的人更容易理解,因而,也比名字为 Button1 、 Button2 、 Button3 这样的控件更容易维护。
修改一个工程中所有文件中出现的一个名字的一个好方法是,在 Visual Studio .NET 菜单中依次选择“编辑” - “发现和替换” - “替换”命令。
在看二周前编写的代码时,我们经常就象第一次见到这些代码一样,因此使它们有一个有助于我们理解其含义的名字是十分有必要的。
2 、即使不使用 Visual Studio .NET 进行编程,使用代码支持文件也有利于提高应用程序的性能
在 Web 应用程序、 Web 服务或 Web 控件等所有的 ASP.NET Web 工程中, Visual Studio .NET 都使用代码支持文件。代码支持文件使工程具有更好的组织、模块性,更适合多人组成的开发团队。另外,它还会带来性能的提高。
代码支持文件的内容被编译成一个组合文件中的类,一般是一个 DLL 文件,有时也可以是 EXE 文件。该文件驻留在应用程序的组合体高速缓冲区中,在应用程序启动时,可以立即得到它。
如果代码是包含在 script 标记中或 ASPX 文件代码中,它仍然会被编译成一个 Web 页类。在这种情况下,每当该网页在应用程序对话中第一次加载时,都需要重新进行编译,被编译的类就会驻留在内存中。每当计算机启动、 IIS 停止、重新启动或者源代码、配置文件改变时,该文件必须重新编译。尽管不大,但这样引起的性能损耗也是相当可观的。
3 、尽量减少表单回送
每当点击 Web 网页上的 Button 、 LinkButton 或 ImageButton 控件时,表单就会被发送到服务器上。如果控件的 AutoPostBack 属性被设置为 true ,如果 CheckBox 、 CheckBoxList 等控件的状态被改变后,也会使表单会发送回服务器。
每次当表单被发送回服务器,就会被重新加载,启动 Page_Load 事件,执行 Page_Load 事件处理程序中的所有代码。把网页的初始化代码放在这里是最合适不过的了。我们经常会希望在每次加载网页时执行一些代码,而希望只有在网页第一次加载时执行另一些代码,甚至希望一些代码在除首次加载外的每次加载时执行。
可以利用 IsPostBack 特性来完成这一功能。在网页第一次加载时,该属性的值是 false 。如果网页因回送而被重新加载, IsPostBack 属性的值就会被设置为 true 。通过测试,可以在任意时候执行指定的代码。下面是相关的 C# 代码:
protected void Page_Load(Object sender, EventArgs e)
{
网页每次加载时,执行的一些操作
if (!IsPostBack)
{
网页第一次加载时执行的操作
}
else
{
回送时执行的操作
}
网页每次加载时执行的操作
}
我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作),即使引起回送后。也希望能够执行尽量少的操作。大规模、浪费时间的操作(例如数据库查找)尤其应当避免,因为它们能够延长应用程序的响应时间。
4 、使用 StringBuilder 类
字符串在 .NET 框架中是不可变的,这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝,这意味着性能还有提高的空间。当进行大量的字符串操作时,使用 StringBuilder 类就是一种比较好的选择了。
下面的 C# 代码测试用二种方式从 10000 个子字符串中生成字符串所需要的时间。第一次使用了一个简单的字符串串联操作;第二次使用了 StringBuilder 类。要想查看结果字符串,可以去掉下面的代码中注解行的注解符号:
<%@ Page Language="C#" %>
String Concatenation Benchmark
Concatenation:
id="lblConcat" runat="server"/>
id="lblConcatString" runat="server"/>
StringBuilder:
id="lblBuild" runat="server"/>
id="lblBuildString" runat="server"/>
二种方式的差别是相当大的:使用 StringBuilder 类的 Append 方法的速度比使用字符串连接的速度快近 200 倍。
5 、只在必要时使用服务器端控件
ASP.NET 中新引入了一种在服务器端运行的被称作 Web Server Controls 的控件,在代码中,它们经常通过下面的语法被说明:
它们有时也被称作 ASP 控件。服务器端控件是由 runat 属性指示的,它的值总是“ server ”。
通过添加 runat 属性,一般的 HTML 控件可以被很方便地转换到服务器端运行,下面是一个简单的例子:
可以通过 id 属性中指定的名字,我们可以引用程序中的控件,可以通过编程的方式设置属性和获得值,因此,服务器端处理方式有较大的灵活性。
这种灵活性是有一定代价的。每种服务器端控件都会消耗服务器上的资源。另外,除非控件、网页或应用程序明确地禁止 view state ,控件的状态是包含在 view state 的隐藏域中,并在每次回送中都会被传递,这会引起严重的性能下降。
在这方面的一个很好的例子是,网页上控件表格的应用,如果不需要在代码中引用表格中的元素,则使用无需进行服务器端处理的 HTML 表格。我们仍然可以在 HTML 表格单元中放置服务器控件,并在代码中引用服务器控件。如果需要引用任意的表格元素,例如指定的单元,则整个表格必须是服务器控件。
作者: Tisten