【问题标题】:C# How does code involving delegates work?C# 涉及委托的代码如何工作?
【发布时间】: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}";
    }
}

问题:

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

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

【问题讨论】:

  • propertySetterTryGetValue 调用中分配。
  • 每个线程一个问题。缩小问题范围
  • “是什么指示它进入分配者字典?” -- 你从assigner 得到它。它使用 TryGetValue 执行您从字典中提取的 lambda 表达式对象。

标签: c# delegates unassigned-variable


【解决方案1】:

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

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

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

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

assigner.TryGetValue("TargetText", out propertySetter)

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

propertySetter(sm, "Johnny Bravo");

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2012-08-02
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多