c# 4.0 - c#对象的只读集合属性初始化

本文关键字:集合 属性 初始化 只读 对象 | 更新日期: 2023-09-27 17:50:08

对于我的生命,我不能弄清楚在下面的c#代码示例中发生了什么。测试类的集合(List)属性被设置为只读,但是我似乎可以在对象初始化器中给它赋值。

**编辑:修复了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);
        }
    }
}

c# 4.0 - c#对象的只读集合属性初始化

This:

MyClass c = new MyClass
{
    StringCollection = { "test2", "test3" }
};

被翻译成这样:

MyClass tmp = new MyClass();
tmp.StringCollection.Add("test2");
tmp.StringCollection.Add("test3");
MyClass c = tmp;

它从来没有尝试调用setter——它只是在调用getter的结果上调用Add。注意,它也不是清除原始集合。

在c# 4规范的7.6.10.3节中有更详细的描述。

编辑:作为兴趣点,我有点惊讶它调用了两次getter。我期望它调用getter一次,然后调用Add两次…规范中包含了一个示例,演示了。

你没有调用setter;你实际上每次都调用c.StringCollection.Add(...)(对于"test2"answers"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>();

但是你可以将项目分配给list…
我错了吗?

StringCollection属性没有setter,所以除非您添加setter,否则无法修改其值

相关文章: