佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

熱門(mén)標(biāo)簽:銀行業(yè)務(wù) 電子圍欄 Mysql連接數(shù)設(shè)置 Linux服務(wù)器 阿里云 服務(wù)器配置 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 團(tuán)購(gòu)網(wǎng)站

在.Net平臺(tái)下進(jìn)行CS軟件開(kāi)發(fā)時(shí),我們經(jīng)常遇到以后還要用到某些變量上次修改后的值,為了簡(jiǎn)單起見(jiàn),很多人都習(xí)慣用static來(lái)定義這些變量,我也是。這樣非常方便,下一次調(diào)用某個(gè)函數(shù)時(shí)該變量仍然保存的是處理過(guò)的值,直接拿來(lái)用就可以了。

現(xiàn)在轉(zhuǎn)入了BS軟件開(kāi)發(fā),我們很自然地會(huì)沿用這種習(xí)慣。如在頁(yè)面中統(tǒng)計(jì)某個(gè)按鈕被按下的次數(shù),先在類(lèi)中OnClick事件的處理過(guò)程前定義一static變量times,則每次調(diào)用該按鈕的OnClick事件時(shí),令times增1即可,非常方便:
[C#]:

復(fù)制代碼 代碼如下:

...
static int times=0;
...
private void Button1_Click(object sender,EventArgs e)
{
times++;
Label1.Text=times.ToString();
}

在我們慶幸如此方便之余,就未曾意識(shí)到我們已經(jīng)埋下了一棵難以察覺(jué)的定時(shí)炸彈。為什么哪?
這還要從Asp.net的運(yùn)行機(jī)制談起。在CS模式軟件開(kāi)發(fā)過(guò)程中,我們通常不會(huì)關(guān)心應(yīng)用程序是在哪里運(yùn)行的,變量存放在哪里,客戶(hù)端程序就運(yùn)行在客戶(hù)端,服務(wù)器端程序就運(yùn)行在服務(wù)器端,一般情況下,二者除了數(shù)據(jù)庫(kù)中的數(shù)據(jù)外基本沒(méi)有其他共享的東西。所以這時(shí)客戶(hù)端的用戶(hù)大可放心的使用static變量,因?yàn)樗鼈兙痛娣旁诳蛻?hù)端程序中。

于是我們就習(xí)慣的在做BS模式的頁(yè)面時(shí)也用static變量,殊不知Asp.net中的static已不同于CS中的static。原因很簡(jiǎn)單,就是因?yàn)樵贏sp.net中所有的用戶(hù)將使用同一個(gè)static變量。這就意味著每一個(gè)使用該頁(yè)面的用戶(hù)對(duì)該變量的操作將會(huì)影響到其他用戶(hù)。就拿上面計(jì)數(shù)器的例子來(lái)說(shuō),假設(shè)times初試值為0,因?yàn)榇藭r(shí)只有我們自己在使用這個(gè)頁(yè)面,當(dāng)然不會(huì)有什么問(wèn)題,但如果有兩個(gè)人同時(shí)連接到這個(gè)頁(yè)面,如果A單擊了Button1一次,則B刷新頁(yè)面后Label1將顯示1,如果B再單擊Button1一次,則times變成2,兩個(gè)人刷新頁(yè)面后就出現(xiàn)問(wèn)題了:A和B都會(huì)說(shuō),我明明只單擊了Button1一次,怎么Label1就顯示我單擊了兩次哪?——這就是因?yàn)閮蓚€(gè)人共用的是服務(wù)器上同一個(gè)times,任何一個(gè)人對(duì)times的操作都會(huì)在使用該頁(yè)面的他人的瀏覽器中表現(xiàn)出來(lái)。問(wèn)題就出在這里。

