C#构造函数作为方法的参数?

时间:2015-10-25 14:23:54

标签: c#

我是C#脚本的新手。

我正在阅读一些代码,并且在一个类方法中,调用一个函数来添加到一个名为Listeners的Dictionary实例,如下所示:

public class ......
{
    private Dictionary<string, List<Component>> Listeners = 
        new Dictionary<string, List<Component>>();

    public void AddListener(Component Listener, string NotificationName)
    {
        // Add listener to dictionary
        if (!Listeners.ContainsKey(NotificationName))
            Listeners.Add (NotificationName, new List<Component>());

        // Add object to listener list for this notification
        Listeners[NotificationName].Add(Listener);
    }
}

现在,似乎对Listeners.Add的调用有一个构造函数调用

new List<Component>()

作为论据。

我说得对吗?

2 个答案:

答案 0 :(得分:4)

  

现在,似乎调用了Listeners.Add ...

你的意思是Listeners[NotificationName].Add的调用。

  

...有一个构造函数调用new List<Component>()作为参数。我做对了吗?

是的,该调用有两个参数。第一个参数是当前方法的形式参数,第二个参数是对象创建表达式。运行时这些参数的将是对字符串的引用和对新创建的对象的引用

这里的操作顺序是,首先评估 receiver ,然后生成那些参数值,然后调用Add方法,将这些值复制到其< em>形式参数,接收者值用作this

代码的含义是&#34;我有一个从名称到东西列表的地图;如果此地图没有特定名称的映射,请创建从名称到空白列表的映射&#34;。第二个Add调用然后将一个元素添加到该列表中。

来自对另一个答案的评论:

  

我无法接触到函数调用之外的实例引用

嗯,你在下一行上抓住它,再次从地图上读回来。但是如果没有允许您通过评估另一个表达式来获取该值的设备,就像在此处一样,那么您是正确的。那个表达式只产生一个值;它不会将任何名称与之关联,您可以在以后使用它。如果您想这样做,那么您需要创建一个本地变量。

答案 1 :(得分:0)

不,该调用获取List<Component>的新实例作为参数。

与方法不同,构造函数不能真正引用。虽然您可以在委托中存储方法引用并稍后调用它,但您不能对构造函数执行相同的操作。虽然这或多或少都没有意义,因为

Listeners.Add (NotificationName, new List<Component>());

大致表示以下内容:

var param1 = NotificationName;
var param2 = new List<Component>();
Listeners.Add(param1, param2);

如您所见,创建了一个新列表,并将新列表传递给Add方法。