属性初始化程序与初始化属性的旧方法。您可以澄清

时间:2017-01-21 07:24:51

标签: c# c#-6.0

用谷歌搜索但无法找到属性初始值设定项的使用说明

有人可以告诉我,如果下面的代码是相同的吗?是使用属性初始值设定项的属性是否只是一次成功?

这三种方法在效率和最佳实践方面初始化列表之间的区别是什么

    1)  private List<Address>Addresses
        {
            get
            {
                return addresses ?? (addresses = new List<Address>());
            }
        }

    2)  public List<Address> Addresses{ get; set; } = new List<Address>();

    3) within constructor  Addresses= new List<Address>()

谢谢你的澄清!

2 个答案:

答案 0 :(得分:1)

示例2和3在创建每个实例后立即初始化属性。

示例1初始化属性 lazily ;它通过仅在第一次调用属性getter时初始化支持字段(当支持字段仍未初始化时)来完成此操作。如果从不访问实例的Addresses属性,则支持字段完全有可能在给定实例的整个生命周期内保持未初始化状态。

延迟初始化是否更有效取决于属性以及如何使用它。

与示例2相同的前C#6是延迟初始化,但以下内容:

public List<Address> Addresses { get; set; }

...在构造函数中完成初始化。在同一语句中声明和初始化自动实现的属性是C#6的新功能。

答案 1 :(得分:0)

首先,不要使用类的具体实现来使用接口(例如IList)。其次,我更喜欢将属性初始化为默认构造函数中的地址,然后从另一个构造函数中调用此构造函数。 例如:

public class MyClass1
{
    public IList<MyPropertyClass1> Property1{get; protected set;}
    public MyPropertyClass2 Property2{get; protected set;}
    ...

    public MyClass1()
    {
        //I initialize Property1 by empty List<T>=> internal logic will not crashed if user try to set Property1 as null.
        Property1=new List<MyPropertyClass1>();
        Property2=default(MyPropertyClass2);
        ...
    }

    public MyClass1(IList<MyPropertyClass1> property1, MyPropertyClass2 property2)
        :this()
    {
        if(property1!=null)
        {
            Property1=property1;
        }
        if(property2!=default(MyPropertyClass2))
        {
            Property2=property2;
        }
    }
}