假設我們有個簡易的帳戶類別 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裡面的值囉!
