自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#靜態(tài)方法和實(shí)例方法辨析和實(shí)例

開發(fā) 后端
在這里我們將討論的是C#靜態(tài)方法和實(shí)例方法,希望大家能辯證的看待這個(gè)問題。包括聲明實(shí)例,調(diào)用實(shí)例方法;通過一個(gè)靜態(tài)的實(shí)例,去調(diào)用實(shí)例方法等等。

本文將圍繞c#靜態(tài)方法和實(shí)例方法討論一下。針對(duì)一些觀點(diǎn),如:"靜態(tài)方法是常駐內(nèi)存", 還有"靜態(tài)方法比實(shí)例方法先裝載",做一個(gè)辨析。同時(shí)討論下何時(shí)用靜態(tài)方法,何時(shí)用實(shí)例方法。

前幾日,在微軟的好友發(fā)給我一個(gè)鏈接:《靜態(tài)方法和實(shí)例化方法之間的區(qū)別你知道了嘛? 歡迎討論!! - 問題最終 ...》,然后說這里某些觀點(diǎn)需要澄清一下,希望我寫一篇blog。我當(dāng)時(shí)讀了這篇blog. 文比較短,列舉了靜態(tài)方法和實(shí)例方法的幾種案例,也沒有論點(diǎn),然后就請(qǐng)大家討論。后面評(píng)論就比blog熱鬧多了。言辭也激烈,后來該blog作者干脆把這篇blog刪了。現(xiàn)在已經(jīng)看不到這篇blog了?,F(xiàn)在我寫這篇blog,一是針對(duì)一些觀點(diǎn)做個(gè)辨析,二是完成好友的所托。

c#靜態(tài)方法和實(shí)例方法的幾種用法

見如下代碼:這三種形式我們應(yīng)該都用過。

  1. public class SomeClass   
  2. {   
  3. private string myfield = null;   
  4. public static instance = new SomeClass();   
  5. public instranceMethod() {};   
  6. public static staticMethod() {};   
  7. }   
  8.  public class AnotherClass   
  9.  {   
  10.  public static Main()   
  11.    {   
  12.     //***種方式, 聲明實(shí)例,調(diào)用實(shí)例方法   
  13.   SomeClass someClass = new SomeClass();   
  14.    someClass.instanceMethod();   
  15.  //第二種方式,通過一個(gè)靜態(tài)的實(shí)例,去調(diào)用實(shí)例方法   
  16.   SomeClass.instance.instanceMethod();   
  17.  //第三種方式,直接調(diào)用靜態(tài)方法   
  18.   SomeClass.staticMethod();   
  19.    }   
  20. }  

這幾種方式在調(diào)用時(shí)間,還有線程安全,面向?qū)ο蟮木幊谭矫娑加胁顒e。后文會(huì)談到。

"靜態(tài)方法是常駐內(nèi)存"

這是那位blog作者在評(píng)論中給出的觀點(diǎn)。我覺得"靜態(tài)方法是常駐內(nèi)存"的說法是不對(duì)的。要知道一個(gè).NET類型的靜態(tài)方法是屬于這個(gè).NET類型的。而這個(gè).NET類型是一個(gè).NET 程序集的一部分。這個(gè).NET程序集是被一個(gè)AppDomain裝入到內(nèi)存里面來的。這個(gè)AppDomain是可以從內(nèi)存卸載的。一個(gè)有.NET CLR的進(jìn)程里面可以有多于一個(gè)的AppDomain,***個(gè)AppDomain之后的AppDomain都可以動(dòng)態(tài)創(chuàng)建和卸載。這些AppDomain中的.NET程序集,既可以有靜態(tài)方法,也可以有實(shí)例方法。不管是靜態(tài)方法還是實(shí)例方法,都是隨其程序集所在的AppDomain一起創(chuàng)建和卸載。***個(gè)AppDomain在整個(gè)程序運(yùn)行結(jié)束時(shí)也會(huì)***被卸載。其中所含的.NET程序集自然也卸載。看圖1會(huì)更明白點(diǎn)。所以靜態(tài)方法不存在常駐內(nèi)存一說。

圖1

"靜態(tài)方法比實(shí)例方法先裝載"

