C#中靜態(tài)方法和非靜態(tài)方法的區(qū)別
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
靜態(tài)方法和非靜態(tài)方法的區(qū)別: 1.靜態(tài)方法不需要類實(shí)例化就可以調(diào)用,反之非靜態(tài)方法需要實(shí)例化后才能調(diào)用; 2.靜態(tài)方法只能訪問(wèn)靜態(tài)成員和方法,非靜態(tài)方法都可以訪問(wèn); 3.靜態(tài)方法不能標(biāo)記為override,導(dǎo)致派生類不能重寫(xiě),但是可以訪問(wèn); 4.靜態(tài)成員是在第一次使用時(shí)進(jìn)行初始化。非靜態(tài)的成員是在創(chuàng)建對(duì)象的時(shí)候,從內(nèi)存分配上來(lái)說(shuō)靜態(tài)是連續(xù)的,非靜態(tài)在內(nèi)存的存儲(chǔ)上是離散的,因此靜態(tài)方法和非靜態(tài)方法,在調(diào)用速度上,靜態(tài)方法速度一定會(huì)快點(diǎn),因?yàn)榉庆o態(tài)方法需要實(shí)例化,分配內(nèi)存,但靜態(tài)方法不用,但是這種速度上差異可以忽略不計(jì)。 何時(shí)用靜態(tài)方法,何時(shí)用實(shí)例方法: 1.一個(gè)方法和他所在類的實(shí)例對(duì)象無(wú)關(guān),不依賴new出來(lái)的實(shí)例,那么它就應(yīng)該是靜態(tài)的; 2.不需要面向?qū)ο蟮睦砟畹臅r(shí)候用靜態(tài);比如動(dòng)物-> RUN ,因?yàn)槟憧赡軙?huì)擴(kuò)展出貓 run、狗 run,這時(shí)候就需要用非靜態(tài)的方法。 關(guān)于線程安全: 靜態(tài)方法只有一個(gè)實(shí)例,當(dāng)有靜態(tài)變量的時(shí)候,對(duì)于高并發(fā)的時(shí)候,并發(fā)的所有執(zhí)行都走那個(gè)方法,靜態(tài)變量的值就會(huì)發(fā)生改變,導(dǎo)致出現(xiàn)問(wèn)題; 當(dāng)然并發(fā)不安全跟方法本身沒(méi)關(guān)系,跟共享的那個(gè)資源有關(guān)系比如某個(gè)變量,每個(gè)線程都對(duì)其進(jìn)行操作,都能改變其值,多線程(并發(fā)其實(shí)就是多線程),操作它,其值混亂,就有問(wèn)題了。 為什么要用非靜態(tài)方法這是本人寫(xiě)的一個(gè)方法,當(dāng)初直接寫(xiě)成static方法,沒(méi)有別的原因,是因?yàn)椴幌雽?shí)例化可以少些一行代碼,并沒(méi)有想過(guò)靜態(tài)和非靜態(tài)的區(qū)別= =!~~;當(dāng)然寫(xiě)成非static的方法也是可以的。 原因 1.因?yàn)榉椒ㄐ枰貜?fù)的調(diào)用,每次都去new一次會(huì)造成內(nèi)存的開(kāi)銷,使用靜態(tài)的方法就會(huì)一直在內(nèi)存中,不需要重新new一塊空間初始化數(shù)據(jù); 2.不需要去做OO; 3.方法不依賴new出來(lái)的內(nèi)容; 比較經(jīng)典的static方法,DBHelp里面基本上都是static方法。 該文章在 2021/3/3 17:49:58 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |