成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#靜態方法和實例方法辨析和實例

開發 后端
在這里我們將討論的是C#靜態方法和實例方法,希望大家能辯證的看待這個問題。包括聲明實例,調用實例方法;通過一個靜態的實例,去調用實例方法等等。

本文將圍繞c#靜態方法和實例方法討論一下。針對一些觀點,如:"靜態方法是常駐內存", 還有"靜態方法比實例方法先裝載",做一個辨析。同時討論下何時用靜態方法,何時用實例方法。

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

c#靜態方法和實例方法的幾種用法

見如下代碼:這三種形式我們應該都用過。

  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.     //***種方式, 聲明實例,調用實例方法   
  13.   SomeClass someClass = new SomeClass();   
  14.    someClass.instanceMethod();   
  15.  //第二種方式,通過一個靜態的實例,去調用實例方法   
  16.   SomeClass.instance.instanceMethod();   
  17.  //第三種方式,直接調用靜態方法   
  18.   SomeClass.staticMethod();   
  19.    }   
  20. }  

這幾種方式在調用時間,還有線程安全,面向對象的編程方面都有差別。后文會談到。

"靜態方法是常駐內存"

這是那位blog作者在評論中給出的觀點。我覺得"靜態方法是常駐內存"的說法是不對的。要知道一個.NET類型的靜態方法是屬于這個.NET類型的。而這個.NET類型是一個.NET 程序集的一部分。這個.NET程序集是被一個AppDomain裝入到內存里面來的。這個AppDomain是可以從內存卸載的。一個有.NET CLR的進程里面可以有多于一個的AppDomain,***個AppDomain之后的AppDomain都可以動態創建和卸載。這些AppDomain中的.NET程序集,既可以有靜態方法,也可以有實例方法。不管是靜態方法還是實例方法,都是隨其程序集所在的AppDomain一起創建和卸載。***個AppDomain在整個程序運行結束時也會***被卸載。其中所含的.NET程序集自然也卸載??磮D1會更明白點。所以靜態方法不存在常駐內存一說。

圖1

"靜態方法比實例方法先裝載"

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

何時用靜態方法,何時用實例方法

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

靜態方法正好相反,它不需要訪問某個實例的成員變量,它不需要去改變某個實例的狀態。我們把該方法定義成靜態方法。

***種方式, 聲明實例,調用實例方法

當一個類有多個實例,例如學生這個類,實例可以有學生甲,學生乙,學生丙,等等,我們就用***種方式。在多線程的情況下,只要每個線程都創建自己的實例,那么***種方法通常是線程安全的。

第二種方式,通過一個靜態的實例,去調用實例方法

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

第三種方式,直接調用靜態方法

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

原文標題:關于c#靜態方法和實例方法的辨析和應用

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

[[14295]]

【編輯推薦】

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

責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-28 12:47:30

C#靜態方法應用

2009-08-28 12:31:06

C#靜態方法

2009-08-31 09:41:05

C#反射靜態方法開發

2009-08-24 16:08:45

C# DrawStri

2021-04-21 10:01:53

Python類方法靜態方法

2015-07-09 10:44:48

C#WebService

2009-12-21 16:52:52

靜態路由設置

2009-10-09 09:07:40

C#委托和事件

2009-08-27 16:00:03

C#靜態字段C#實例字段

2009-08-28 12:41:49

靜態方法與非靜態方法

2009-08-31 16:01:28

C#水晶報表數據獲取方

2009-08-12 16:38:35

C#讀取XML節點

2009-08-04 16:58:21

C#線程BeginInvokeEndInvoke

2009-08-28 12:19:19

C#靜態方法

2009-08-28 12:25:58

C#靜態方法

2009-08-21 10:28:21

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

2009-08-31 09:47:22

C#靜態變量初始化

2009-08-31 10:18:00

C#靜態變量定義C#靜態變量

2009-08-28 16:37:32

C# for循環

2009-08-27 13:30:11

C# interfac
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色毛片免费 | 精品一区二区久久久久久久网精 | 最新国产视频 | 久草欧美 | 色播av | 蜜桃视频一区二区三区 | 欧美日韩一区二区在线播放 | 国产电影一区二区在线观看 | 亚洲免费精品 | 国产精品二区三区 | 久久综合99 | 国产精品久久久久婷婷二区次 | 91久久精品一区二区二区 | 欧美在线a | 九九热这里只有精品在线观看 | 精久久久 | 午夜成人免费视频 | 日韩有码一区 | 丁香婷婷久久久综合精品国产 | 在线一区二区三区 | 日本大香伊一区二区三区 | h在线免费观看 | 国产成人一区二区 | 岛国av免费观看 | 国产91在线播放精品91 | 91精品综合久久久久久五月天 | 日本在线视频不卡 | 成人影院免费视频 | 三级视频在线观看 | 免费的黄色片子 | 免费能直接在线观看黄的视频 | 一区二区av | 欧美xxxx黑人又粗又长 | 欧美日韩精品一区二区三区四区 | 国产丝袜一区二区三区免费视频 | 日韩在线观看网站 | 91精品国产777在线观看 | 先锋资源亚洲 | 中文字幕一区二区三区乱码在线 | 国产精品99久久久久久久久 | 久草新在线 |