怎么辦哪?還好,除了傳統(tǒng)的Asp中的Session對(duì)象外,Asp.net提供了一個(gè)更好的ViewState對(duì)象。ViewState對(duì)象用來(lái)保存頁(yè)面中的各種變量,甚至是對(duì)象。使用方法和HashTable類(lèi)似,只要用變量名稱(chēng)做索引,如ViewState["Var"],就可以用存取變量Var的值,而不管Var是普通變量,還是對(duì)象,甚至是內(nèi)存中的一張DataTable,太方便了。為什么可以用ViewState而不能用static變量哪?原因就是服務(wù)器端會(huì)為每個(gè)連接到該頁(yè)面的用戶(hù)分別建立一個(gè)ViewState,所以ViewState相當(dāng)于頁(yè)面級(jí)的Session。這下我們可以放心地使用ViewState來(lái)存取需要暫存的變量和對(duì)象了。
ViewState的用法很簡(jiǎn)單,如下所示
1、保存變量到ViewState中:
ViewState["times"]=times;//存放普通變量times
ViewState["Orders"]=dtOrders;//存放DataTable型對(duì)象dtOrders
2、讀出ViewState中的值:
times=(int)ViewState["times"];
dtOrders=(DataTable)ViewState["Orders"];
看見(jiàn)了吧?就如此簡(jiǎn)單!有的朋友會(huì)問(wèn)讀出變量的值時(shí)為什么要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換?這是因?yàn)楫?dāng)變量(不管是int型的普通變量times,還是DataTable型的對(duì)象dtOrders)被存放到ViewState中后,ViewState可不管你是普通變量還是對(duì)象,統(tǒng)統(tǒng)按Object來(lái)對(duì)待。所以當(dāng)我們?nèi)〕龃娣旁赩iewState中的東西時(shí),一定要轉(zhuǎn)換成相應(yīng)的類(lèi)型,否則就會(huì)報(bào)錯(cuò)。而這一操作不用在用ViewState保存變量時(shí)進(jìn)行,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換。(注意ViewState括號(hào)中的字符串只是為了標(biāo)識(shí)不同變量的索引,用不著非要和變量同名)所以上面計(jì)數(shù)器的代碼應(yīng)該這樣寫(xiě)才好:
復(fù)制代碼 代碼如下:

...
ViewState["times"]=0;
...
private void Button1_Click(object sender,EventArgs e)
{
int times=(int)ViewState["times"];
times++;
ViewState["times"]=times;
Label1.Text=times.ToString();
}

一般情況向下,將要保存到ViewState中的對(duì)象(或變量)用屬性的形式來(lái)實(shí)現(xiàn)會(huì)更方便。如對(duì)于上述的計(jì)數(shù)器times,可以這樣處理:
復(fù)制代碼 代碼如下:

...
private int times
{
get
{
return (int)ViewState["times"];
}
set
{
ViewState["times"]=value;
}
}
...
private void Button1_Click(object sender,EventArgs e)
{
times++;
Label1.Text=times.ToString();
}
...

在這里times將當(dāng)作私有屬性來(lái)操作,是不是非常方便?
那是不是說(shuō)static型變量就沒(méi)用了哪?當(dāng)然不是!在C#中用static聲明的類(lèi)不用實(shí)例化直接使用。正是由于所有用戶(hù)共享服務(wù)器端的同一個(gè)static變量,所以可以用static型對(duì)象來(lái)存取一些公用的處理模塊,比如類(lèi)型轉(zhuǎn)換、變量驗(yàn)證等工作。所以要根據(jù)具體情況而定。

還有一點(diǎn)需要注意:如果在頁(yè)面中多個(gè)過(guò)程要共享一個(gè)對(duì)象或變量,我們?cè)陧?yè)面類(lèi)的開(kāi)始部分定義一個(gè)頁(yè)面級(jí)的全局變量是不行的,static本來(lái)可以,但上面說(shuō)了這種類(lèi)型的變量不安全,所以這時(shí)就可以用ViewState。

好了,這下我們可以放心的暫存某些變量或?qū)ο罅恕?/P>
您可能感興趣的文章:
  • ASP.NET內(nèi)置對(duì)象之Application對(duì)象
  • Asp.Net Cache緩存使用代碼
  • asp.net 去除viewstate
  • asp.net 禁用viewstate在web.config里
  • Application,Session,Cookies對(duì)象應(yīng)用介紹
  • asp.net中的cookie使用介紹
  • asp.net Cookie值中文亂碼問(wèn)題解決方法
  • asp.net中Session緩存與Cache緩存的區(qū)別分析
  • ASP.NET之Response.Cookies.Remove 無(wú)法刪除COOKIE的原因
  • ASP.NET中在一般處理程序中使用session的簡(jiǎn)單介紹
  • ASP.NET中application對(duì)象的使用介紹
  • ASP.NET 使用application與session對(duì)象寫(xiě)的簡(jiǎn)單聊天室程序
  • ASP.NET中的Cache使用介紹
  • asp.net中ViewState的用法詳解
  • ASP.NET中Application、Cookie、Session、Cache和ViewState

標(biāo)簽:棗莊 廣元 衡水 蚌埠 衢州 江蘇 大理 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢(xún)

    • 400-1100-266
    祥云县| 辰溪县| 泰来县| 綦江县| 宜宾县| 水城县| 嘉禾县| 三江| 武城县| 中牟县| 中卫市| 博爱县| 铜梁县| 金秀| 巴南区| 永吉县| 桦甸市| 岫岩| 开鲁县| 北碚区| 东方市| 山东省| 清水河县| 封开县| 仁化县| 惠水县| 苍南县| 叶城县| 建德市| 西宁市| 通州区| 昔阳县| 浦北县| 通许县| 肥城市| 玛沁县| 杭锦后旗| 临泽县| 嘉义市| 甘洛县| 厦门市|