欄位
欄位表示與物件或者型別(類或結構體)關聯的變數(成員變數),為物件或型別儲存資料。與物件關聯的欄位稱為“例項欄位”,隸屬於某個物件。與型別關聯的欄位稱為“靜態欄位”,表示某一個型別當前的狀態。
靜態欄位使用 static 關鍵字修飾。欄位在沒有顯示初始化的情況下會獲得其型別的預設值,靜態欄位在型別被載入時初始化,當一個資料型別被執行環境載入的時候,其靜態構造器會被呼叫且只被呼叫一次。例項欄位在物件建立是被初始化。
class Student
{
static public int number; //靜態欄位
private int id; //例項欄位
private string name;
private int age;
public Student() //例項構造器
{
name = "null";
}
static Student() //靜態構造器
{
number = 0;
}
}
Console.WriteLine(Student.number);
屬性
屬性用於訪問物件或型別的特徵的類成員。屬性大多數情況下是欄位的包裝器,由Get/Set方法對發展而來,實際上是一個語法糖。與欄位不同的是,屬性不表示儲存位置。
屬性和欄位一般情況下都用來表示實體(物件或型別)的狀態,更好的選擇是使用屬性來供外界訪問欄位,欄位使用 private 或 protected 修飾。
class Student
{
private int age; //欄位
public int Age //屬性
{
get { return this.age; }
set
{
if(value < 0 || value > 120) {
throw new Exception("Age value has Error!");
}
this.age = value; //返回 age 而不是 Age,否則會造成棧溢位
}
}
public int Score { get; set; } //屬性的簡略宣告,功能上和公有欄位一樣,不受保護,一般用於傳遞資料
}
Student stu = new Student();
stu.Age = 20;
Console.WriteLine(stu.Age);
索引
索引器使物件能夠用和陣列相同的方式(使用下標)進行索引。
class Student
{
private Dictionary<string, int> scoreDictionary = new Dictionary<string, int>();
public int? this[string subject]
{
get {
if (this.scoreDictionary.ContainsKey(subject))
{
return this.scoreDictionary[subject];
}
else return null;
}
set {
//獲取索引對應的值可以為空,但是設定時的值不能為空
if (value.HasValue == false)
{
throw new Exception("Score can't be null!");
}
if (this.scoreDictionary.ContainsKey(subject)){
this.scoreDictionary[subject] = value.Value;
}
else
{
this.scoreDictionary.Add(subject, value.Value);
}
}
}
}
class Program
{
static void Main(string[] args)
{
Student stu = new Student();
Console.WriteLine(stu["Math"]);
stu["Math"] = 90;
Console.WriteLine(stu["Math"]);
}
}
常量
成員常量是表示常量值的類成員,在編譯時將常量識別符號替換為對應的值,以提高程式執行時的效率。成員常量隸屬於型別而不是物件,沒有例項常量。“例項常量”的效果可以由只讀欄位來實現。“只讀”的應用場景:
1、提高程式可讀性和執行效率--常量
2、防止物件的值被改變--只讀欄位
3、向外暴露不允許修改的值--只讀屬性(靜態或非靜態),靜態只讀屬性和常量在功能上類似,但是編譯器對二者的處理不同。
4、希望成為常量的值其型別不能被常量宣告接受時(類/自定義結構體)--靜態只讀欄位
class Web
{
public const Building Location = new Building() { Address = "Address"}; //invalid
public static readonly Building Location = new Building() { Address = "Address" }; //valid
}
class Building
{
public string Address { get; set; }
}