iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

C#世界初探險系列 第 20

2022鐵人賽 Day 20 建立屬性

  • 分享至 

  • xImage
  •  

嗨嗨~大家安安
今天呢要來說說屬性這個東東,那首先我們要如何建立屬性呢?
建立屬性的方式大致上能分兩種:

  1. 直接在類別中宣告public變數
  2. 使用get及set存取子

那如何用public變數建立物件屬性?我直接上範例在類別中宣告public變數。如定義類別名稱為car,此類別內含一個整數資料型別的變數speed,在變數加上public變成公用變數,這樣car就有一個屬性了。

namespace project
{
    class car
    {
        public int speed;
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            car car = new car();
            car.speed = 100;
            Console.WriteLine("Car的speed={0}",car.speed);
        }
    }
}

車輛的速度

直接在class中宣告public變數雖然是建立屬性最快的方法,但對於這類型屬性存取並無法做任何額外控制,例如我們要為car類別上一個能夠限制在0~200的speed屬性,若採用public變數會發現,speed屬性值可以隨便設,設成負的也行,是其缺點,所以如果希望對於屬性的存取都能做一些額外的處理時,如控制屬性值的範圍,就必須使用方法或存取子敘述來定義屬性。
若希望對於屬性的存取都能做一些範圍控制,使具有物件封裝特性,可將speed屬性由public改成private,以_speed代替speed,用來存取speed的值,由於_speed是private,因此car上不能使用_speed做為屬性,下面我們來修改一下範例,讓Car的speed屬性能控制在0~200的範圍內

namespace project
{
    class car
    {
        private int _speed;
        public int getspeed()
        {
            return _speed;
        }
        public void setspeed(int speed)
        {
            if (speed < 0)
                _speed = 0;
            else if (speed > 200)
                _speed = 200;
            else
                _speed = speed;
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            car car = new car();
            car.setspeed(300);
            Console.WriteLine("Car的speed={0}",car.getspeed);
        }
    }
}

方法處理

可是這有一個小缺點,那就是在設定屬性時必須用呼叫方法加參數,而不能直接指定屬性值得方法,但C#提供get跟set存取子敘述來定義屬性,改寫程式如下:

namespace project
{
    class car
    {
        private int _speed;
        public int speed
        {
            get
            {
                return _speed;
            }
            set
            {
                if (value < 0)
                    _speed = 0;
                else if (value > 200)
                    _speed = 200;
                else
                    _speed = value;
            }
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            car car = new car();
            car.speed = 300;
            Console.WriteLine("Car的speed={0}",car.speed);
        }
    }
}

get,set

那接下來我們要如何建立唯讀(ReadOnly)或唯寫(WriteOnly)屬性呢?很簡單~~
當要唯讀時,屬性定義裡只出現get{...}不能出現set{...},反之,當要唯寫時就只能有set{...}不能有get{...},是不是很簡單啊~~~
最後,在類別內使用get跟set來定義屬性最大的優點就是可以隱藏實作和驗證程式碼,以達物件導向資料封裝,另外使用get跟set來定義,該屬性即可與控制項屬性進行資料繫結。若使用public公用變數當作類別屬性,就無法達到資料封裝,且該屬性也無法和控制項屬性進行資料繫結,所以建議將public公用變數改使用public公用屬性來表示。
在Visual C# 2005之前若是將所有public公用變數全改成屬性來表示將會是大工程。且像學生姓名這種單純字串的變數並不用進行資料封裝。若改用屬性表示,要先建立私有變數存放學生姓名內容,再透過get跟set來存取,是如次的麻煩,下面看範例:

class Student
{
    private string _ID, _name;
    public string ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    public string name
    {
        get{ return _name; }
        set { name = value; }
    }
}

由Visual C# 2008開始提供自動屬性實作,讓屬性定義更明確,且使用get跟set定義屬性不需要重複宣告,上面範例可改成下面寫法,看起來更加精簡

class Student
{
    public string ID { get; set; }
    public string Name { get; set; }
}

好啦,今天講的非常的多,就先到這邊告一段落啦~
大家掰掰


上一篇
2022鐵人賽 Day 19 建立類別/命名空間
下一篇
2022鐵人賽 Day 21 建立方法/事件
系列文
C#世界初探險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言