國慶可貴放鬆了一週,九月真的很大壓力。代價是回到學校以後一直還債,加上紅會那邊全體大會、R社的百團招新,學業和自學沒什麼進展,可是也擠時間學了不少東西。這周相對沒那麼忙了,受狒狒哥的啓發我也更新一下博客吧。(說那麼多,只是想說我沒有摸魚)面試
字段(field)是一種表示與對象或類型(類與結構體)關聯的變量。前面不少修飾的詞,最後的名詞是變量,因此說字段就是變量。字段是類型的成員(這就是它與通常變量的不一樣之處),舊稱「成員變量」,與對象關聯的字段也被稱爲「實例字段」,與類型關聯的字段成爲「靜態字段」,由static
修飾。靜態字段指的是隻初始化一次,只有一份,生命週期直到程序退出。
字段沒有顯式初始化時,字段得到其類型的默認值,因此字段不會存在未被初始化的狀況。實例字段在對象建立的時候初始化,靜態字段在類型被加載(load)的時候被初始化。
還有一類字段叫只讀字段,由readonly
修飾,字面意思就是隻能讀取不能修改。它與const
常量的區別在於:const
常量在聲明的時候就要初始化,而readonly
能夠先聲明,再後續初始化。可是被它們修飾的變量,一旦被初始化就不能修改它們的值。
爲了方便,介紹完屬性以後再給出代碼。函數
屬性(property)是一種用於訪問對象或類型特徵的成員,特徵反映了狀態。咱們使用屬性:對外能夠暴露數據,數據能夠是保存在字段裏面的,也能夠是動態計算出來的;對內能夠保護字段,不被非法值污染。屬性由get
、set
方法進化而來。
通常狀況下,建議使用屬性而不是字段來暴露數據,字段都設爲private
,這也很好體現了封裝的思想。
下面是一段代碼示範:this
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,這就決定了它只讀的性質,咱們是不能修改它的值的:
最後的結果:
至於判斷成員變量、實例變量,我相信不用我解釋了,一看就懂。spa
說實話將來兩個月都沒什麼時間,最近專心去攻C++,還得準備R社的會員課,壓力真的大。原本目標是這個寒假去面試實習崗的,可是感受本身的水平徹底不夠,並且師兄們也勸我不要盲目實習,如今仍是定爲暑假實習吧。C#接下來就要講委託、事件這些的,想一想都以爲麻煩,最怕越寫越亂、內容塞太多,仍是有空再靜下心來總結吧。(翻譯:摸了)翻譯