簡體   English   中英

C#中的靜態方法與實例方法

[英]Static methods vs instance methods in C#

對於我正在編寫的應用程序,我希望具有極端的可擴展性,並且擴展方法似乎能夠提供我想要的內容,以及在沒有實例的情況下調用它們的能力,我也需要它。

我記得讀過靜態方法比實例方法更快但沒有得到GC的優點。 這個對嗎?

我不太可能改變我的設計,除非我找到一個更好的替代設計而不是速度。 但仍然需要額外的信息,我想知道速度,GC等的差異。

編輯:謝謝。 更多信息:假設我們有一個Person類:

class Person

它可以有一個實例Distance方法,如:

this.Distance (Person p)

這很好,但這並沒有讓我能夠計算2點之間的距離(比如Point3),而不會創建Person類的實例。

我想要做的是:

class Person (no Distance methods)

但是距離的擴展方法:

Distance (this Person, Person)
Distance (this Point3, Point3)

這樣我可以這樣做:

myPerson.Distance (yourPerson)

Extensions.Distance (pointA, pointB)

EDIT2:@Jon,是的,我認為這就是所謂的(不要獲得GC的優勢),但我不知何故認為靜態方法會產生這種負擔/開銷。

在靜態和實例方法之間進行選擇是面向對象設計的問題。 如果您正在編寫的方法是對象的行為 ,那么它應該是實例方法。 如果它不依賴於對象的實例,則它應該是靜態的。

基本上,靜態方法屬於一種類型,而實例方法屬於一種類型的實例。

你是什​​么意思“沒有得到GC的優勢”? 方法不是垃圾收集 - 實例是。

虛擬方法比非虛擬方法慢,我猜在任何實例方法之前都存在令人討厭的空檢查,但它並不重要。 選擇最合適的設計。

靜態方法雖然是一種測試的痛苦 - 例如,如果你通過調用一些靜態方法在方法Foo()進行身份驗證,那么當你測試Foo()你不能讓它只是調用一個模擬身份驗證器(除非是靜態的)方法本身可以讓你這樣做)。 但是,如果您給出了正在測試包含Authenticate()方法的某個接口的模擬實現的原始實例,則可以使其按照您的意願運行。

編輯:在這種情況下,它聽起來像你真正需要的是Point類型的實例方法來計算兩點之間的距離(“這個”和另一個) - 或者可能是Distance類型上的靜態工廠方法。

如果速度更快,則意味着方法中的代碼執行得更快,然后沒有。 靜態方法中的代碼與非靜態方法中的代碼一樣快。

如果你在談論執行方法調用的開銷,那就變得有點復雜了。 對於Java而言,實例調用具有更多開銷。 在C#中,情況並非如此,因為默認情況下實例方法不是虛擬的。

因此,虛擬方法的開銷略高於非虛方法。 靜態方法不能是虛擬的,但實例方法可以聲明為虛擬。

至於垃圾收集,這主要與字段有關,而不是方法。 可以從代碼中的任何位置訪問靜態字段,因此垃圾收集器無法確定是否將再次使用該引用,因此永遠不會收集它。

根據你的例子,我會寫一個靜態效用函數來找到兩點之間的距離:

public static class Geometry
{
    public static double GetDistanceBetween(Point a, Point b) { ... }
}

然后我會給Person一個名為Position的屬性返回一個點。 所以我可以寫:

double distance = Geometry.GetDistanceBetween(personA.Position, personB.Position);

它實際上已經是英文 - 為什么讓它更加模糊? 如果你使Distance成為一個方法,那么你可以寫:

personA.Distance(personB)

要么:

personB.Distance(personA)

這兩個排序之間沒有區別,但是使用方法調用語法表明可能存在差異。

暫無
暫無

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

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