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