Joe*_*ler 3 c# parallel-extensions
未来读者的更新:当.NET 4出现时,LazyInit<T>CTP将被重命名为Lazy<T>并将从一个结构更改为一个类,所以这几乎没有适用,除非为了说明为什么可变结构可能会有问题如果你不小心
我一直在使用Parallel Extensions June CTP中的LazyInit进行实验,我希望下面的代码可以打印出相同的Guid一千次,但它打印出一千种不同的Guid.很显然,我在这里遗漏了一些关于LazyInit应该如何工作的明显的东西,如果有人愿意指出它是什么,我会很感激.
using System;
using System.Diagnostics;
using System.Threading;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
for (int i=0; i < 1000; i++)
{
Console.WriteLine(TestClass.Instance.Id);
}
Console.Write("Press any key to continue:");
Console.ReadKey();
}
private class TestClass
{
private static readonly LazyInit<TestClass> _instance = new LazyInit<TestClass>(() => new TestClass(), LazyInitMode.EnsureSingleExecution);
public static TestClass Instance
{
get { return _instance.Value; }
}
private TestClass()
{
Debug.WriteLine("TestClass Constructor");
Id = Guid.NewGuid();
}
public Guid Id { get; private set; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 12
简短版本:使静态非读取,它将修复您遇到的错误.
长版:这是C#中一个被误解的部分.当您访问结构时,您正在访问该结构的副本.LazyInit.Value的底层调用是一个变异操作.通常会执行回写,但在只读字段的情况下,无法执行复制,因此您仍然保留未初始化的值.
非常详细的解释:http://ericlippert.com/2008/05/14/mutating-readonly-structs/
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |