C#屬性與欄位
國慶難得放松了一周,九月真的很大壓力,代價是回到學校之后一直還債,加上紅會那邊全體大會、R社的百團招新,學業和自學沒什么進展,但是也擠時間學了很多東西,這周相對沒那么忙了,受狒狒哥的啟發我也更新一下博客吧,(說那么多,只是想說我沒有摸魚)
欄位
欄位(field)是一種表示與物件或型別(類與結構體)關聯的變數,前面很多修飾的詞,最后的名詞是變數,所以說欄位就是變數,欄位是型別的成員(這就是它與一般變數的不同之處),舊稱“成員變數”,與物件關聯的欄位也被稱為“實體欄位”,與型別關聯的欄位成為“靜態欄位”,由static修飾,靜態欄位指的是只初始化一次,只有一份,生命周期直到程式退出,
欄位沒有顯式初始化時,欄位獲得其型別的默認值,所以欄位不會存在未被初始化的情況,實體欄位在物件創建的時候初始化,靜態欄位在型別被加載(load)的時候被初始化,
還有一類欄位叫只讀欄位,由readonly修飾,字面意思就是只能讀取不能修改,它與const常量的區別在于:const常量在宣告的時候就要初始化,而readonly可以先宣告,再后續初始化,但是被它們修飾的變數,一旦被初始化就不能修改它們的值,
為了方便,介紹完屬性之后再給出代碼,
屬性
屬性(property)是一種用于訪問物件或型別特征的成員,特征反映了狀態,我們使用屬性:對內可以暴露資料,資料可以是保存在欄位里面的,也可以是動態計算出來的;對內可以保護欄位,不被非法值污染,屬性由get、set方法進化而來,
一般情況下,建議使用屬性而不是欄位來暴露資料,欄位都設為private,這也很好體現了封裝的思想,
下面是一段代碼示范:
using System;
namespace SomeNote
{
class Program
{
static void Main(string[] args)
{
Boy boy = new Boy(17, 1.85, 68);
Boy.Girlfriend = 1; //修改靜態欄位的值
Console.WriteLine(boy.Height);
Console.WriteLine(boy.Age);
Console.WriteLine(boy.Weight);
Console.WriteLine(boy.Sex);
Console.WriteLine(Boy.Girlfriend);
boy.Weight = 70; //修改屬性的值
boy.Height = 1.86;
Console.WriteLine(boy.Height);
Console.WriteLine(boy.Age);
Console.WriteLine(boy.Weight);
Console.WriteLine(boy.Sex);
}
}
class Boy
{
private double weight; //建議欄位都是private的
private int age;
public readonly string Sex = "Man"; //只讀欄位
public static int Girlfriend = 0;
public double Weight //完整宣告的屬性
{
get { return weight; }
set { weight = value; }
}
public double Height { get; set; } //簡略宣告,一個語法糖,vs偷偷幫你宣告了一個private的欄位
public int Age { get { return age; } } //只讀屬性,沒有setter
//建構式
public Boy(int age, double height, double weight)
{
this.age = age;
this.weight = weight;
this.Height = height;
}
}
}
其實欄位都不用多解釋了,一目了然,
weight和age都是private的,在boy這個實體里面看不到:

Sex是只讀欄位,不能修改它的值:

Girlfriend是靜態欄位,初始化之后就一直存在,直到程式退出,
Weight是一個屬性,它的值來自weight,可以通過屬性來修改欄位的值(有setter),
Height也是一個屬性,但是你一定想問,它和哪個欄位掛鉤了?其實這是個”語法糖“,可以通過反編譯看到它的原理,
Age是一個只讀屬性,它只有getter,沒有setter,這就決定了它只讀的性質,我們是不能修改它的值的:

最后的結果:

至于判斷成員變數、實體變數,我相信不用我解釋了,一看就懂,
一些牢騷
說實話未來兩個月都沒什么時間,最近專心去攻C++,還得準備R社的會員課,壓力真的大,本來目標是這個寒假去面試實習崗的,但是感覺自己的水平完全不夠,而且師兄們也勸我不要盲目實習,現在還是定為暑假實習吧,C#接下來就要講委托、事件這些的,想想都覺得麻煩,最怕越寫越亂、內容塞太多,還是有空再靜下心來總結吧,(翻譯:摸了)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/183042.html
標籤:.NET技术
