プロパティとしての SelectedDatesCollection は ReadOnly ですが、項目の追加または削除のようにオブジェクトとして変更できます。
オブジェクトの変更 (別名、データを変更してメソッドを呼び出す) と、オブジェクト参照自体をクラスのメンバーとして変更することなどには違いがあります。
行うことによって:
SelectedDatesCollection dates = Calendar1.SelectedDates;
コレクションをコピーするのではなく、別の名前を付けるのと同じように、参照を保存するだけです。
最終的には、次のこともできます。
protected void Page_Load(object sender, EventArgs e)
{
Calendar1.SelectedDates.Add(new DateTime(2012, 5, 1));
Calendar1.SelectedDates.Add(new DateTime(2012, 5, 5));
Calendar1.SelectedDates.Add(new DateTime(2012, 5, 9));
}
他の方法の方が読みやすいと言うだけです。
dates
Calendar1.SelectedDates
まったく同じオブジェクトへの参照が含まれています。Add
メソッドを onで呼び出すのは、 ondates
で呼び出すのと同じCalendar1.SelectedDates
であり、その逆も同様です。
Calendar1.SelectedDates
2 番目のコード (コンパイルされない) で実行しようとしたときに再割り当てできなかった理由は、あなたが言ったように、SelectedDates が読み取り専用としてマークされているためです。
メンバーを読み取り専用としてマークすることは、それがすぐに割り当てられるか、クラス/構造体/などのコンストラクターでのみ割り当てられることを意味します。
ただし、そのオブジェクト内のデータを変更できないという意味ではありません。
これからは追加情報です
ELEMENTS の変更を許可しないクラス ReadOnlyCollection があります。
たとえば、読み取り専用の ReadOnlyCollection があると、メンバーを変更できず、要素も変更できません。
例:
public class Class1
{
public List<int> Numbers = new List<int> {1, 2, 3};
}
public class Class2
{
public readonly List<int> Numbers = new List<int> {1, 2, 3};
}
public class Class3
{
public ReadOnlyCollection<int> Numbers = new ReadOnlyCollection<int> {1, 2, 3};
}
public class Class3
{
public readonly ReadOnlyCollection<int> Numbers = new ReadOnlyCollection<int> {1, 2, 3};
}
違い:
var c1 = new Class1();
var c2 = new Class2();
var c3 = new Class3();
var c4 = new Class4();
c1.Numbers = new List<int> {4, 5, 6}; // Works
c1.Numbers.Clear(); // Works
c2.Numbers = new List<int> {4, 5, 6}; // Error
c2.Numbers = c2.Numbers; // Error - you just can't reassign it!
c2.Numbers.Clear(); // Works - you are just calling the Clear method of the existing list object.
c3.Numbers = new ReadOnlyCollection<int> {4, 5, 6}; // Works - the member is not readonly
// ReadOnlyCollection doesn't allow to change it's elements after initializing it.
// It doesn't even have these functions:
c3.Numbers.Clear(); // Error
c3.Numbers.Add(); // Error
c3.Numbers.Remove(2); // Error
c4.Numbers = new ReadOnlyCollection<int> {4, 5, 6}; // Error - the member is marked as readonly
// ReadOnlyCollection doesn't allow to change it's elements after initializing it.
// It doesn't even have these functions:
c4.Numbers.Clear(); // Error
c4.Numbers.Add(); // Error
c4.Numbers.Remove(2); // Error