使用屬性替換可訪問的資料成員

來源:互聯網
上載者:User

標籤:style   blog   color   io   使用   ar   for   資料   div   

自1.0版本以來,c#對屬性進行了一系列的增強,讓其表達能力不斷提高。你可以對setter和geter指定不同的存取權限。同時隱式屬性也極大降低了聲明屬性的工作量,不會比聲明資料成員麻煩多少。如果你還在類型中聲明公有成員,那麼快停下來吧,下面我們來對比一下兩者的優缺點:

1,屬性可以建立出類似於資料訪問,但實際上卻是方法調用的介面,所以它可以享受到方法調用的所有好處。

2,客戶代碼訪問屬性的時候,就像是在訪問公有欄位,不過其底層使用方法實現,其中還可以自由定義屬性訪問器的行為。

3,.Net Framework中的資料繫結類僅支援屬性,而不支援公有資料成員,對所有的資料繫結類庫均是如此,包括WPF,Windows Forms和Silverlight。資料繫結機制將使用反射來找到類型中的特定屬性:

textBoxCity.DataBindings.Add("Text",address,"City");這段代碼將textBoxCity控制項的Text屬性綁定到address對象的City屬性上。

4,在日後有新的需求或者行為時,屬性更易於修改。例如客戶要求名稱不可為空,若你使用了屬性來封裝Name,那麼只需要修改一處即可:

 public class Customer    {        private string name;        public string Name        {            get { return name; }            set            {                if (string.IsNullOrEmpty(value))                {                    throw new ArgumentException("名稱不可為空","Name");                }                name = value;            }        }    }

但是如果使用了公有資料成員,你就需要尋找每一處設定名稱的代碼並逐一修複。想想這會花費你多少時間。

5,由於屬性是使用方法來現實的,所以添加多線程支援也非常簡單,很容易在即有的屬性的get和set訪問器中做出如下修改:

 public class Customer    {        private object syncHandle = new object();        private string name;        public string Name        {            get            {                lock (syncHandle)                    return name;            }            set            {                if (string.IsNullOrEmpty(value))                {                    throw new ArgumentException("名稱不可為空", "Name");                }                lock (syncHandle)                    name = value;            }        }    }

6,屬性可以擁有方法的所有語言特性,例如屬性可以為虛的(virtual)

      public virtual string Name        {            get;            set;        }

7,屬性的訪問器將作為兩個獨立的方法編譯到你的類型中。在c#中,你可以get和set訪問器設定不同的存取權限。這樣你可以精妙的控制屬性暴露出來的資料成員的可見度:

      public virtual string Name        {            get;            protected set;        }

8,屬性的功能很強大,是個不錯的改進。但是你是不是還在考慮先用公有資料成員來實現,然後再改成屬性呢?這個看似不錯的策略,其實卻行不通。來看下面的代碼:

 public class Customer    {        public string Name;    }string name=customerOne.Name;customerOne.Name="Jim";

看似簡單直觀,你可以認為若是日後將Name改成屬性,那麼代碼可以無需任何修改。但是這個答案並不是完全正確。屬性僅僅是在訪問時類似於資料成員,但是屬性的訪問和資料的訪問將會產生不同的MSIL語言。所以當你想更新單一程式集變得非常困難。

9,效能比較

若是你查看產生的IL,那麼你或許會比較一下兩者的效能,屬性當然不會比資料成員訪問快,不過也不會比它差多少,只要不在屬性訪問器中執行長時間的計算或者進行跨應用程式的調用(例如執行資料庫操作)。

無論何時需要在類型的公有或者保護介面中暴露資料,都應該使用屬性,所有的資料成員都應該是私人的,沒有任何例外。

對於將變數封裝成一個屬性所需的額外輸入工作其實不會佔用太多時間,但是對於今後的維護卻帶來很大的方便。

使用屬性替換可訪問的資料成員

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.