无法将Lazy初始化对象添加到通用列表

时间:2014-10-25 11:46:39

标签: 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(T value)
        {
            if (Count >= 100)
            {
                return;
            }
            Register[Count] = value;
            Count ++;
        }
}

然后是对象类:

class Book
    {
        public String Author { get; set; }
        public String Title { get; set; }
        public int Quantity { get; set; }

        public Book(String aut, String pav, int kiek)
        {
            this.Author = aut;
            this.Title = pav;
            this.Quantity = kiek;
        }

        public override string ToString()
        {
            return Author + " \"" + Title + "\" " + Quantity;
        }
    }

然后去我的Data课,我正在从文件中读取信息。我需要实现lazy initialization of object但是当我这样做时,我无法将我的对象存储在List中。

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
}

我该如何解决这个问题?我必须使用延迟初始化必需

1 个答案:

答案 0 :(得分:0)

如果你必须使用懒惰,有两种方法:

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

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

它的作用是定义如何初始化书籍的表达方式。这是一个糟糕的方法,因为你在第一行初始化惰性对象,并在第二行初始化它,这基本上使得使用Lazy<Book>无用。

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

public static void ReadBooks(BooksRegister<Lazy<Book>> allBooks)

在这种情况下,您的惰性初始化代码如下所示:

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

在这种情况下缺少的一件事是如何访问Book中的BooksRegister,因为现在它只是写入对象 - 您可以添加值,但无法从外部读取它上课。