這也是那篇blog的評(píng)論中某些人提出的觀點(diǎn)。我不知道他們的論據(jù)是什么,但是我已經(jīng)做過實(shí)驗(yàn),而且也寫過這兩篇blog關(guān)于.NET反射和metadata加載--致Jeffray Zhao等幾位和firelong和[繼續(xù)討論]關(guān)于Windows PE和.NET assembly的加載來證明.NET程序集的加載方式是整個(gè)地加載,而不是用到某個(gè)metadata才加載該metadata, 用到某個(gè)方法才加載該方法。因?yàn)殪o態(tài)方法和實(shí)例方法同屬于一個(gè).NET類型,而一個(gè).NET類型屬于一個(gè).NET程序集。在整個(gè)地加載一個(gè).NET程序集的時(shí)候,不管是靜態(tài)方法還是實(shí)例方法,都隨該程序集全部加載進(jìn)內(nèi)存。所以"靜態(tài)方法比實(shí)例方法先裝載"也是不成立的。

何時(shí)用靜態(tài)方法,何時(shí)用實(shí)例方法

先說實(shí)例方法,當(dāng)你給一個(gè)類寫一個(gè)方法,如果該方法需要訪問某個(gè)實(shí)例的成員變量時(shí),那么就將該方法定義成實(shí)例方法。一類的實(shí)例通常有一些成員變量,其中含有該實(shí)例的狀態(tài)信息。而該方法需要改變這些狀態(tài)。那么該方法需要聲明成實(shí)例方法。

靜態(tài)方法正好相反,它不需要訪問某個(gè)實(shí)例的成員變量,它不需要去改變某個(gè)實(shí)例的狀態(tài)。我們把該方法定義成靜態(tài)方法。

***種方式, 聲明實(shí)例,調(diào)用實(shí)例方法

當(dāng)一個(gè)類有多個(gè)實(shí)例,例如學(xué)生這個(gè)類,實(shí)例可以有學(xué)生甲,學(xué)生乙,學(xué)生丙,等等,我們就用***種方式。在多線程的情況下,只要每個(gè)線程都創(chuàng)建自己的實(shí)例,那么***種方法通常是線程安全的。

第二種方式,通過一個(gè)靜態(tài)的實(shí)例,去調(diào)用實(shí)例方法

這種情況比較特殊,通常是整個(gè)程序里該類唯一的一個(gè)實(shí)例,我們通過調(diào)用該實(shí)例的實(shí)例方法來改變?cè)搶?shí)例的某些狀態(tài)。這一個(gè)實(shí)例在多線程的情況下,通常是線程不安全的。除非我們給這個(gè)實(shí)例加鎖。防止其他線程訪問該實(shí)例。

第三種方式,直接調(diào)用靜態(tài)方法

這種情況下靜態(tài)方法不需要去改變某個(gè)實(shí)例的狀態(tài)。只要得到少量的參數(shù)就可完成既定事情。比如判斷一個(gè)文件是否存在,只要給個(gè)文件路徑和文件名,就能知道該文件是否存在。

原文標(biāo)題:關(guān)于c#靜態(tài)方法和實(shí)例方法的辨析和應(yīng)用

鏈接:http://www.cnblogs.com/mikelij/archive/2010/08/13/1798578.html

[[14295]]

【編輯推薦】

  1. C#模式窗體中的按鈕操作
  2. C#模式窗體操作詳解
  3. C#窗體繼承原理以及實(shí)現(xiàn)淺析
  4. C#窗體關(guān)閉事件的重載實(shí)現(xiàn)淺析
  5. C#窗體位置與大小設(shè)置詳解

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-08-28 12:31:06

C#靜態(tài)方法

2009-08-28 12:47:30

C#靜態(tài)方法應(yīng)用

2009-08-31 09:41:05

C#反射靜態(tài)方法開發(fā)

2009-08-24 16:08:45

C# DrawStri

2021-04-21 10:01:53

Python類方法靜態(tài)方法

2015-07-09 10:44:48

C#WebService

2009-12-21 16:52:52

靜態(tài)路由設(shè)置

2009-10-09 09:07:40

C#委托和事件

2009-08-27 16:00:03

C#靜態(tài)字段C#實(shí)例字段

2009-08-28 12:41:49

靜態(tài)方法與非靜態(tài)方法

2009-08-31 16:01:28

C#水晶報(bào)表數(shù)據(jù)獲取方

2009-08-12 16:38:35

C#讀取XML節(jié)點(diǎn)

2009-08-04 16:58:21

C#線程BeginInvokeEndInvoke

2009-08-28 12:19:19

C#靜態(tài)方法

2009-08-28 12:25:58

C#靜態(tài)方法

2009-08-21 10:28:21

C#異步方法C#同步方法

2009-08-31 09:47:22

C#靜態(tài)變量初始化

2009-08-31 10:18:00

C#靜態(tài)變量定義C#靜態(tài)變量

2009-08-28 16:37:32

C# for循環(huán)

2009-08-27 13:30:11

C# interfac
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)