C#对象初始化只读集合属性
对于我的生活,我无法弄清楚下面的C#代码示例中发生了什么。 testing类的集合(List)属性被设置为只读,但我似乎可以在对象初始值设定项中赋值给它。
**编辑:修正了列表“getter”的问题
using System; using System.Collections.Generic; using NUnit.Framework; namespace WF4.UnitTest { public class MyClass { private List<string> _strCol = new List<string> {"test1"}; public List<string> StringCollection { get { return _strCol; } } } [TestFixture] public class UnitTests { [Test] public void MyTest() { MyClass c = new MyClass { // huh? this property is read only! StringCollection = { "test2", "test3" } }; // none of these things compile (as I wouldn't expect them to) //c.StringCollection = { "test1", "test2" }; //c.StringCollection = new Collection<string>(); // 'test1', 'test2', 'test3' is output foreach (string s in c.StringCollection) Console.WriteLine(s); } } }
这个:
MyClass c = new MyClass { StringCollection = { "test2", "test3" } };
被翻译成这样:
MyClass tmp = new MyClass(); tmp.StringCollection.Add("test2"); tmp.StringCollection.Add("test3"); MyClass c = tmp;
它从来没有试图调用setter – 只是调用Add
来调用getter的结果。 请注意,它也不清除原始集合。
这在C#4规范的第7.6.10.3节中有更详细的描述。
编辑:就像一个兴趣点,我有点惊讶,它调用了两次的getter。 我期望它调用一次getter,然后调用Add
两次…规范包括一个例子,certificate这一点。
你不是在给二传手打电话。 你实际上每次调用c.StringCollection.Add(...)
(对于“test2”和“test3”) – 它是一个集合初始值设定项 。 因为这是财产分配,这将是:
// this WON'T work, as we can't assign to the property (no setter) MyClass c = new MyClass { StringCollection = new StringCollection { "test2", "test3" } };
我认为,只读,你不能这样做
c.StringCollection = new List<string>();
但你可以分配项目列表…
我错了吗?
StringCollection
属性没有setter,所以除非你添加一个你不能修改它的值。