類成員包括變量和方法。如果希望其他類能夠訪問成員變量的值,就必須定義成公有的,而將變量設為公有public,那這個成員變量的就可以被任意訪問(包括修改,讀取),這樣不利於數據安全。 C#通過屬性特性讀取和寫入字段(成員變量),而不直接直接讀取和寫入,以此來提供對類中字段的保護。屬性可用於類內部封裝字段。屬性是C#面向對象技術中封裝性的體現。
屬性和字段的區別:
- 屬性是邏輯字段,是字段的擴展,並不占用實際的內存;而字段占用內存空間。(這是很重要的區別)
- 屬性可以被其他類訪問;而非public的字段不能被直接訪問。
- 屬性可以對接受的數據在范圍上做限定;而字段不能。
使用屬性的情況:
- 要求字段只能讀或者只能寫;
- 需要限制字段的取值范圍;
- 在改變一個字段的值的時候希望改變對象的其它一些狀態;
使用字段的情況:
- 允許自由讀寫;
- 取值范圍只受數據類型約束而無其他任何特定限制;
- 值的變動不需要引發類中其它任何成員的相應變化。
示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Person { private string _name; private string _identificationID; private string _phoneNumber; public string Name { get; set; } //可讀,可寫 public string IdentificationID { get; private set; } //只讀 public string PhoneNumber { get { return _phoneNumber; } set { if (value.Length != 11) { Console.WriteLine("手機號碼應該為11位!"); } else { _phoneNumber = value; } } } } class Program { static void Main(string[] args) { Person cherry = new Person(); cherry.Name = "Cherry"; cherry.PhoneNumber = "12345678910"; cherry.IdentificationID = "320000000000000000"; //報錯,由於定義的是只讀屬性 } } }
總結:雖然在實際項目的開發過程中,公共字段和屬性在合適的條件下都可以使用,但是我們應該盡可能的使用屬性(property),而不是數據成員(field);把所有的字段都設置為私有字段,如果要暴露它們,則把它們封裝成屬性,這也是微軟推薦的方式。