我對static靜態成員的理解和疑惑

 數據成員可以分靜態變量非靜態變量兩種.
 靜態成員:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名+靜態成員名訪問此靜態成員,因爲靜態成員存在於內存,非靜態成員需要實例化纔會分配內存,所以靜態成員不能訪問非靜態的成員..因爲靜態成員存在於內存,所以非靜態成員可以直接訪問類中靜態的成員.
 
 非成靜態員:所有沒有加Static的成員都是非靜態成員,當類被實例化之後,可以通過實例化的類名進行訪問..非靜態成員的生存期決定於該類的生存期..而靜態成員則不存在生存期的概念,因爲靜態成員始終駐留在內容中..
 
 一個類中也可以包含靜態成員和非靜態成員,類中也包括靜態構造函數和非靜態構造函數..
 
 對於winApp來說,靜態成員對於程序員本身省了很多事,而且因爲靜態成員駐留內存,在方法與方法之間傳遞共享數據的時候,所以靜態成員成了我的首選..但是不要因爲方便,大量使用,尤其是在內存緊張或者
 用靜態方法操作一些共享值的時候.或者要寫多用戶系統的時候,要慎之又慎.比如:
 static int id = 0;
 sql = "select * from table where id=" + id;

 
 如果這樣寫的話,在單機測試的時候沒有問題,但是在多人同時對數據進行測試的時候,就會有問題了.假如,A用戶訪問他的id是20,則id的值在內存中爲20,而此時B用戶訪問,他的id是30,則id在內存中的值是30..A用戶的id值則被更改了..如果此時你將這個方法用非靜態成員來寫,則不會出現這樣的情況..因爲非靜態成員是你聲明的時候,實例化的時候纔會分配內存..所以A用戶訪問的時候,App會因爲A實例化而給A用戶的請求分配內存..而B用戶訪問的時候也一樣會因爲B用戶的訪問而分配內存..所以兩個用戶訪問的是不同的內存塊..所以不會出現數據覆蓋和錯亂的現象...
 
我想這樣的情況應該能很好的說明靜態變量和非靜態成員的區別..
  
相對於webApp而言,在winApp下使用static的時候要比webApp下考慮的因素要少的多,因爲webApp本來就是一個多用戶的系統,所以使用static的時候更應該小心..

而我對static在webApp下的使用存在一個疑問,如果一個靜態方法,例如:

static string aa(string str){
 //經過一系列操作..
 return str;
}

或者返回一個DataSet的靜態方法
static DataSet aa(string str){
 //經過一系列操作..
 return DataSet;
}

或者返回一個DataSet的靜態方法
static DataSet aa(string str){
 //經過一系列操作..
 return DataSet;
}

或者返回一個DataSet的靜態方法
static DataSet aa(string str){
 //經過一系列操作..
 return DataSet;
}

這個時候,在訪問量大的時候,程序出現了併發,會不會發生錯亂??我以前的項目使用的公用函數類中使用了大量的靜態方法,不過好在訪問量不大,一直沒有問題..在發這個文章之前,我查找了MSDN,CSDN,搜索了一些關於靜態成員的文章,但是都沒有一個明確的說明..雖然,自己在項目中也測試了這麼長時間也沒有問題..但是總覺得有這個可能發生..

不知道大家是否在項目中碰到類似的疑惑呢??請有過這方面經驗的朋友指教..

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章