ASP.NET開發經驗積累(轉發)

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章