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


    有时候我们在获取对象的某个值时,我们想使用的时候在去加载,而不是一开始就伴随这对象的创建而创建。我们在类的内部使用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                
                    }
                }
            }
        }
        
    }
  • 相关阅读:
    LINQ基础——WHERE子句
    LINQ基础——LET子句
    LINQ基础——FROM子句
    Guid(全局统一标识符)
    ??运算符
    多线程的AutoResetEvent
    线程池(ThreadPool)
    Mutex
    Monitor类实现线程同步
    【java框架】MyBatis(7)--MyBatis注解开发
  • 原文地址:https://www.cnblogs.com/cuiweifu/p/avoid_nullreferenceexception.html
Copyright © 2020-2023  润新知