【发布时间】:2015-11-26 20:22:43
【问题描述】:
我正在编写一个 winform 程序来测试具有以下类的 C# 并发字典:
public class Class1
{
public int X = 10;
public Class1(int x)
{
X = x;
Debug.WriteLine("Class1 Created");
}
}
及以下按钮代码:
private void button1_Click(object sender, EventArgs e)
{
var dict = new ConcurrentDictionary<int, Class1>();
Func<Class1> valueFactory = () =>
{
Debug.WriteLine("Factory Called");
return new Class1(5);
};
var temp = dict.GetOrAdd(1, valueFactory());
Debug.WriteLine(temp.X);
temp.X = 20;
var temp2 = dict.GetOrAdd(1, valueFactory());
Debug.WriteLine(temp2.X);
}
我注意到 valueFactory 方法总是被执行并且 Class1 构造函数被调用了两次,即使在第一个 GetorAdd 方法之后键已经存在于 dict 中。
但是,如果我将 Func 定义更改为
Func<int, Class1> valueFactory = (k) =>
{
Debug.WriteLine("Factory Called");
return new Class1(5);
};
并像下面这样调用 GetorAdd 方法:
var temp = dict.GetOrAdd(1, valueFactory);
程序以所需的方式工作,因为它在第二次调用中没有调用 Class1 构造函数。我怀疑这是因为我将委托 valueFactory 而不是函数调用 valueFactory() 传递给 GetorAdd 方法。
我想知道是否有关于幕后发生的事情的详细解释,我也不明白为什么如果我的 Func 定义不是Func<int, Class1(与字典)
谢谢。
【问题讨论】:
标签: c# delegates func concurrentdictionary