在Getter或Constructor中初始化成员

时间:2012-03-08 01:32:54

标签: c# asp.net constructor getter

这两种方法有区别吗?

在这种方法中,我使用getter来初始化DataTable

public DataTable Res
{
    get
    {
        if (Res == null)
        {
            Res = GetDataTable();
        }
        return Res ;
    }
    private set;
}

VS

在这种方法中,我使用构造函数初始化DataTable

public class XYZ
{
    public DataTable Res{ get; private set;}
    //constructor 
    public XYZ()
    {
        Res= GetDataTable();            
    }
}

此变量在ASP.net页面上用于填充DropDown列表。哪个会表现更好?

编辑: -

这用于不会更改数据的Web应用程序。我将此表绑定到Page_Load事件中的下拉列表。

2 个答案:

答案 0 :(得分:1)

是的,有区别。第一种方法称为延迟实例化,这意味着您要等到对象在实例化之前使用。这样做的好处是你要等到最后一秒才能耗尽设置对象所需的内存和处理器。

第二种方法在创建类后立即实例化对象。这样做的缺点是如果你从不使用该对象,那么在分配对象时浪费了时间来创建对象和内存。

答案 1 :(得分:1)

问题是,课程XYZ的特定实例是否始终需要并使用DataTable

如果没有,那么你想要懒惰初始化(使用你的getter),以避免事先做好工作。

如果你总是需要它,那么接下来的问题是在实例化类和调用Res属性之间是否存在任何实质性的延迟。如果是这样,那么在实例化时加载数据可能意味着您的数据比在等待属性getter被调用时更加陈旧。

对此的反面并不一定适用于Web场景,但在其他应用程序中,人们会想要考虑对属性的调用是否需要高度响应以防止UI冻结。在这种情况下,预加载数据可能更为可取。