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);