標籤:c#.net 欄位與屬性
一個類中需要有描述這個類資訊的資料,而儲存這些資料的變數就成為欄位。
欄位預設的存取層級為private(只有本類可以直接存取),我們將其存取層級改為public,在其他類中就可以訪問了。
欄位和屬性工作表示對象包含的資訊,欄位類似於變數,因為可以直接讀取或設定他們。
屬性是對欄位的封裝。屬性可以對欄位的訪問進行控制,可以進行非法設定值的判斷。屬性並不儲存資料,欄位儲存資料。
封裝後,有一些欄位我只能賦值,不能讀取,有些只能讀取,不能賦值,而且可以對傳過來的值進行選擇。
建議所有的欄位不要寫成public層級,為欄位設定屬性,符合物件導向封裝的原則。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 屬性{ class Program { static void Main(string[] args) { } } class Person { //string _name; //欄位 姓名 欄位的預設存取層級為 private(只能在本類中調用) //public string Name //屬性 對欄位_name進行封裝 //{ // get // { // return _name; // } // set // { // _name = value; // } //} public string Name //這是自動實作屬性 方便快捷產生屬性 相當於以上注釋的代碼 { get; //當寫自動實作屬性時,get和set兩個都不能省 set; } private int _age; //欄位 年齡 public int Age //屬性 { get { return _age; } set { if (value < 0) //年齡是大於0的 { _age = 18; //如果使用者使用非法值,將年齡預設設定為18歲 } else { _age = value; } } } public char Gender; //欄位 性別 存取層級為public 在其他類中可以直接存取 private DateTime birthdate; //欄位 生日 該欄位的存取層級為private,我要想在其他類中使用該欄位,只好使用方法 public DateTime GetBirthdate() //這裡的方法相當於屬性中的get { return birthdate; } public void SetBirthdate(DateTime value) //這裡的方法相當於屬性中的set { birthdate = value; } //所謂屬性就是綁定了欄位的兩個方法 //當我們在屬性中不寫 get訪問體時,該欄位就是唯寫,不寫set訪問體時,該欄位就是唯讀。 }}
慣用法:屬性開頭字母大寫,欄位開頭字母小寫。
選中欄位 不論是public int age; 或者是private int age; 都可以。選中後按快速鍵 ctrl+r,e 彈出封裝欄位視窗,改改屬性名稱即可。
或是選中欄位後,滑鼠右鍵選擇重構,選擇封裝欄位,改改屬性名稱即可。
650) this.width=650;" src="http://img.blog.csdn.net/20140715093427032" />
650) this.width=650;" src="http://img.blog.csdn.net/20140715093522193" />
.net3.0之後就有了屬性的簡寫方式
public string Name { get; set; }
//編譯器自動幫我們產生私人欄位和set get程式碼片段
//自動實作屬性,get和set都不能省略
//唯讀屬性 public string Name{ get; private set;}
//唯寫屬性 public string Name{ private get; set;}
輸入prop + 再兩下tab鍵 會出現屬性的格式,改改傳回值,屬性名稱就可以了。
650) this.width=650;" src="http://img.blog.csdn.net/20140715093917114" />
按下兩下Tab鍵之後
650) this.width=650;" src="http://img.blog.csdn.net/20140715094032821" />
只需要改改傳回值,屬性名稱就好了。
public string Name { get; set; } //等同於下面的代碼
private string name;
public string Name
{
set{ this.name = value;}
get{ return this.name;}
}
自動實作屬性,自動實現了屬性的訪問器,快速產生屬性。
當屬性只需要單純的讀寫訪問時使用。另外,有些特別屬性也可以快速實現:
唯讀屬性:publicstring Str{ get; private set;}
唯寫屬性:publicstring Str{ private get; set;}
當屬性是派生屬性或者要做存取控制或需要控制非法值的時候,就不能如此使用了。這個時候需要自己實現訪問器:
private int _salary;public int Salary{ get { //工資不可以隨便給別人看,得有許可權 if(Authorization.Check(visitor)) return _salary; throw new NotAuthorizeException(); } set { //工資是大於零的 if(value > 0) { _salary = value; } else { //提示錯誤 } }}
本文出自 “為了夢,愛一生” 部落格,請務必保留此出處http://fanfl.blog.51cto.com/5493505/1438261