亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

方法可以是靜態的,但應該是靜態的嗎?

方法可以是靜態的,但應該是靜態的嗎?

C#
收到一只叮咚 2019-07-27 15:15:28
方法可以是靜態的,但應該是靜態的嗎?ReSharper喜歡指出每個ASP.NET頁面可能是靜態的多個函數。如果我把它們弄得靜止不動對我有幫助嗎?我是否應該使它們是靜態的,并將它們移動到實用程序類中?
查看完整描述

3 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

靜態方法與實例方法 
10.2.5靜態和實例成員C#語言規范解釋了這種區別。通常,靜態方法可以比實例方法提供非常小的性能增強,但只在一些極端的情況下(請參見這個答案有關這方面的更多細節)。

FxCop或代碼分析中的規則CA 1822規定:

在[將成員標記為靜態]之后,編譯器將向這些成員發出非虛擬調用站點,這將防止在運行時對每個確保當前對象指針為非空的調用進行檢查。這可能導致性能敏感代碼的可測量性能提高。在某些情況下,訪問當前對象實例的失敗代表了一個正確性問題。

效用類
除非在設計中有意義,否則不應該將它們移動到實用程序類。如果靜態方法與特定類型相關,如ToRadians(double degrees)方法與表示角度的類有關,該方法作為該類型的靜態成員存在是有意義的(注意,這是一個復雜的示例,用于演示)。




查看完整回答
反對 回復 2019-07-28
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

在我看來,性能、名稱空間污染等等都是次要的。問問自己什么是合乎邏輯的。該方法是對類型的實例進行邏輯操作,還是與類型本身相關?如果是后者,則將其作為一種靜態方法。只有當它與不受您控制的類型相關時,才將其移動到實用程序類中。

有時,有些方法在邏輯上對實例進行操作,但不碰巧使用實例的任何一種狀態尚未..例如,如果您正在構建一個文件系統,并且您已經得到了目錄的概念,但您還沒有實現它,那么您可以編寫一個返回文件系統對象類型的屬性,它將始終只是“file”-但是它在邏輯上與實例相關,因此應該是一個實例方法。如果要使方法變為虛擬的,這也很重要-您的特定實現可能不需要狀態,但派生類可能需要。(例如,詢問一個集合是否只讀-您可能還沒有實現該集合的只讀形式,但它顯然是集合本身的屬性,而不是類型。)



查看完整回答
反對 回復 2019-07-28
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊


我相信在您的情況下不會發生這種情況,但是我在一些代碼中看到了一種“難聞”-我通過維護使用了大量的靜態方法而不得不忍受這種情況。

不幸的是,它們是靜態方法,假定了特定的應用程序狀態。(當然,每個應用程序只有一個用戶!)為什么不讓用戶類在靜態變量中跟蹤這一點?)它們被美化了訪問全局變量的方式。他們也有靜態構造函數(!),這幾乎總是一個壞主意。(我知道有幾個合理的例外)。

但是,當靜態方法分解出實際上不依賴于對象實例的狀態的域邏輯時,它們是非常有用的。它們可以使您的代碼更具可讀性。

一定要把它們放在正確的地方。靜態方法是否侵入地操作其他對象的內部狀態?是否可以證明他們的行為屬于其中一個類呢?如果你沒有正確地區分關注點,你可能會在以后頭痛。



查看完整回答
反對 回復 2019-07-28
  • 3 回答
  • 0 關注
  • 309 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號