当前位置: 首页 > 面试题库 >

只读集合属性的C#对象初始化

邴子实
2023-03-14
问题内容

为了我的一生,我无法弄清楚下面的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两次…规范中包含一个演示该示例的示例。



 类似资料:
  • 我正在开发一个Struts2 Spring Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合。 用例 我有一个团队模型,其关系被热切地加载为员工(我认为这显然是一个集合)。反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它。 现在。我调用我的(用Spring注入到我的Struts2控制器中),以便检索一个特定的已经加

  • 本文向大家介绍详解C#中使用对象或集合的初始值设定项初始化的操作,包括了详解C#中使用对象或集合的初始值设定项初始化的操作的使用技巧和注意事项,需要的朋友参考一下 使用对象初始值设定项初始化对象 可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数。 下面的示例演示如何将对象初始值设定项用于命名对象。编译器通过先访问默认实例构造函数然后处理成员初始化处理对象初始值设定项。

  • 问题内容: 有两个JPA实体:具有一对多关系的用户和订单。 我在每个方法都在事务中运行的服务层类中使用这些实体。一切都很好,除非服务层类的方法必须返回这些实体。 此方法可以很好地返回数据。但是,当我尝试访问接收到的集合元素时,我捕获到异常:“ org.hibernate.LazyInitializationException:无法延迟初始化角色集合:package.User.orders,没有会话

  • 在上一节里我们已经看了下如何操作一个对象的方法,这一节主要描述与对象属性有关的东西。有关如何对它进行定义的操作我们已经在上一章中描述过了,这里不再叙述,只讲对其的操作。 读取对象的属性 ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均