簡體   English   中英

私有靜態方法。 總的來說好主意?

[英]Private static methods. Generally good idea?

以下摘錄來自FX Cop警告。

不訪問實例數據或調用實例方法的方法可以標記為靜態(在Visual Basic中為Shared)。 將方法標記為靜態后,編譯器將向這些成員發出非虛擬調用站點。 發出非虛擬調用站點將阻止在運行時檢查每個調用,以確保當前對象指針為非空。 對於性能敏感的代碼,這可以帶來可衡量的性能提升。 在某些情況下,無法訪問當前對象實例表示正確性問題。

我知道,如果私有方法不訪問實例數據或方法,則將它們設為靜態會帶來性能優勢,但我不確定在大多數情況下上述建議是否有效。 如果您正在編寫對性能至關重要的代碼,並且別無選擇,只能用C#編寫它,那么我可以理解這一觀點,但考慮到一般而言,與性能相比,應優先選擇健壯,易於閱讀和易於重構的代碼。您實際上是否遵循此建議?

私有靜態方法存在的問題是,當您需要重構類時,我發現靜態方法使這樣做更加困難。 如果您有大量的靜態方法,並且需要更改一個方法以使用實例變量,並且該方法被其他私有靜態方法使用,則最終必須進行更多更改才能使此方法起作用。 下面是一個示例(請記住,這是一個最小的實現,只是為了說明這一點):

public class Test
    {
        private IService myService;

        private static void DoSomething()
        {
            DoSomethingElse();
        }

        private static void DoSomethingElse()
        {
            DoSomethingMore();
        }

        private static void DoSomethingMore()
        {
            Console.Write("DO SOMETHING");
        }
    }

如果我想在DoSomethingMore方法中使用myService ,則意味着我不僅必須使該方法成為非靜態方法,而且還必須使前兩個方法成為非靜態方法。 這似乎很麻煩。

其他人對此有何看法?

這似乎很麻煩。

當您在修改DoSomethingMore方法時認為整個函數調用鏈依賴於一個實例時,更改的感覺是“繁瑣的”,而應該變成“必需的”。

您首先應該考慮的是所編寫方法的語義。 在編寫方法時,您需要問自己代碼是否應該是實例方法(因為它在語義上應該是與單個實例相關聯的操作)還是靜態方法(對於其他任何方法),而該決定應該決定如何編寫方法。

測量了生產代碼中無法接受的性能缺陷之前,應根據對您的域有意義的內容(而不是其他任何內容)來使方法實例成為靜態實例。

暫無
暫無

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

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