簡體   English   中英

有什么區別…? [C#屬性GET / SET方式]

[英]What is the difference…? [C# properties GET/SET ways]

我知道在C#中,您可以輕松地創建數據類型的訪問器,例如,通過執行以下操作:

public class DCCProbeData
{
    public float _linearActual { get; set; }
    public float _rotaryActual { get; set; }
}

但是我的同事建議我這樣做:

public class DCCProbeData
{
    private float _linearActual = 0f;

    public float LinearActual
    {
        get { return _linearActual; }
        set { _linearActual = value; }
    }
    private float _rotaryActual = 0f;

    public float RotaryActual
    {
        get { return _rotaryActual; }
        set { _rotaryActual = value; }
    } 
}

我的方式似乎更簡單,更簡潔。 無論采用哪種方式,有什么區別和好處?

謝謝

編輯只是一個注釋,我的同事能夠使用圖表文件中最容易找到的“類詳細信息”窗格中的“重構”選項生成“第二種方式”的代碼。 這樣可以輕松添加許多屬性,而無需手動創建訪問器。

“你的方式”只是告訴編譯器創建第二個選項。 除非你在getter或setter中做其他事情,否則它們在功能上是相同的。

但是,以“你的方式”,我建議使用正確的C#命名約定。 我個人會把它寫成:

public class DccProbeData
{
    public float LinearActual { get; set; }
    public float RotaryActual { get; set; }
}

唯一的區別是你已經命名了這些字段。

(我會堅持你的同事為公共財產命名約定。)

他們在內部做同樣的事情。 唯一的區別是您無法使用“自動實現的屬性”直接訪問支持字段變量。

它們在技術上是相同的...... get / set是速記( 自動屬性 )。

關於此的很多問題:

  1. 何時使用get; 組; 在c#中
  2. 什么是{得到; 組; C#中的語法?
  3. 自動實現的屬性c#

您的方式不允許您初始化值,並且您的同事的方式遵循更標准的命名約定。

我想在其他答案中添加一些我沒有看到的東西,這使得#2成為更好的選擇:

使用第一種方法,您無法getset上設置斷點。

使用第二種方法,您可以getset上設置斷點,這對於調試訪問私有變量的任何內容非常有用。

好的,以前曾提到這些名字。 同樣值得注意的是,除了不遵循正常的.NET約定之外,開始使用下划線的公共名稱不符合CLS(事實上,將其用於私有名稱的一個原因正是因為這樣,它才能區分更清楚,並且如果您意外地具有錯誤的訪問級別,則應該向某些代碼檢查器發出警告)。

除了名稱之外,后一種形式的一個優點是可以添加更復雜的代碼。 盡管如此,從前一種風格到后一種風格都是一種不斷變化的變化,所以沒有理由在它需要之前做到這一點。

第一種方法是當您需要為您完成get和set以及私有存儲的簡單屬性時的方法。

如果在獲取或設置值時需要執行某些特殊操作,請使用第二種方法。

另外,我建議您堅持使用FxCop或ReSharper命名約定。

我相信在IL級別,他們最終都是一樣的。 在后台,VS在使用自動getter和setter時為您創建自動命名變量。

唯一可能更好的方法是,如果您覺得您將在以后為getter和setter添加更多邏輯。

即便如此,這似乎有點無意義。

沒有區別 ,但是在C#3之前你必須使用很長的路。 在一天結束時,它是一個C#功能 - 語法糖 它們在功能上都是相同的。

它們是相同的,因為您的代碼示例將自動生成支持字段。

但是這兩個代碼示例是不同的,因為屬性的名稱不相同( LinearActual vs linearActual

不使用自動實現的屬性時可以執行的操作:

  • 初始化為默認值
  • 訪問或注釋支持字段(屬性)
  • 只讀后備字段或不變性
  • 在訪問時設置斷點
  • 有關於訪問變量的自定義代碼
  • 使用[System.ComponentModel.EditorBrowsableAttribute()]在訪問器上啟用自定義邏輯,避免在編碼時意外繞過
    • 隱藏intellisense的支持字段

使用ReSharper,兩種方式之間的轉換非常簡單。

這並不是說不要一定使用它們,除非您需要列出任何其他功能。

暫無
暫無

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

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