關於C#靜態變量初始化問題


關於這個靜態變量,平時自己沒有太認真的去認識。最近調項目的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 }
View Code

這段代碼中,根據登陸用戶的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM