關於靜態方法與非靜態方法的執行效率

2021-07-27 23:45:32 字數 802 閱讀 3752

以前看到許多網友認為靜態方法要比例項方法在執行效率上要快一些,當初不敢苟同。自己親自試了一把,發現靜態方法確實要快一些。

想要比較靜態方法與非靜態方法的執行效率,需要對clr在呼叫靜態方法與非靜態方法時的不同之處要有乙個了解。

靜態方法是與類相關聯的,clr在呼叫乙個靜態方法時需要做的事情就是找到定義該方法的型別即可實現呼叫;而在呼叫非靜態方法時,為了保證執行安全,clr會對我們的源**進行驗證並額外的生成一些il中間**來確保執行安全,所以在呼叫乙個非靜態方法時,clr首先是判定被呼叫物件是否為null,如果為null,則引發乙個異常,反之,則根據物件推薦出其型別,最後實現呼叫。可以看出來,在呼叫靜態方法來非靜態方法時,後者比前者多做了一些工作,這將造成效能上的損失。所以,靜態方法在執行效率上可能要比非靜態方法要好一些。il中可以看到非靜態方法執行的是callvirt 指令:

clr via c#的解釋呼叫乙個靜態方法時,clr會定位與定義靜態方法的型別對應的型別物件。然後,jit編譯器在型別物件的方法表中查詢與被呼叫的方法對應的記錄項,對方法進行jit編譯(如果需要的話),再呼叫jit編譯的**。過程圖如下:

一般情況下宣告靜態方法的類大多是工具類,並且這些靜態方法不需要訪問型別中的非靜態欄位和事件,也就是說靜態方法與該型別中的非靜態欄位和事件不具有邏輯上的關聯性。如果乙個方法宣告為靜態方法,也意味著不能被重寫,該方法失去物件導向的擴充套件和多型的特性。

總結:靜態方法與例項方法在效能和占用記憶體上沒有明顯的區別,是否宣告為靜態方法需要從型別的非靜態字段、事件、物件導向擴充套件和多型這三方面來考慮。

關於靜態方法與非靜態方法的執行效率

以前看到許多認為靜態方法要比例項方法在執行效率上要快一些,當初不敢苟同。自己親自試了一把,發現靜態方法確實要快一些。想要比較靜態方法與非靜態方法的執行效率,需要對clr在呼叫靜態方法與非靜態方法時的不同之處要有乙個了解。靜態方法是與類相關聯的,clr在呼叫乙個靜態方法時需要做的事情就是找到定義該方法...

靜態方法與非靜態方法

靜態類 在類 class 上加入static修飾,表示該類無法被例項化,並且該類中,無法例項化變數或函式。那麼如果要在此靜態類中新增函式 變數 屬性,則必須都是靜態的。靜態類的主要特性 1 僅包含靜態成員。2 無法例項化。3 靜態類的本質,是乙個抽象的密封類,所以不能被繼承,也不能被例項化。4 不能...

靜態方法與非靜態方法

c 的類中可以包含兩種方法 c 靜態方法與非靜態方法。讓我們來看看最直觀的差別 使用了static 修飾符的方法為靜態方法,反之則是非靜態方法。下面我們分四個方面來看看c 靜態方法與非靜態方法的差異 c 靜態方法與非靜態方法比較一 c 靜態成員 靜態成員屬於類所有,非靜態成員屬於類的例項所有。每建立...