在Getter或构造函数中初始化成员
问题描述:
这两种方法是否有区别?在Getter或构造函数中初始化成员
在这种方法中,我使用的吸气剂来初始化数据表
public DataTable Res
{
get
{
if (Res == null)
{
Res = GetDataTable();
}
return Res ;
}
private set;
}
与
在这种方法中,我使用的构造函数初始化该数据表
public class XYZ
{
public DataTable Res{ get; private set;}
//constructor
public XYZ()
{
Res= GetDataTable();
}
}
这个变量在ASP.net页面上用于填充DropDown列表。哪个表现会更好?
编辑: -
这是在Web应用程序中使用,其中的数据也不会改变。我将此表绑定到Page_Load事件中的下拉列表中。
答
问题是XYZ
类的给定实例是否总是需要并使用DataTable
。
如果没有,那么你会想懒惰初始化(使用你的getter),以避免无功而返。
如果你总是需要它,那么接下来的问题是在类的实例化和对属性的调用之间是否存在潜在的实质性延迟。如果是这样,那么在实例化时加载数据可能意味着你的数据比如果你等待直到属性获取器被调用时会更加陈旧。
另一方面,这不一定适用于Web场景,但在其他应用程序中,人们会想要考虑对该属性的调用是否需要高度响应以防止UI冻结。在这种情况下,预加载数据可能更可取。
答
是的,是有区别的。第一种方法称为lazy instantiation,意思是等到对象被实例化之前使用。这样做的好处在于,您需要等待最后一秒才能使用设置对象所需的内存和处理器。
第二种方法在您创建类后立即实例化该对象。这样做的缺点是,如果您从不使用该对象,那么您浪费了在分配对象时创建对象和内存的时间。
这用于数据不会更改的Web应用程序中。我将此表绑定到Page_Load事件中的下拉列表中。 – Quantbuff 2012-03-08 01:47:13