ASP.NET编程中的十大技巧

 
ASP.NET 编程中的十大技巧
在本篇文件中,我们将讨论编程人员在使用 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#" %>
<script runat="server">
void Page_Load(Object Source, EventArgs E)
{
int intLimit = 10000;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole = "";
// 首先执行字符串连接操作
startTime = DateTime.Now;
for (int i=0; i < intLimit; i++)
{
strSub = i.ToString();
strWhole = strWhole + " " + strSub;
}
endTime = DateTime.Now;
elapsedTime = endTime - startTime;
lblConcat.Text = elapsedTime.ToString();
// lblConcatString.Text = strWhole;
// 使用 stringBuilder 类进行同样的操作
startTime = DateTime.Now;
StringBuilder sb = new StringBuilder();
for (int i=0; i < intLimit; i++)
{
strSub = i.ToString();
sb.Append(" ");
sb.Append(strSub);
}
endTime = DateTime.Now;
elapsedTime = endTime - startTime;
lblBuild.Text = elapsedTime.ToString();
// lblBuildString.Text = sb.ToString();
}
</script>
<html>
<body>
<form runat="server">
<h1>String Concatenation Benchmark</h1>
Concatenation:
<asp:Label
id="lblConcat"
runat="server"/>
<br/>
<asp:Label
id="lblConcatString"
runat="server"/>
<br/>
<br/>
StringBuilder:
<asp:Label
id="lblBuild"
runat="server"/>
<br/>
<asp:Label
id="lblBuildString"
runat="server"/>
</form>
</body>
</html>
二种方式的差别是相当大的:使用 StringBuilder 类的 Append 方法的速度比使用字符串连接的速度快近 200 倍。比较的结果如下所示:
(图: picture01

5
、只在必要时使用服务器端控件
ASP.NET 中新引入了一种在服务器端运行的被称作 Web Server Controls 的控件,在代码中,它们经常通过下面的语法被说明:
<asp:TextBox id="txtLastName" size="40" runat="server" />
它们有时也被称作 ASP 控件。服务器端控件是由 runat 属性指示的,它的值总是 “server”
通过添加 runat 属性,一般的 HTML 控件可以被很方便地转换到服务器端运行,下面是一个简单的例子:
<input type="text" id="txtLastName" size="40" runat="server" />
可以通过 id 属性中指定的名字,我们可以引用程序中的控件,可以通过编程的方式设置属性和获得值,因此,服务器端处理方式有较大的灵活性。
这种灵活性是有一定代价的。每种服务器端控件都会消耗服务器上的资源。另外,除非控件、网页或应用程序明确地禁止 view state ,控件的状态是包含在 view state 的隐藏域中,并在每次回送中都会被传递,这会引起严重的性能下降。
在这方面的一个很好的例子是,网页上控件表格的应用,如果不需要在代码中引用表格中的元素,则使用无需进行服务器端处理的 HTML 表格。我们仍然可以在 HTML 表格单元中放置服务器控件,并在代码中引用服务器控件。如果需要引用任意的表格元素,例如指定的单元,则整个表格必须是服务器控件。

6. HyperLink
控件、 LinkButton 控件的差别
对于 Web 访问者而言, HyperLink LinkButton 控件是一样的,但它们在功能方面仍然有较大的差异。
当用户点击控件时, HyperLink 控件会立即将用户 导航 到目标 URL ,表件不会回送到服务器上。 LinkButton 控件则首先将表件发回到服务器,然后将用户导航到目标 URL 。如果在 到达 目标 URL 之前需要进行服务器端处理,则使用 LinkButton 控件;如果无需进行服务器端处理,则可以使用 HyperLink 控件。

7
、注释代码
这一技巧并不是针对 ASP.NET 的,但它是一个良好的编程习惯。
注释不仅仅应当说明代码会执行什么操作,还应当注明原因。例如,不要仅仅在注释中说明是在遍历数组,而是要说明遍历数组是根据某一算法计算一个值,除非算法是相当简单的,否则还应当对算法进行简要的说明。
.NET
工程中的不同的编程语言都有各自不同的注释符号,下面是一个简要的说明:
HTML <!--
注释 -->
JavaScript //
注释
VBScript '
注释
VB.NET '
注释
C# //
注释
/*
多行内容
的注释
*/
SQL --
注释
在服务器控件的开始和结束标记中没有注释符号,但服务器能够忽略掉所有它不能识别的属性,因此我们能够通过使用没有定义的属性来插入注释。下面是一个例子:
<asp:TextBox
id="txtLastName"
size="40"
comment="
这是我的注释 "
runat="server" />
Visual Studio .NET 中对源代码进行注释非常简单。高亮度显示需要注释的行,然后按 Ctrl+K+C 组合键添加注释。要删除注释,只需高亮度显示被注释的代码,并按下 Ctrl+K+U 组合键。
C# 工程中,我们还可以通过在每行的开始处使用 /// 输入 XML 注释小节。在注释小节中,我们可以使用下面的 XML 标记组织注释:
<summary></summary>
<remarks></remarks >
<param></param>
<returns></returns>
<newpara></newpara>
要在 Visual Studio .NET 中查看这些 XML 注释的格式化的报告,我们可以首先选择 工具 菜单项,然后选择 建立注释 Web 网页 菜单项。

8
、使用 trace 方法和 trace 属性记录 Page 目录中网页的执行情况
调试程序的一种古老的技术是在程序中的关健点插入输出语句,通常情况下,输出信息中会包含重要变量的值,相关信息可以输出到屏幕、日志文件或者数据库。
ASP.NET 中,通过使用 Page 命令中的 trace 属性,这种调试技术的使用更简单了。 Page 命令是 ASPX 文件开始处的一行代码,它提供编译器的指示。 Page 命令中包含一个或多个属性,向编译器提供使用的编程语言、代码支持文件的位置或要继承的类的名字等信息。
Page
命令中的属性之一是 trace ,其值可能是 true false ,下面是一个典型的 Page 命令,其中的 trace 属性的值是 true
<%@ Page language="c#" trace="true" %>
如果 trace 属性的值设置为 true ,由 ASPX 文件生成的 Web 页就会显示出来,除了网页本身外,关于该页的大量其他信息也会显示出来。这些信息以下面小节的形式显示在一张表格中:
·Request
细节 提供 Session ID 、请求时间和请求的状态码。
·Trace Information
包含跟踪日志、网页生命周期中按时间先后顺序各个步骤的列表。另外,也可以向其中添加定制信息。
·
控件树 以一种分层次的方式列出网页上的所有控件,包括每个控件以字节计算的大小。
·Cookies
集合 列出该网页创建的所有 Cookie
·
头部集合 HTTP 头部以及它们的值。
·Server
变量 与该网页相关的 Server 环境变量。
包含在 Trace Information 小节中的跟踪日志是最有用的,在这里我们可以插入自己的跟踪命令。 trace 类中有 2 个方法能够在跟踪日志中插入命令: Trace.Write Trace.Warn ,除了 Trace.Warn 命令用红色字体显示、 Trace.Write 命令用黑色字体显示外,它们是相同的。下面是跟踪日志的一个屏幕快照,其中包含有几个 Trace.Warn 命令。
跟踪日志中最方便的功能是我们可以在开发和测试过程中在整个代码中插入 Trace.Write Trace.Warn 语句,而在最终交付应用程序时,可以通过改变 Page 命令中 trace 属性的值,禁止这些命令起作用,而无需在部署应用软件前删除这些输出语句。

9
、使用存储过程
微软公司的 SQL Server 和其他现代关系数据库都使用 SQL 命令定义和处理查询。一个 SQL 语句或一系列 SQL 语句提交给 SQL Server SQL Server 会对命令进行解析,然后创建一个查询计划并对它进行优化,然后执行该查询计划,这都需要大量的时间。
存储过程是一系列被查询处理器预解析和优化的 SQL 命令,这些命令会被存储起来,可以得到快速地执行。存储过程也被称作 sprocs ,它可以接收输入参数,使一个单一的存储过程能够处理较大范围的特定的查询。
因为 sprocs 是预先被解析的,对于复杂的查询更显得重要,其查询计划是预先优化的,因此调用查询过程比执行相同功能的 SQL 语句速度要快得多。

10
、使用 .NET 命令行
.NET 命令行工具在命令提示符窗口中运行。为了使命令能够执行,它必须驻留在命令提示符的当前目录中,或通过设置 PATH 环境变量。
.NET SDK
启动 菜单上安装一个菜单项,该菜单项能够打开一个正确设置了 PATH 环境变量的命令提示符窗口。我们可以通过依次点击 开始 ”->“ 程序 ”->“Microsoft Visual Studio .NET”->“Visual Studio .NET 工具 ”->“Visual Studio .NET 命令提示符 ,启动命令提示符窗口。
通过在将该菜单项从菜单上拖到桌面上时,同时按 Ctrl+C 键,就可以将该菜单项的快捷方式拷贝到桌面上,使用起来会非常方便。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值