我有通用名单:
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
}
我该如何解决这个问题?我必须使用延迟初始化必需
答案 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
,因为现在它只是写入对象 - 您可以添加值,但无法从外部读取它上课。