【发布时间】:2017-04-18 15:56:07
【问题描述】:
这是我从这里获得的项目中一些代码的原型,但我很难理解为什么它会以这种方式工作。 这是代码。
static void Main(string[] args)
{
SomeClass sm = new SomeClass();
var assigner = new Dictionary<string, Action<SomeClass, string>>
{
["TargetText"] = (someClass, value) => someClass.Name = value,
};
for (int i = 0; i < 10; i++)
{
Action<SomeClass, string> propertySetter;
if (!assigner.TryGetValue("TargetText", out propertySetter))
{
continue;
}
else
propertySetter(sm, "Johnny Bravo");
}
Console.WriteLine(sm); // output Johnny Bravo ????
}
}
public class SomeClass
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
public override string ToString()
{
return $"{Name}";
}
}
问题:
-
propertySetter委托在Main()中未分配,为什么允许使用它? - 当参数在
propertySetter(sm, "Johnny Bravo");中传递时,是什么指示它转到分配器字典? - 当它进入字典时,它如何知道要执行哪个 lambda 表达式(假设有多个),因为我没有看到像
"TargetText"这样的东西与propertySetter(sm, "Johnny Bravo");一起传递
这些是我现在对此唯一的问题,如果我想到其他任何问题,我会更新这篇文章。
【问题讨论】:
-
propertySetter在TryGetValue调用中分配。 -
每个线程一个问题。缩小问题范围
-
“是什么指示它进入分配者字典?” -- 你从
assigner得到它。它使用TryGetValue执行您从字典中提取的 lambda 表达式对象。
标签: c# delegates unassigned-variable