MainForm关闭之后保持程序运行
在Windows应用程序中,一般只有一个主程序入口点,而该窗口则为整个应用程序的主窗口。如果在主窗口中打开新窗口,主窗口只能隐藏,而不能关闭。不过,我们可以修改主程序入口点,使主窗口关闭之后程序仍然运行。
将Main改为:
static void Main()
{
(new Form1()).Show();
Application.Run(); // 启动独立的应用程序线程
}
这样Form1中的this.Close()就不会导致应用程序终止运行了,而且不需要Form1时,可以真正Close从而释放一些资源。不过,应用程序的终止就不要在其他地方控制了,比如在Form2的Closed事件中:
private void Form2_Closed(object sender, System.EventArgs e)
{
Application.Exit();
}
在多文档应用程序中,往往需要在内部维护一个当前活动Form的列表,最后一个Form关闭时,再调用Application.Exit。
避免运用Assembly.LoadFrom
假设你想在另一个project中使用其它dll的assembly,如果它在引用列表中,而且assembly中至少有一个公用项(类、枚举等),那么不要用Assembly.LoadFrom,而用Type.Assembly。
例如,在dll(test.dll)中有一个叫做myclass1的公用的类,那么用下面的代码就可以得到该dll的assembly:
// Need include the namespace if without using
Assembly assem = typeof(myclass1).Assembly;
IP与主机名解析
使用System.Net可以实现与Ping命令行类似的IP解析功能,例如将主机名解析为IP或者反过来:
private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.Net.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList[0].ToString();
}
ASP.NET中定制出错页面
在ASP.NET中原始的出错页面会暴露部分源代码,由此带来了潜在的安全隐患。ASP.NET允许应用程序出错时显示用户指定的页面,方法是在web.config文件中修改配置信息。
<? xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.web>
......
<customErrors mode="On" defaultRedirect="ErrorPage.htm" />
......
</system.web>
</configuration>
上面的配置信息明确指定了当应用程序出错的时候显示用户定制的页面ErrorPage.htm。并且因为各个应用程序有自己独立的web.config配置文件,所以应用程序之间不会互相干扰。
其中,mode属性表示是否启用定制的用户页面,它可取三个值,如下所示:
On 启用定制的出错页面
Off 禁用定制的出错页面
RemoteOnly 启用定制的出错页面但仅展示给远程用户
defaultRedirect属性表示用户定制出错页面的文件名。
屏蔽CTRL-V
在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:
private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.Control && e.KeyCode==Keys.V)
e.Handled = true;
}
注意日期型变量值的改变
在将日期型变量作为传给后台程序的参数时请注意一个问题:
若client端的时区设置为北京时间,在client端传了一个日期型参数(如:dteRequestDate = nothing), 此时dterequestdate的值是:12:00:00 midnight, January 1, 0001 C.E.
若server端的时区设置为日本,server端接收到的参数dteRequestDate将自动转化为11:00:00 pm, January 1, 0001 C.E,此时若拿dterequestdate参数与checkdate(dim checkdate as datetime = nothing)比较,系统会认为dterequestdate<>checkdate。
判断一个程序是Debug 还是 Release(by 豆腐生活)
在Dotnet环境下,Framework提供了一个DebuggableAttribute 的class,可以通过如下的代码实现对其编译属性的判断。
try
{
Assembly assm = Assembly.LoadFrom(filename);
bool found = assm.GetCustomAttributes(typeof(DebuggableAttribute), false).Length > 0;
buildType = found ? "Debug" : "Release";
}
catch
{
buildType = "<error>";
}
在开发过程中,通过摸索查资料,收集了一些值得提出来的经验:
a) 相对于原来的for语句foreach具有更好的执行效率,foreach的平均花费时间只有for的30%。通过测试结果在for和foreach都可 以使用的情况下,我们推荐使用效率更高的foreach。另外, 用for写入数据时间大约是读取数据时间的10倍左右;
b) 在asp.net程序中,使用sa账号的是一种非常不安全的做法,它具有在数据库上执行任何操作的权限。黑客可以调用类似于xp_cmdshell这样的扩展存储过程进行攻击;
c) 在处理数据交互的时候,尽量将组织SQL语句的处理放到中间层(比如专门的数据操作类、存储过程等),这是防止注入式攻击的有效方法;
d) 避免到服务器的不必要的往返过程。使用 Page.IsPostBack 避免对往返过程执行不必要的处理;
e) 一定要禁用调试模式;
f) 一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用DatSet比较合适.对SqlDataReader和DataSet的选择取决于程序功能的实现;
g) 数据绑定建议使用<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>。数据量大的时候可提高几百倍的速度;
我们都知道提高应用程序性能的方法有-改进应用程序的设计、改进算法、使用存储过程...等等,
但是你是否想到从细微处着手,可能有些你平时忽略的小地方也存在着性能改进的余地呢?
1.使用“短路”的逻辑运算
在VB.net的逻辑运算中使用 Andalso 代替 And,OrElse 代替Or,
在C#的逻辑运算中用使用&& 代替 &,用||代替|.
所谓“短路”运算是指-编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,例如:
逻辑运算 if A and B then,其中A和B是表达式,代码运行时,要分别计算A 和 B的值,而如果是
if A Andalso B then,A先计算,如果A的值为true,则不再计算B的值。这样如果B的计算复杂或
涉及过程调用,使用Andalso则会减小不必要的性能损耗。
对于or和orelse,情况和上面相同不再废话。
2.使用+=、-= 等简化操作符
例如原有表达式 A=A+B
改为A+=B
这样不仅减少了敲入代码的数量,而且由于变量A只出现一次,在运行时也提高了系统的性能
类此的操作符还有*=、/=、/=、&=等
3.使用stringBuilder代替string
string类型在内存中是不可变的,对已经定义的string类型的变量所做的任何修改,系统实际在
内存中都是新建一个string,而sringbuilder class则是在内存中新建对象,对其操作都是对这
个对象的修改。因此使用stringBuilder代替string会提高运行时的性能。
4.在for循环内部定义变量
例如:for(int i=1;i<=10;i++)
{
....
}
而不是:int i;
for(i=1;i<=10;i++)
{
....
}
5.设置Option Strict 启用
在vs.net中启用Option Strict,要求代码中的数据类型严格转换,避免由系统转换造成的性能影响
6.在VB.net类型转换时考虑使用DirectCast代替Ctype
在vb.net中如果将某类型对象转成其继承型对象,例如将一个“control” 转成一个textbox时(textbox从Control继承)请 使用DirectCast代替Ctype,这会提高系统性能,但是如果要将一个Integer转成 String ,则不能 使用,因为Integer和String类型不是继承关系。
在C#中没有和DirectCast相应的函数。
在vs.net2005中,会有新的转换函数TryCast