Я пишу программу Winform протестировать параллельный словарь C# с ниже класса:valueFactory в Параллельное словаре
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 вызывался дважды, даже ключ уже существует в dict после первого метода GetorAdd.
Однако, если изменить определение 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. Интересно, есть ли подробное объяснение в том, что происходит под капотом, и я также не понимаю, почему я не могу передать значение valueFactory в качестве делегата, если мое определение Func - это ничего, кроме Func<int, Class1
(то же определение, что и словарь)
спасибо.