標籤:style blog color 使用 strong os
類成員包括變數和方法。如果希望其他類能夠訪問成員變數的值,就必須定義成公有的,而將變數設為公有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);把所有的欄位都設定為私人欄位,如果要暴露它們,則把它們封裝成屬性,這也是微軟推薦的方式。