C# 为什么懒惰<;T>;在序列化期间强制初始化?

C# 为什么懒惰<;T>;在序列化期间强制初始化?,c#,.net,lazy-evaluation,C#,.net,Lazy Evaluation,当我检查Lazy类的实现时,我看到以下代码块: [OnSerializing] private void OnSerializing(StreamingContext context) { T obj = this.Value; } 如您所见,它在序列化期间强制初始化。有人知道为什么默认情况下首选此行为吗?如果没有,并且您提供了lambda进行初始化,您认为它在反序列化时在哪里检索值?lambda是不可序列化的。懒惰的整个要点是延迟计算,直到需要它为止。这可以节省您的处

当我检查Lazy
类的实现时,我看到以下代码块:

[OnSerializing]
private void OnSerializing(StreamingContext context)  
{  
     T obj = this.Value;  
} 

如您所见,它在序列化期间强制初始化。有人知道为什么默认情况下首选此行为吗?

如果没有,并且您提供了lambda进行初始化,您认为它在反序列化时在哪里检索值?lambda是不可序列化的。

懒惰的整个要点是延迟计算,直到需要它为止。这可以节省您的处理能力,因为在您真正需要计算之前,您不需要进行计算。当你序列化某个东西时,你通常想要序列化它的值,因此
Lazy
必须计算出该值是什么,这样你才能序列化它。

想知道是否有人有解决方法。我们在很多对象上都使用了Lazy,它工作得非常好,除非我们将对象放入自定义ASP.NET缓存中,因为对象的所有Lazy类型属性都序列化到缓存中,并计算.Value。这意味着这些惰性委托函数的“急切”加载代价高昂。大多数都是昂贵的数据库/存储库层

它没有回答他的问题,因为序列化时不需要它的值。这是因为你不能序列化lambda并延迟计算。这取决于T是什么,但是是的,这就是为什么你需要这个值。你不能依赖于能够序列化求值函数,所以你要序列化它的结果。我同意你所说的,但是你错了,lambdas不能序列化。有些lambda表达式可以序列化,但这不是一件好事。a)这不是答案。b) 也许可以为属性添加一个属性,使其不会被序列化/反序列化?