Dot-Net

為什麼我們使用 .NET 屬性而不是普通的舊 get/set 函式?

  • June 19, 2009

我了解提供介面以間接訪問類成員的許多好處。我的問題是:這不是你可以用任何 OO 語言使用(類似的東西)完成的事情嗎?

public int NormalClass::getQuality() {
   return this->quality;
}

protected void NormalClass::setQuality(int q) {
   this->quality = q;
}

?

除了純粹的美學之外,.NET 屬性還提供了哪些額外的好處?

如果你能提出令人信服的論據,我會接受“可讀性”;但就個人而言,我傾向於認為 get/set 函式比屬性更具可讀性,因為它明確地是一個函式,而不是一個直接的值。

**編輯:**感謝大家的回答!這對我來說真的很有幫助;總結一下我從已經說過的所有內容中收集/學到的東西,以下是我到目前為止得出的一些結論:

  • 屬性的最大好處不是來自屬性本身的特定功能,而是來自以特殊方式處理屬性的框架和 IDE 功能;例如,屬性編輯器、XML 序列化、數據綁定。
  • 可以通過某些便捷的方式將屬性視為簡單值,而 get/set 函式不能:特別是 obj.Prop++ 和 obj.Prop = value。
  • 屬性可以讓你擺脫使用公共成員的快速而骯髒的程式碼,而不必為以後實現一堆 get/set 函式而煩惱;如果您需要添加一些邏輯和/或將公共成員設為私有,您可以簡單地引入一個屬性,而不必冒險破壞任何舊程式碼。

現在,到目前為止,在 2 或 3 個答案中提出了一點,我個人覺得有些可疑:屬性意味著廉價的讀/寫操作,因此可以以與簡單變數基本相同的方式使用。我對這一點的問題是,屬性中沒有任何固有的東西可以真正強制執行這一點。這只是它們應該如何使用。對我來說,這類似於“shouldBePrivate”限定符,它指示一個值只能由其自己的類直接訪問,但無論如何仍可以從外部訪問;或巡邏街道的警察,提醒我們應該守規矩,但在我們開始犯罪時實際上並不干預(如果不強制執行,它對我們真正有什麼作用?)。

如果屬性有某種內置機制來確保讀/寫的廉價性,我會對這一點印象深刻。

Jon Skeet 在他的 C# 文章部落格中對屬性為何重要進行了出色的概述。在其中他解釋了為什麼應該使用屬性而不是暴露公共欄位。

至於為什麼要使用屬性而不是 getter/setter 方法,我建議以下想法:

  • 屬性提供了更清晰、更簡潔的語法,易於理解和閱讀。
  • 屬性啟用賦值表達式連結: A.x = B.y = C.z
  • 屬性清晰一致地傳達了數據訪問的語義——消費者期望沒有副作用。
  • .NET 中的許多庫都可以辨識屬性,用於諸如 XML 序列化、WPF 綁定、ASP.NET 2 路綁定等任務。
  • IDE 和許多視覺化設計器都可以辨識屬性,並且可以在屬性編輯器中顯示這些屬性。
  • 屬性啟用對遞增 (++) 和遞減 (–) 運算符的支持。
  • 屬性可以很容易地與使用反射的方法區分開來,並允許動態消費者提取有關對象公開的數據的知識。
  • C# 3 支持有助於消除樣板程式碼的自動屬性。

引用自:https://stackoverflow.com/questions/1019571