只读集合属性的C#对象初始化
为了我的一生,我无法弄清楚下面的C#代码示例中发生了什么。测试类的collection(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,然后再调用Add
两次…规范中包含一个演示该示例的示例。
以上是 只读集合属性的C#对象初始化 的全部内容, 来源链接: utcz.com/qa/418712.html