延迟初始化始终返回null

时间:2017-03-16 11:49:34

标签: c# singleton lazy-loading

我有以下类,假设通过字符串数组创建迭代来检查代码是否存在。但是,使用延迟初始化时,.value始终返回null。

public class LazyInclusionList
{
    private string docCopyCode;
    private Lazy<LazyInclusionList> _docCopyCodeList = null;
    public LazyInclusionList()
    { }

    public bool GetDocCodes(string docCopyNumber)
    {
        docCopyCode = new string(docCopyNumber.Where(Char.IsLetter).ToArray());
        _docCopyCodeList = new Lazy<LazyInclusionList>();
        bool docCopyCheck = false;
        int last = _docCopyCodeList.Value.GetDocCodesDB.Count();
        int i = 0;

        foreach (string code in _docCopyCodeList.Value.GetDocCodesDB)
        {
            if(docCopyCode == code)
            {
                docCopyCheck = true;
            }
            else if (docCopyCode != code && ++i == last)
            {
                docCopyCheck = false;
            }
        }
        return docCopyCheck;
    }

    private string[] codes;
    public string[] GetDocCodesDB
    {
        set
        {
            codes = value;
        }
        get { return codes; }
    }

}

我使用以下测试方法来检查此代码。

[TestMethod]
public void CheckURLList()
    {
        var list = new LazyInclusionList();
        string[] array = new string [3] { "CB", "DB", "T" };
        list.GetDocCodesDB = array;
        string myTest = "CB10/00/1";
        Assert.IsTrue(list.GetDocCodes(myTest));
    }

这是我第一次使用这种方法并且不完全理解它。

1 个答案:

答案 0 :(得分:0)

我无法识别您示例中的已知模式,我决定用简单的词语解释这个想法。

  

字符串数组将存储在DB中,并且不希望每次需要时都行程

基本上就是这个

string[] _codes;
public string[] Codes
{
    get
    {
        if (_codes == null) // check if not initialized yet
        {
            _codes = ... // fill from database
        }
        return codes;
    }
}

首次读取Codes值时,其获取的结果和结果缓存null用作特殊值以运行初始化一次(如果bool的结果需要null,则可以使用另一个_codes字段。

Lazy<>正在做同样的事情(请参阅this question获取见解),其使用方式如下:

readonly Lazy<string[]> _codes = new Lazy<string[]>(() =>
{
    return ... // return here string[] which you fill from database
});
public string[] Codes => _codes.Value; // property used to get value

注意:Lazy<>(用于计算其Value的lambda)的初始化将只运行一次,与上面的缓存示例相同。要进行初始化,您只需访问Codes属性一次,任何进一步的调用都将返回缓存结果。