C#屬性與欄位
阿新 • • 發佈:2020-10-21
# C#屬性與欄位
國慶難得放鬆了一週,九月真的很大壓力。~~代價是~~回到學校之後一直還債,加上紅會那邊全體大會、R社的百團招新,學業和自學沒什麼進展,~~但是也擠時間學了很多東西。~~這周相對沒那麼忙了,受狒狒哥的啟發我也更新一下部落格吧。~~(說那麼多,只是想說我沒有摸魚)~~
## 欄位
欄位(field)是一種表示與物件或型別(類與結構體)關聯的變數。前面很多修飾的詞,最後的名詞是變數,所以說欄位就是變數。欄位是型別的成員(這就是它與一般變數的不同之處),舊稱“成員變數”,與物件關聯的欄位也被稱為“例項欄位”,與型別關聯的欄位成為“靜態欄位”,由```static```修飾。靜態欄位指的是隻初始化一次,只有一份,生命週期直到程式退出。
欄位沒有顯式初始化時,欄位獲得其型別的預設值,所以欄位不會存在未被初始化的情況。例項欄位在物件建立的時候初始化,靜態欄位在型別被載入(load)的時候被初始化。
還有一類欄位叫只讀欄位,由```readonly```修飾,字面意思就是隻能讀取不能修改。它與```const```常量的區別在於:```const```常量在宣告的時候就要初始化,而```readonly```可以先宣告,再後續初始化。但是被它們修飾的變數,一旦被初始化就不能修改它們的值。
為了方便,介紹完屬性之後再給出程式碼。
## 屬性
屬性(property)是一種用於訪問物件或型別特徵的成員,特徵反映了狀態。我們使用屬性:對內可以暴露資料,資料可以是儲存在欄位裡面的,也可以是動態計算出來的;對內可以保護欄位,不被非法值汙染。屬性由```get```、```set```方法進化而來。
一般情況下,建議使用屬性而不是欄位來暴露資料,欄位都設為```private```,這也很好體現了封裝的思想。
下面是一段程式碼示範:
```C#
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```這個例項裡面看不到:
![私有成員](https://img2020.cnblogs.com/blog/1887798/202010/1887798-20201020231918860-1739150871.png)
```Sex```是隻讀欄位,不能修改它的值:
![只讀欄位](https://img2020.cnblogs.com/blog/1887798/202010/1887798-20201020232054872-247514252.png)
```Girlfriend```是靜態欄位,初始化之後就一直存在,直到程式退出。
```Weight```是一個屬性,它的值來自```weight```,可以通過屬性來修改欄位的值(有setter)。
```Height```也是一個屬性,但是你一定想問,它和哪個欄位掛鉤了?其實這是個[”語法糖“](https://baike.baidu.com/item/語法糖/5247005?fr=aladdin),可以通過反編譯看到它的原理。
```Age```是一個只讀屬性,它只有getter,沒有setter,這就決定了它只讀的性質,我們是不能修改它的值的:
![只讀屬性](https://img2020.cnblogs.com/blog/1887798/202010/1887798-20201020232914696-640320209.png)
最後的結果:
![結果](https://img2020.cnblogs.com/blog/1887798/202010/1887798-20201020233042397-190463409.png)
至於判斷成員變數、例項變數,我相信不用我解釋了,一看就懂。
## 一些牢騷
說實話未來兩個月都沒什麼時間,最近專心去攻C++,還得準備R社的會員課,壓力真的大。本來目標是這個寒假去面試實習崗的,但是感覺自己的水平完全不夠,而且師兄們也勸我不要盲目實習,現在還是定為暑假實習吧。C#接下來就要講委託、事件這些的,想想都覺得麻煩,最怕越寫越亂、內容塞太多,還是有空再靜下心來總結吧。~~(翻譯:**摸了**)~~