-3

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

    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"propertySetter(sm, "Johnny Bravo");

这些是我现在对此唯一的问题,如果我想到其他任何问题,我会更新这篇文章。

4

1 回答 1

1

propertySetter 委托在 Main() 中是未赋值的,那么为什么允许使用它呢?

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

当参数传入 propertySetter(sm, "Johnny Bravo"); 是什么指示它进入分配者字典?

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

assigner.TryGetValue("TargetText", out propertySetter)

因此,该委托被分配给propertySetter它,它接受一个实例SomeClass并将其Name属性设置为给定值。在那之后,所有委托都需要一个类的实例和一个值,您将传入:

propertySetter(sm, "Johnny Bravo");
于 2017-04-18T16:00:55.967 回答