簡體   English   中英

什么是更好的? 靜態方法或實例方法

[英]What is better? Static methods OR Instance methods

我發現有兩種類型的方法稱為靜態方法和實例方法及其差異。 但我仍然無法理解一個人的優勢。

有時我覺得靜態方法不是100%面向對象的。

這兩者之間是否有任何性能差異。

有人可以幫忙嗎?

在完美的面向對象世界中,可能不需要靜態方法(我認為埃菲爾也沒有它們)。 但是在一天結束時,重要的不是你的代碼的純粹性(C#有足夠的概念,不是嚴格純粹的OO,比如擴展方法),而是你要做的事情。

您可以將靜態方法用於一般輔助方法(不需要自己的常規輔助類或狀態)或類似Color.FromARGB()的方法,它們對於值類型行為略微類似於構造函數。

通常,任何不接觸對象狀態的方法(因此比特定於對象的類更具體)都可以是靜態的。 不應該出現性能差異。 無論如何,不​​是很可衡量。 Jan Gray的精彩文章編寫更快的托管代碼:知道什么是成本有一些硬數據,盡管要小心謹慎。

靜態方法的用處主要是在需要調用方法而不實例化對象時。 例如,靜態方法可能實際上是查找現有實例並返回它(一個例子是單例實例)。

正如其他人所說,如果不訪問狀態,你可以使任何方法靜態,你將獲得微小的性能提升。

如果您確實希望能夠在特定實例上調用該方法,並獲得多態的好處(即派生類可以覆蓋該方法的行為),那么您應該將其作為實例方法。

如果您的類實現接口,那么屬於這些接口的方法也必須聲明為實例方法。

實例方法對實例來說很緊張。 因此,您可以看到靜態方法的一個優點是對實例不緊密。 靜態方法可以(如果可見)被其他對象用來解決它們的問題。 有時這很好,也很需要。 然后,您必須考慮將靜態方法保留在同一個類中,或者如果您開始構建實用程序類以供更廣泛使用。 我不會看到使用靜態方法是“少OO”。 靜態方法是避免OO缺點的一種方法(特別是在單繼承語言中)。 你可以稱之為更實用的方法(我知道它不是真的)。

考慮到這一切只是一堆問題,你應該問你的代碼,並確定它是否更好的實例方法,同一個類的靜態方法或另一個類的靜態方法。

我甚至不會考慮性能問題。 它會削弱你的設計,差別並不是那么大。 如果遇到性能問題,性能很重要。

實例方法需要傳遞一個隱式參數( this引用),這使得它們比static方法稍慢。 但這真的不應該是偏愛他們的理由。

有關相關討論,請查看:

* *可以*靜態的C#方法應該是靜態的嗎?

如果您的方法使用非靜態數據成員,請不要將其設置為靜態(您“不能”)。

如果你的方法不使用任何非靜態數據成員,你可以使它靜態,但這主要取決於你的設計,而不是它是否使用非靜態成員(無論如何,性能沒有太大差異,如Mehrdad所說)。

如果您的類中沒有非靜態數據成員,有時最好將所有方法設置為靜態(例如,為了良好的順序將輔助函數分組在一個類下)。

沒有人比另一個好。 這真的取決於你的要求。 如果要將更改作為整體應用於類,則會調用類方法。 當您不將更改應用於類而是應用於該類的唯一實例(對象)時,將調用實例方法。

所以我沒有看到為什么一個人應該比另一個更好的原因。

我部分猜測基於C#的遺產,但我懷疑它與其他OO語言相同。

靜態方法不需要對象來處理。 一個很好的例子是這樣的:

Double pi = Math.PI.

實例方法確實需要一個對象。 一個例子是:

Integer x = 9;
Integer y = x.sqrt();

並非屬於某個類的所有信息都需要為該類實例化的對象才能訪問它。 所有可用於創建對象的常量( Math.PIWindow.OVERLAPPED等)都是這方面的主要例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM