代码改变世界

避免缓加载时因违反惯例导致的空引用!

2010-05-22 18:27  Franz  阅读(328)  评论(0编辑  收藏  举报

有时候我们在获取对象的某个值时,我们想使用的时候在去加载,而不是一开始就伴随这对象的创建而创建。我们在类的内部使用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
    }
    
}

 

 我们假设向要缓加载的是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                
                }
            }
        }
    }
    
}