一、在使用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这样的表单名就比Form一、Form2和 Form3这样的名字更易于理解和维护。
若是表单上控件要在代码的其余地方引用,使它有一个有意义的名字就更重要了。btnOK、btnCancel和btnPrint这样的名字使看代码的人更容易理解,于是,也比名字为Button一、Button二、Button3这样的控件更容易维护。
修改一个工程中全部文件中出现的一个名字的一个好方法是,在Visual Studio .NET菜单中依次选择“编辑”->“发现和替换”->“替换”命令。
在看二周前编写的代码时,咱们常常就象第一次见到这些代码同样,所以使它们有一个有助于咱们理解其含义的名字是十分有必要的。
二、即便不使用Visual Studio .NET进行编程,使用代码支持文件也有利于提升应用程序的性能
在Web应用程序、Web服务或Web控件等全部的ASP.NET Web工程中,Visual Studio .NET都使用代码支持文件。代码支持文件使工程具备更好的组织、模块性,更适合多人组成的开发团队。另外,它还会带来性能的提升。
代码支持文件的内容被编译成一个组合文件中的类,通常是一个DLL文件,有时也能够是EXE文件。该文件驻留在应用程序的组合体高速缓冲区中,在应用程序启动时,能够当即获得它。
若是代码是包含在<script>标记中或ASPX文件代码中,它仍然会被编译成一个Web页类。在这种状况下,每当该网页在应用程序对话中 第一次加载时,都须要从新进行编译,被编译的类就会驻留在内存中。每当计算机启动、IIS中止、从新启动或者源代码、配置文件改变时,该文件必须从新编 译。尽管不大,但这样引发的性能损耗也是至关可观的
三、尽可能减小表单回送
每当点击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
{
// 回送时执行的操做
}
// 网页每次加载时执行的操做
}
咱们但愿尽可能不引发回送(每次回送都会要求服务器进行一系列的操做),即便引发回送后。也但愿可以执行尽可能少的操做。大规模、浪费时间的操做(例如数据库查找)尤为应当避免,由于它们可以延长应用程序的响应时间。
四、使用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)
五、只在必要时使用服务器端控件
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控件。
七、注释代码
这一技巧并非针对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网页”菜单项。
八、使用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属性的值,禁止这些命令起做用,而无需在部署应用软件前删除这些输出语句。
九、使用
存储过程
微软公司的SQL Server和其余现代关系数据库都使用SQL命令定义和处理查询。一个SQL语句或一系列SQL语句提交给SQL Server,SQL Server会对命令进行解析,而后建立一个查询计划并对它进行优化,而后执行该查询计划,这都须要大量的时间。
存储过程是一系列被查询处理器预解析和优化的SQL命令,这些命令会被存储起来,能够获得快速地执行。存储过程也被称做sprocs,它能够接收输入参数,使一个单一的存储过程可以处理较大范围的特定的查询。 由于sprocs是预先被解析的,对于复杂的查询更显得重要,其查询计划是预先优化的,所以调用查询过程比执行相同功能的SQL语句速度要快得多。 十、使用。NET命令行 .NET命令行工具在命令提示符窗口中运行。为了使命令可以执行,它必须驻留在命令提示符的当前目录中,或经过设置PATH环境变量。 .NET SDK在“启动”菜单上安装一个菜单项,该菜单项可以打开一个正确设置了PATH环境变量的命令提示符窗口。咱们能够经过依次点击“开始”->“程 序”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示符”,启动命令提示符窗口。 经过在将该菜单项从菜单上拖到桌面上时,同时按Ctrl+C键,就能够将该菜单项的快捷方式拷贝到桌面上,使用起来会很是方便。