簡體   English   中英

如何正確定義類屬性?

[英]How to properly define class properties?

在項目中定義新類時,這樣做的正確/最佳實踐是什么? 在過去,我創建了以下類:

  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }

通常我會使用這樣的類來創建項目中的集合。

然而,隨着我繼續學習和閱讀有關c#sharp的更多內容,我看到了將類定義為的示例:

    class MyClass //not set to public
    {
        private string  _firstName; //first defined as fields
        private string _lastName;

        public string FirstName  // then defined as properties 
        {
            get { return  _firstName; }
            set { _firstName = value; }
        }
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    }

第一種方法在定義上是否不正確,或者這是C#中可接受的速記版本? 作為最佳實踐,您應該首先使用私有字段定義類,然后使用get / set為值將它們定義為屬性?

我問,因為我在C#自學,我正在努力改進,以及更好地理解正確的開發方法,一些樣本和教程只是簡單地陳述方法沒有一個可靠的解釋為什么一種方法是首選(或應該是完成)另一個。

提前致謝

你的第一個例子:

public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}

特別是在c#3.0中引入的Auto-Implemented Properties 這兩種格式都不對。 第一個更像是“速記”。

對於更復雜的類型,有時使用舊樣式仍然有用,並且僅從私有變量中公開某些屬性或值,例如:

public class MyClass
{
    private Dictionary<int, List<string>> _someInternalDictionary;

    public int MyValuesCount
    {
        get
        {
            return _someInternalDictionary.Values.Count;
        }
    }

}

一個粗略的例子,但希望你得到我的想法。

第一個示例中的簡寫語法(自動實現的屬性)是在C#3.0中引入的,在此之前無效。 編譯器實際上將它們轉換為帶有支持字段的完整表單。

在C#3.0之前,定義屬性的唯一正確方法是使用支持字段。

即使使用C#3.0,如果要在屬性中包含任何邏輯,也需要將它們轉換為使用支持字段。

簡而言之 - 對於愚蠢的屬性(那些什么都不做),使用自動屬性。 它們使您的代碼更簡單,更易於閱讀和轉換。

您擁有的兩個類在功能和功能方面實際上是相同的。

自動屬性語法(第一個類)的目的是基本上為您提供一種快速方式來聲明與您顯示的第二個類基本相同的內容。

我會堅持使用第一個版本,直到你需要將代碼添加到getter或setter方法(比如驗證屬性的新值)。

自動屬性語法的目的是雙重的,它部分添加以便於Linq,並且部分添加以便更容易確保聲明屬性,而不是公共字段。

如果使用自動屬性(同樣,第一個版本)聲明一個類,那么針對您的代碼編譯的所有其他程序集將知道您的類將這些內容聲明為屬性,而不是字段。 如果您以后決定需要添加代碼(例如驗證),則不必重新編譯那些其他程序集,因為它們仍然可以找到屬性。

您還可以使用Access Modifier來獲取和設置...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; }

我假設您已經了解Access Modifier

暫無
暫無

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

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