我是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>()
作为论据。
我说得对吗?
答案 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
方法。