在本篇文件中我们将讨论编程人员在使用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的隐藏域中并在每次回送中都会被传递这会引起严重的性能下降
在这方面的一个很好的例子是网页上控件表格的应用