延迟 属性 初始化在 C# 中不起作用
Lazy property initialization not working in C#
我在使用 this documentation 中描述的方法初始化 class
中的属性时遇到问题。
样本:
public class MyClass
{
private Lazy<string> _lazyString;
public MyClass()
{
_lazyString = new Lazy<string>(() => "hello world");
}
public string MyString => _lazyString.Value;
}
当我调试时,我可以看到 _lazyString
在我访问 MyString
属性 之前将其布尔值 IsCreated
设置为 true
。最近的 c# 迭代有什么变化吗?
我的目标框架是netcoreapp3.1
按预期工作。
正如@Progman 所指出的那样,使用调试器进行测试的问题在于,悬停该值会触发惰性操作。
要真正测试这种情况下的惰性,您可以使用 Lazy.IsValueCreated 属性。
用下面的代码可以看到
static void Main(string[] args)
{
MyClass c = new MyClass();
Console.WriteLine($"MyString not yet called.");
Console.WriteLine($"Is value created? {c.IsValueCreated}");
var s = c.MyString;
Console.WriteLine($"MyString called.");
Console.WriteLine($"Is value created? {c.IsValueCreated}");
}
public class MyClass
{
private Lazy<string> _lazyString;
public MyClass()
{
_lazyString = new Lazy<string>(() => "hello world");
}
public string MyString => _lazyString.Value;
public bool IsValueCreated => _lazyString.IsValueCreated;
}
输出:
MyString not yet called.
Is value created? False
MyString called.
Is value created? True
我在使用 this documentation 中描述的方法初始化 class
中的属性时遇到问题。
样本:
public class MyClass
{
private Lazy<string> _lazyString;
public MyClass()
{
_lazyString = new Lazy<string>(() => "hello world");
}
public string MyString => _lazyString.Value;
}
当我调试时,我可以看到 _lazyString
在我访问 MyString
属性 之前将其布尔值 IsCreated
设置为 true
。最近的 c# 迭代有什么变化吗?
我的目标框架是netcoreapp3.1
按预期工作。
正如@Progman 所指出的那样,使用调试器进行测试的问题在于,悬停该值会触发惰性操作。
要真正测试这种情况下的惰性,您可以使用 Lazy.IsValueCreated 属性。
用下面的代码可以看到
static void Main(string[] args)
{
MyClass c = new MyClass();
Console.WriteLine($"MyString not yet called.");
Console.WriteLine($"Is value created? {c.IsValueCreated}");
var s = c.MyString;
Console.WriteLine($"MyString called.");
Console.WriteLine($"Is value created? {c.IsValueCreated}");
}
public class MyClass
{
private Lazy<string> _lazyString;
public MyClass()
{
_lazyString = new Lazy<string>(() => "hello world");
}
public string MyString => _lazyString.Value;
public bool IsValueCreated => _lazyString.IsValueCreated;
}
输出:
MyString not yet called.
Is value created? False
MyString called.
Is value created? True