iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
0
Software Development

我要轉職成 C# / .NET 工程師系列 第 22

Property翻譯成內容函式,比翻成屬性還要好懂

當一個類別被外部使用時,我們可能透過方法(函式)將內部的資料傳給外界來使用,而不是讓外界直接存取資料,例如將以下類別公開薪水的直接操控方式:

public class 員工
{
    public int 薪水 = 36000;
}

https://ithelp.ithome.com.tw/upload/images/20191008/20120420pG5FL9BBhV.png

取值方法(accessor method)與存值方法(mutator method)

改成為以下用方法讀取的方式:

public class 員工
{
    private int 薪水 = 36000;

    public void 調整薪水(int 調整值)
    {
        薪水 = 薪水 + 調整值;
    }
    public int 拿薪資()
    {
        return 薪水;
    }
}

https://ithelp.ithome.com.tw/upload/images/20191008/20120420MSVodYB051.png

可以看到將薪水設定成private後,外部使用這個類別都只能透過 拿薪資方法與調整薪水方法,來拿到薪水、調整薪水。以上這種方式被稱為取值方法(accessor method)與存值方法(mutator method)。

透過方法可以讓物件內部在存取的過程中自己調整,例如以下:

public void 調整薪水(int 調整值)
{
    薪水 = 薪水 + 調整值 * 1.5;
}
public int 拿薪資()
{
    return 薪水 * 1.2;
}

Property(內容函式)

Property中文上翻譯成屬性,我在2002年出版C#精要上看是被翻譯成內容函式,我個人比較喜歡用內容函式來稱呼,畢竟屬性感覺有靜態特徵的感覺,又容易跟attributec混淆,Property本質是種函式,是取值方法與存值方法的簡寫。

C# 1.0

C# 1.0提供Property可以透過get、set與傳入值value關鍵字,讓我們將先前的取值方法與存值方法寫簡潔一點,並讓我們在使用的過程中看起來就是在使用欄位(field)的資料,如以下:
https://ithelp.ithome.com.tw/upload/images/20191008/20120420eVrM72HvRF.png

若不想讓外部設定set內容,可以省略set{}不實作。

C# 2.0 加入存取修飾詞

C# 2.0 開始可以在get或set前面加入存取修飾詞例如private、internal或protected,未加上的話就是1.0預設public get與public set。

C# 3.0 提供自動實作Property

C# 3.0 提供自動實作Property(內容函式),可以讓我們少打一些字,自動產生私密薪水、取值方法(accessor method)與存值方法(mutator method)
https://ithelp.ithome.com.tw/upload/images/20191008/20120420ckjE4Wm1wV.png
背後會自動產生為以下程式碼

public class 員工
{
    private int _薪水 ;

    public int 薪水
    {
        get
        {
            return _薪水;
        }
        set
        {
            _薪水 = value;
        }
    }
}

C#編譯器提示可以自動替換
https://ithelp.ithome.com.tw/upload/images/20191008/20120420H0I3qCCCL2.png

當讓這是自動產生的程式碼是預設內容,方法中有額外操作便只能依原先方式手動撰寫

利用建構函式初始化物件後,使外部不能更改內容

https://ithelp.ithome.com.tw/upload/images/20191008/20120420PdkF6TaRIY.png

C# 6.0 提供自動唯讀實作Property

若要自動實作的Property,在建構函式初始化後,使內部也不能在更改,達到唯讀Property,C#6.0開始可以省略set來使用自動實作Property,使初始化後,內部也不能在更改。
https://ithelp.ithome.com.tw/upload/images/20191008/20120420K25trecJfy.png


上一篇
類別(一)-類別成員、存取修飾詞
下一篇
Indexer索引函式(索引子)-把物件當成陣列使用
系列文
我要轉職成 C# / .NET 工程師34

1 則留言

0
kellykerry
iT邦新手 5 級 ‧ 2020-06-25 15:28:42

這種好文怎麼那麼少人讀 !!!

我要留言

立即登入留言