C#快速入門教程(5)——欄位與屬性

曹化宇發表於2018-09-08

欄位(field)和屬性(property),在前面的課程中已經多次使用,本課,我們將繼續討論欄位和屬性應用上的一些細節。

欄位主要用於儲存類或物件的內部資料,大多數情況下,欄位都應該定義為私有的(private),這樣就可以有效的保護內部資料不會被直接或意外修改;屬性則多用於類或物件的公共(public)成員,用於外部設定和讀取資料,當然,也可以根據需要定義屬性資料的設定和讀取操作。

對於相對簡單,比如可以直接設定和讀取的資料項,可以使用簡單的語法定義為屬性,如下面的程式碼。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        //
        public string Model { get; set; }
        //
    }
}

程式碼中,我們在CAuto類中定義了一個名為Model的屬性,其型別是string,可以存放文字型別的資料,其內容使用一對雙引號包括,如“abc123”。下面的程式碼,我們在Program.cs檔案中測試Model屬性的使用。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            CAuto car1 = new CAuto();
            car1.Model = "X-18";
            Console.WriteLine("汽車型號:{0}", car1.Model);
        }
    }
}

程式碼執行結果如下圖所示。

enter image description here

本例中,Model屬性的資料可以設定和讀取,這樣的屬性稱為可讀寫屬性,相應的,我們可以控制屬性資料是否可以設定或讀取資料,下面分別討論。

只能讀取資料的屬性稱為只讀(readonly)屬性,如下面的程式碼,我們將Model屬性設定為只讀屬性。

public string Model { get; }

我們可以看到,定義屬性時只包含get塊,這個屬性就是隻讀屬性,可問題是,什麼時候設定它的資料呢?一般來講,只讀屬性的資料可以通過建構函式設定,建構函式是類中的一種特殊的方法,會在建立物件時呼叫,可以通過不同的引數帶入需要的資料,在下一課會詳細討論方法和其引數的設定問題。

此時,還有兩種處理方式,一是通過一個私有欄位存放資料,這也是傳統的屬性處理方式,如下面的程式碼。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        private string myModel;
        // 建構函式
        public CAuto(string model)
        {
            myModel = model;
        }
        //
        public string Model
        {
            get { return myModel; }
        }
        //
    }
}

這種方式下,需要定義一個私有欄位,如myModel;在建構函式中,會將帶入的資料儲存到myModel欄位中;然後,在Model屬性的get塊中返回myModel欄位的資料,也就是給出了Model屬性的資料。

另一種處理只讀屬性的方式是使用自動屬性,可以在定義屬性時將set語句塊設定為私有的,如下面的程式碼。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        // 建構函式
        public CAuto(string model)
        {
            Model = model;
        }
        //
        public string Model { get; private set; }
        //
    }
}

此方式處理只讀屬性需要注意,將set塊設定為私有的,還可以在類的內部,如建構函式中設定屬性值,但在類的外部則不能設定屬性值的操作。我們可以看到,使用後者處理只讀屬性,語法更加簡潔,含義也更加明確,這也是比較推薦的只讀屬性的實現方式。

雖然也可以使用只寫屬性,但實際應用情景並不多,但大家應該知道這種可行性,比如,下面的程式碼就是將LocalModel屬性設定為只寫。

using System;

namespace ConsoleTest
{
    public class CAuto
    {
        // 建構函式
        public CAuto() { }
        //
        public CAuto(string model)
        {
            Model = model;
        }
        //
        public string Model { get; private set; }
        //
        private string myLocalModel;
        public string LocalModel
        {
            private get
            {
                return myLocalModel;
            }
            set
            {
                myLocalModel = value;
            }
        }
        //
        public void ShowLocalModel()
        {
            Console.WriteLine("內部型號:{0}", myLocalModel);
        }
    //
    }
}

下面,我們在Program.cs檔案中測試LocalModel屬性的使用。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            CAuto car1 = new CAuto("X-18");
            car1.LocalModel = "x2018";
            car1.ShowLocalModel();
        }
    }
}

程式碼執行結果如下圖所示。

enter image description here

使用屬性時,還要注意例項屬性和靜態屬性的區別,例項屬性使用物件呼叫,而靜態屬性應該由類呼叫。

CHY軟體小屋原創作品!

相關文章