我有一个 Node 类,如下所示:
public class Node
{
public Dictionary<string, string> dictionary;
public Node(Dictionary<string, string> dictionary)
{
this.dictionary = dictionary;
}
public void CreateNode()
{
this.dictionary.Add("1", "String1");
Dictionary<string, string> dictionary1 = new Dictionary<string, string>();
Console.WriteLine(this.dictionary["1"]);
Node tmp = new Node(dictionary1);
tmp.dictionary = this.dictionary;
Console.WriteLine(tmp.dictionary["1"]);
tmp.AddE(tmp, "String2","2");
Console.WriteLine(this.dictionary["2"]);
}
public void AddE(Node tmp,String text,string c)
{
tmp.dictionary.Add(c,text);
}
}
Node 包含一个包含字符串键和值的字典,一个带参数的构造函数,一个方法 CreateNode(),它将一个项添加到字典中并创建另一个节点。现在,在 tmp.dictionary = this.dictionary; 之后,在 tmp.dictionary 添加了另一个项目,但它也添加在 this.dictionary (I不希望那种情况发生,我错过了。)
主要方法:
static void Main(string[] args)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
Node n = new Node(dictionary);
n.CreateNode();
}
输出是:
String1
String1
String2
对于这行代码 Console.WriteLine(this.dictionary [“2”]); 它应该显示此错误 KeyNotFoundException:给定的键不存在于字典中。< / em>因为我没有在 this.dictionary 添加一个带有键“2”的项目。希望我能说清楚。
答案 0 :(得分:7)
因为我没有添加带有键的项目&#34; 2&#34; at this.dictionary。
是的,你做到了。你通过这个电话做到了:
tmp.AddE(tmp, "String2","2");
这会添加一个带有键的条目&#34; 2&#34;和价值&#34; String2&#34;到tmp
所引用的字典...这是this
引用的字典,因为这行:
tmp.dictionary = this.dictionary;
您使用以下行创建的第二个字典:
Dictionary<string, string> dictionary1 = new Dictionary<string, string>();
...有资格进行垃圾收集,因为事后没有任何内容。它最初新tmp
节点中的字典,但是您将其替换为&#34; this&#34;中相同字典的引用,如上所示
旁注:尽量避免构造这样令人困惑的代码。像这样的方法是一个问题的方法:
public void AddE(Node tmp,String text,string c)
{
tmp.dictionary.Add(c,text);
}
这是一个实例方法,但它并没有使用&#34;当前&#34;的任何状态。实例(this
引用) - 相反,它修改了传入的节点的状态。最好写成:
public void AddE(String text, string c)
{
this.dictionary.Add(c,text);
}
...换句话说,改为修改this
的状态。 (在值之后传递键仍然很奇怪,而一个名为c
的参数没有提供关于它的意图的提示,但是&#&# 39;另一件事。)