在本篇文章中我们将讨论编程人员在使用ASPNET开发应用程序时需要注意的个技巧这些技巧涉及从缺省的控件表单名的改变到StringBuilder类的使用有助于编程人员能够尽快地适应NET环境
在使用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的一个功能是无论是类控件或表单中的对象它都能够为新对象提供缺省名字例如如果我们创建了一个新的ASPNET Web Application其缺省的名字将是WebApplication我们可以在新工程对话框中方便地改变该应用的名字但同时改变的只是该应用程序的名字空间的名字及其所在的虚拟目录源代码文件的缺省名字仍然是WebFormaspx和WebFormaspxcs(C#工程)或WebFormaspxvb(VBNET工程)
我们可以在方案浏览器中改变ASPX和代码使用的文件名字但Web页类的名字仍然将是WebForm如果在该Web表单上生成一个按钮其缺省的名字将是Button事实上所有控件的名字都是由控件的类型和数字组成的
我们能够也应该将应用程序中所有的表单和控件的名字都修改成有意义的名字对于较小的演示性程序而言缺省的名字还能够胜任但如果应用程序由多个表单每个表单上有许多按钮和标签时象frmStartupfrmDataEntry和frmReports这样的表单名就比FormForm和Form这样的名字更易于理解和维护
如果表单上控件要在代码的其他地方引用使它有一个有意义的名字就更重要了btnOKbtnCancel和btnPrint这样的名字使看代码的人更容易理解因而也比名字为ButtonButtonButton这样的控件更容易维护
修改一个工程中所有文件中出现的一个名字的一个好方法是在Visual Studio NET菜单中依次选择编辑>发现和替换>替换命令
在看二周前编写的代码时我们经常就象第一次见到这些代码一样因此使它们有一个有助于我们理解其含义的名字是十分有必要的
即使不使用Visual Studio NET进行编程使用代码支持文件也有利于提高应用程序的性能
在Web应用程序Web服务或Web控件等所有的ASPNET Web工程中Visual Studio NET都使用代码支持文件代码支持文件使工程具有更好的组织模块性更适合多人组成的开发团队另外它还会带来性能的提高
代码支持文件的内容被编译成一个组合文件中的类一般是一个DLL文件有时也可以是EXE文件该文件驻留在应用程序的组合体高速缓沖区中在应用程序启动时可以立即得到它
如果代码是包含在<script>标记中或ASPX文件代码中它仍然会被编译成一个Web页类在这种情况下每当该网页在应用程序对话中第一次加载时都需要重新进行编译被编译的类就会驻留在内存中每当计算机启动IIS停止重新启动或者源代码配置文件改变时该文件必须重新编译尽管不大但这样引起的性能损耗也是相当可观的
尽量减少表单回送
每当点击Web网页上的ButtonLinkButton或ImageButton控件时表单就会被发送到服务器上如果控件的AutoPostBack属性被设置为true如果CheckBoxCheckBoxList等控件的状态被改变后也会使表单会发送回服务器
每次当表单被发送回服务器就会被重新加载启动Page_Load事件执行Page_Load事件处理程序中的所有代码把网页的初始化代码放在这里是最合适不过的了我们经常会希望在每次加载网页时执行一些代码而希望只有在网页第一次加载时执行另一些代码甚至希望一些代码在除首次加载外的每次加载时执行
可以利用IsPostBack特性来完成这一功能在网页第一次加载时该属性的值是false如果网页因回送而被重新加载IsPostBack属性的值就会被设置为true通过测试可以在任意时候执行指定的代码下面是相关的C#代码
protected void Page_Load(Object sender EventArgs e)
{
// 网页每次加载时执行的一些操作
if (!IsPostBack)
{
// 网页第一次加载时执行的操作
}
else
{
// 回送时执行的操作
}
// 网页每次加载时执行的操作
}
我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作)即使引起回送后也希望能够执行尽量少的操作大规模浪费时间的操作(例如数据库查找)尤其应当避免因为它们能够延长应用程序的响应时间
使用StringBuilder类
字符串在NET框架中是不可变的这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝这意味着性能还有提高的空间当进行大量的字符串操作时使用StringBuilder类就是一种比较好的选择了
下面的C#代码测试用二种方式从个子字符串中生成字符串所需要的时间第一次使用了一个简单的字符串串联操作第二次使用了StringBuilder类要想查看结果字符串可以去掉下面的代码中注解行的注解符号
<%@ Page Language=C# %>
<script runat=server>
void Page_Load(Object Source EventArgs E)
{
int intLimit = ;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole = ;
// 首先执行字符串连接操作
startTime = DateTimeNow;
for (int i=; i < intLimit; i++)
{
strSub = iToString();
strWhole = strWhole + + strSub;
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblConcatText = elapsedTimeToString();
// lblConcatStringText = strWhole;
// 使用stringBuilder类进行同样的操作
startTime = DateTimeNow;
StringBuilder sb = new StringBuilder();
for (int i=; i < intLimit; i++)
{
strSub = iToString();
sbAppend( );
sbAppend(strSub);
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblBuildText = elapsedTimeToString();
// lblBuildStringText = sbToString();
}
</script>
<html>
<body>
<form runat=server>
<h>String Concatenation Benchmark</h>
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方法的速度比使用字符串连接的速度快近倍
只在必要时使用服务器端控件
ASPNET中新引入了一种在服务器端运行的被称作Web Server Controls的控件在代码中它们经常通过下面的语法被说明
<asp:TextBox id=txtLastName size= runat=server />
它们有时也被称作ASP控件服务器端控件是由runat属性指示的它的值总是server
通过添加runat属性一般的HTML控件可以被很方便地转换到服务器端运行下面是一个简单的例子
<input type=text id=txtLastName size= runat=server />
可以通过id属性中指定的名字我们可以引用程序中的控件可以通过编程的方式设置属性和获得值因此服务器端处理方式有较大的灵活性
这种灵活性是有一定代价的每种服务器端控件都会消耗服务器上的资源另外除非控件网页或应用程序明确地禁止view state控件的状态是包含在view state的隐藏域中并在每次回送中都会被传递这会引起严重的性能下降
在这方面的一个很好的例子是网页上控件表格的应用如果不需要在代码中引用表格中的元素则使用无需进行服务器端处理的HTML表格我们仍然可以在HTML表格单元中放置服务器控件并在代码中引用服务器控件如果需要引用任意的表格元素例如指定的单元则整个表格必须是服务器控件
HyperLink控件LinkButton控件的差别
对于Web访问者而言HyperLinkLinkButton控件是一样的但它们在功能方面仍然有较大的差异
当用户点击控件时HyperLink控件会立即将用户导航到目标URL表件不会回送到服务器上 LinkButton控件则首先将表件发回到服务器然后将用户导航到目标URL如果在到达目标URL之前需要进行服务器端处理则使用LinkButton控件如果无需进行服务器端处理则可以使用HyperLink控件
注释代码
这一技巧并不是针对ASPNET的但它是一个良好的编程习惯
注释不仅仅应当说明代码会执行什么操作还应当注明原因例如不要仅仅在注释中说明是在遍历数组而是要说明遍历数组是根据某一算法计算一个值除非算法是相当简单的否则还应当对算法进行简要的说明
NET工程中的不同的编程语言都有各自不同的注释符号下面是一个简要的说明
HTML <! 注释 >
JavaScript // 注释
VBScript 注释
VBNET 注释
C# // 注释
/* 多行内容
的注释
*/
SQL 注释
在服务器控件的开始和结束标记中没有注释符号但服务器能够忽略掉所有它不能识别的属性因此我们能够通过使用没有定义的属性来插入注释下面是一个例子
<asp:TextBox id=txtLastName size= 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网页菜单项
使用trace方法和trace属性记录Page目录中网页的执行情况
调试程序的一种古老的技术是在程序中的关健点插入输出语句通常情况下输出信息中会包含重要变量的值相关信息可以输出到屏幕日志文件或者数据库
在ASPNET中通过使用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类中有个方法能够在跟蹤日志中插入命令TraceWrite和TraceWarn除了TraceWarn命令用红色字体显示TraceWrite命令用黑色字体显示外它们是相同的下面是跟蹤日志的一个屏幕快照其中包含有几个TraceWarn命令
跟蹤日志中最方便的功能是我们可以在开发和测试过程中在整个代码中插入TraceWrite和TraceWarn语句而在最终交付应用程序时可以通过改变Page命令中trace属性的值禁止这些命令起作用而无需在部署应用软件前删除这些输出语句
使用存储过程
微软公司的SQL Server和其他现代关系数据库都使用SQL命令定义和处理查询一个SQL语句或一系列SQL语句提交给SQL ServerSQL Server会对命令进行解析然后创建一个查询计划并对它进行优化然后执行该查询计划这都需要大量的时间
存储过程是一系列被查询处理器预解析和优化的SQL命令这些命令会被存储起来可以得到快速地执行存储过程也被称作sprocs它可以接收输入参数使一个单一的存储过程能够处理较大范围的特定的查询
因为sprocs是预先被解析的对于复杂的查询更显得重要其查询计划是预先优化的因此调用查询过程比执行相同功能的SQL语句速度要快得多
使用NET命令行
NET命令行工具在命令提示符窗口中运行为了使命令能够执行它必须驻留在命令提示符的当前目录中或通过设置PATH环境变量
NET SDK在启动菜单上安装一个菜单项该菜单项能够打开一个正确设置了PATH环境变量的命令提示符窗口我们可以通过依次点击开始>程序>Microsoft Visual Studio NET>Visual Studio NET工具>Visual Studio NET命令提示符启动命令提示符窗口
通过在将该菜单项从菜单上拖到桌面上时同时按Ctrl+C键就可以将该菜单项的快捷方式拷贝到桌面上使用起来会非常方便