文章来源 :IT工程技术网 http://www.systhinker.com/html/58/n-11658.html
有时候我们在获取对象的某个值时,我们想使用的时候在去加载,而不是一开始就伴随这对象的创建而创建。我们在类的内部使用lazy load的时候,一般是使用时去call一个方法让它真正的加载,但是方法用起来稍微有点别扭,毕竟xxxx().xxx有点难看,我们在.net里面一般都用属性来做这个工作了。
就如我下边的这个例子
代码
public
class
persion
{
private string _name;
private string _age;
private string Name
{
get
{
if (_name == null )
{
// lazy load _name value
}
}
}
private string Age
{
get {
if (_age == null ) {
// lazy load _age value
}
}
}
public void PrintName()
{
// use _name is error
}
public void PrintAge()
{
// use _age is error
}
}
{
private string _name;
private string _age;
private string Name
{
get
{
if (_name == null )
{
// lazy load _name value
}
}
}
private string Age
{
get {
if (_age == null ) {
// lazy load _age value
}
}
}
public void PrintName()
{
// use _name is error
}
public void PrintAge()
{
// use _age is error
}
}
我们假设向要缓加载的是Name和Age两个数据值(并且这两个数据我并不想对外公开),当然你可以认为那是从很遥远的火星拿下了的,速度并没有你想的那么快。我们真正用到的时候在去那。这个没有什么问题,也解决了我们缓加载的问题,但是如果你不小心用了一下_name或者_age那么.net在运行时就会告诉你空引用异常了。当然这个可以经过测试来检查这个问题。现在我们想要讨论的是如何避免这个问题。
自己闭上眼想一想如果是你你会如何避免这个问题。
我 的 答 案 如 下
下边是我经常使用的一种方案。
代码
public
class
persion
{
DataProvide _dataProvide = new DataProvide();
public void PrintName()
{
// call _dataProvide.Name
}
public void PrintAge()
{
// call _dataProvide.Age
}
private class DataProvide
{
private string _name;
private string _age;
public string Name
{
get
{
if (_name == null )
{
// lazy load _name value
}
}
}
public string Age
{
get {
if (_age == null ) {
// lazy load _age value
}
}
}
}
}
{
DataProvide _dataProvide = new DataProvide();
public void PrintName()
{
// call _dataProvide.Name
}
public void PrintAge()
{
// call _dataProvide.Age
}
private class DataProvide
{
private string _name;
private string _age;
public string Name
{
get
{
if (_name == null )
{
// lazy load _name value
}
}
}
public string Age
{
get {
if (_age == null ) {
// lazy load _age value
}
}
}
}
}
文章来源 :IT工程技术网 http://www.systhinker.com/html/58/n-11658.html