假設我們有個簡易的帳戶類別 Account
:
using System.Collections.Generic;
namespace DemoLibrary
{
public class Account
{
public string AccountName { get; private set; }
public decimal Balance { get; private set; }
public List<string> Transactions { get; private set;}
public Account()
{
Transaction = new List<string>();
}
}
}
屬性有:
AccountName
- 帳戶名稱Balance
- 帳戶餘額Transactions
- 交易紀錄
屬性都設為private set
了所以可以確保外界沒辦法更改我們的屬性。
是嗎?
因為List
的變數裡的值只是一串地址(List
的頭),所以private set
只是讓你不能夠修改那串地址,但是她並不會阻止你去修改裡面的值,創建實體後會發現Transactions
還是可以Add
、Insert
甚至是Remove
。
所以就算設了private set
,外界只要能get
到交易紀錄的屬性都能輕易地修改裡面的值。
那要怎麼辦呢? 把Transaction
改成IReadOnlyList
就可以囉!
範例:
using System.Collections.Generic;
namespace DemoLibrary
{
public class Account
{
public string AccountName { get; private set; }
public decimal Balance { get; private set; }
private List<string> _transactions;
public IReadOnlyList<string> Transactions
{
get { return _transactions.AsReadOnly(); }
}
public Account()
{
_transactions = new List<string>();
}
}
}
修改好後就會發現沒辦法去修改List
裡面的值囉!