C# 涉及委托的代码如何工作?

C# How does code involving delegates work?

这是我从这里获得的项目中一些代码的原型,但我很难理解为什么它会这样工作。 这是代码。

    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}";
    }
}

问题:

  1. propertySetter 委托在 Main() 中未分配,为什么允许使用它?
  2. 当参数在 propertySetter(sm, "Johnny Bravo"); 中传递时,是什么指示它转到分配器词典?
  3. 当它进入字典时,它如何知道要执行哪个 lambda 表达式(前提是有多个),因为我没有看到 "TargetText" 之类的东西与 [=13= 一起传递]

这些是我现在唯一的问题,如果我想到其他的,我会更新这个post。

The propertySetter delegate is unassigned in the Main(), so why is it allowed to be used?

因为您将它作为 if 语句的 out 参数传递,保证它将被初始化为一个值。

When the arguments are passed in the propertySetter(sm, "Johnny Bravo"); what directs it to go to the assigner Dictionary?

您在与您正在查找的键 TargetText 关联的字典中有一个动作委托:

assigner.TryGetValue("TargetText", out propertySetter)

因此该委托被分配给 propertySetter 并且它采用 SomeClass 的实例并将其 Name 属性 设置为给定值。在那之后,所有委托需要的是 class 的实例和您传入的值:

propertySetter(sm, "Johnny Bravo");