關於這個靜態變量,平時自己沒有太認真的去認識。最近調項目的bug,讓我重新認識了靜態變量的特點。
其實,我們一直都在說:靜態變量只在類第一次初始化的時候進行初始化,以后都不初始化。
很簡單的一句話,但是我們有沒有結合“網站”的特點進行理解??看下面一段代碼

1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Web.UI; 5 using System.Web.UI.WebControls; 6 7 namespace WebApplication1 8 { 9 public partial class _Default : System.Web.UI.Page 10 { 11 public static string UserDepartment ="默認部門A"; 12 public string UserID; 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 UserID = Session["UserID"].ToString(); 16 if ("00001" == UserID) 17 { 18 UserDepartment = "人力資源部門"; 19 } 20 } 21 } 22 }
這段代碼中,根據登陸用戶的ID信息,來確定這個用戶的部門信息。我們將UserDepartment設置為了靜態變量。問題出現了:
當第一個用戶登陸之后,UserDepartment初始化為“默認部門A”,如果這個用戶的ID為“00001”,那么這個類的靜態變量就被修改了,改為“人力資源部門”。
注意:這是一個網站,網站上的邏輯代碼在不停的運行,這個類的信息也很有可能被其它用戶所訪問。所以,當其它非“00001”用戶訪問該網站的這個頁面的時候,加載這個頁面類_Default,UserDepartment為這個類的靜態變量,so不會再次初始化。所以,UserDepartment的值是“人力資源部門”,而且以后所以的用戶登錄,UserDepartment這個變量的值都不會再變化了。
為什么會出現這種情況呢?因為我們錯用了static修飾了UserDepartment。
靜態變量之所以為靜態,其含義就是這個變量是這個類的固有屬性,除非你手動修改這個固有屬性,否則它不會發生改變,而且不會多次進行初始化。他是服務器級別的全局靜態變量信息。對於靜態變量我們要了解它的特點並且合理的使用。
非靜態變量則不一樣,它根據每一次請求出過來的參數的不同而改變,所以需要每次加載類的時候首先對他們進行初始化。
深入一點,看看這個http://www.cnblogs.com/meyer/archive/2004/04/27/7846.html