C#學習筆記-欄位、屬性、索引器

owmt發表於2024-05-01

欄位

  欄位表示與物件或者型別(類或結構體)關聯的變數(成員變數),為物件或型別儲存資料。與物件關聯的欄位稱為“例項欄位”,隸屬於某個物件。與型別關聯的欄位稱為“靜態欄位”,表示某一個型別當前的狀態。

  靜態欄位使用 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);

C#學習筆記-欄位、屬性、索引器

索引

  索引器使物件能夠用和陣列相同的方式(使用下標)進行索引。

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; }
}

相關文章