C#对象实例无法正常工作

时间:2016-07-03 16:24:12

标签: c# reference instance

我有一个 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”的项目。希望我能说清楚。

1 个答案:

答案 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;另一件事。)