C# 无法将惰性初始化对象添加到常规列表

C# 无法将惰性初始化对象添加到常规列表,c#,generics,lazy-loading,lazy-evaluation,lazy-initialization,C#,Generics,Lazy Loading,Lazy Evaluation,Lazy Initialization,我有一份通用清单: class BooksRegister <T> { private T[] Register; public int Count { get; set; } public BooksRegister() { Register = new T[100]; Count = 0; } public void Add(

我有一份通用清单:

 class BooksRegister <T>
    {
        private T[] Register;
        public int Count { get; set; }

       public BooksRegister()
        {
            Register = new T[100];
            Count = 0;
        }

        public void Add(T value)
        {
            if (Count >= 100)
            {
                return;
            }
            Register[Count] = value;
            Count ++;
        }
}
然后是我的数据类,我从文件中读取信息。我需要实现对象的延迟初始化,但当我这样做时,我无法将我的对象存储在列表中

public static void ReadBooks(BooksRegister<Book> allBooks)
        {
            StreamReader sr = new StreamReader("ListOfBooks.txt");

            string line = "";
            while ((line = sr.ReadLine()) != null)
            {
                string[] words = line.Split('|');

                String tempAuthor = words[0];
                String tempTitle = words[1];
                int quant = Convert.ToInt32(words[2]);

                Lazy<Book> tempas = new Lazy<Book>();

                tempas.Value.Author = tempAuthor;
                tempas.Value.Title = tempTitle;
                tempas.Value.Quantity = quant;

                allBooks.Add(tempas); // error here
}

我怎样才能解决这个问题?我必须使用lazy初始化

如果必须使用lazy,有两种方法:

您可以使用以下命令更改惰性初始化代码:

Lazy<Book> tempas = new Lazy<Book>(() => new Book(tempAuthor, tempTitle, quant));
allBooks.Add(tempas.Value);
它所做的是定义一个关于如何初始化书籍的表达式。这是一种糟糕的方法,因为您在第一行初始化了惰性对象,而在第二行初始化了它,这基本上使使用惰性对象变得毫无用处

另一种方法是将方法签名更改为

public static void ReadBooks(BooksRegister<Lazy<Book>> allBooks)
在这种情况下,惰性初始化代码如下所示:

Lazy<Book> tempas = new Lazy<Book>(() => new Book(tempAuthor, tempTitle, quant));
allBooks.Add(tempas);

本例中缺少的一件事是如何访问BookRegister中的Book,因为它现在是只写对象-您可以添加值,但无法从类外读取它。

您尝试过allBooks.Addtempas.value吗?不,这很有效。但是现在我得到了缺少成员的异常:延迟初始化的类型没有公共的、无参数的构造函数。当您立即请求tampas新创建的对象的值时,这有什么懒惰的地方?最后一行是value?@OndrejJanacek我对延迟对象初始化是新手,但我必须在我的项目中使用此功能。我在寻找我能做得最好的方法哦,我的坏,一切都好。但是,您是否有任何其他想法可以让这个惰性初始化更合理地使用@dotnetom@user3662708如果您有一个加载成本很高的对象,并且您只想在使用它之前执行它,那么延迟初始化是有意义的。在您的例子中,如果您将方法读本包装在某种类型的存储库对象中,那么使用Lazy并仅在需要时初始化和加载所有数据是有意义的。您所说的存储库对象是什么意思?
Lazy<Book> tempas = new Lazy<Book>(() => new Book(tempAuthor, tempTitle, quant));
allBooks.Add(tempas);