调用新函数后,C#Dictionary为空

时间:2017-01-13 08:39:24

标签: c# class dictionary

我在一个班级中有一个关于C#字典的问题。 问题是,当我用setValue(String str,object obj)填充字典时,一切正常。但是当我从字典中请求一个值时(例如getX()),debuggins告诉我dictionaty count = 0.。

我不确定我在这里做错了什么。

class KRLFrame: KRLStruct
{
    public Dictionary<string, double> dict = new Dictionary<string, double>();

    public KRLFrame(String name)
        : base(name, new String[] { "X", "Y", "Z", "A", "B", "C" })
    {

    }

    public KRLFrame setX(double d)
    {
        dict["X"] = d;
        return this;
    }

    public Double getX()
    {
        return dict["X"];
    }


    //@Overrides
    public override void setValue(String str, object obj)
    {
        String s = Convert.ToString(obj);
        s = s.Replace('.', ',');
        dict[str] = Convert.ToDouble(s);
    }

    public override Object getValue()
    {
        return dict;
    }
}

从底层类调用setValue函数。 主类调用这些函数:

 KRLFrame base1 = new KRLFrame("BASE_DATA[1]");
 base1.setX(10);
 client.readVariable(base1); //Code for reading a variable, in different class
 Console.WriteLine("BASE_DATA[1]: " + base1.getStringValue());
 Double d = base1.getX();

在我看来,KRLFrame类型的base1将包含一个名为dict的词典,它将链接到base1。因此调用base1.getX()应该导致字典值与键“X”对吗?

感谢您的帮助! ;)

KRLStruct类使用以下函数:

abstract class KRLStruct : KRLVariable
{
    private String[] nodes;

    public KRLStruct(String name, String[] nodes)
        :base(name)
    {
        this.nodes = nodes;
    }

KRLVariable是这样的:

 abstract class KRLVariable
{
    private int id;
    private String name;
    Random rnd = new Random();
    String strValue;

    public KRLVariable(string name)
    {
        this.name = name;
        this.id = rnd.Next(1, 999999) ;
    }

1 个答案:

答案 0 :(得分:0)

您的代码接缝正常,但您必须保护字典免受外部访问。我认为问题的根本原因在于此。

更改您的代码

private readonly Dictionary<string, double> dict = new Dictionary<string, double>();

同样修改getValue()方法,如下所示:

public override Object getValue()
{
    return dict.ToDictionary(m => m.Key, m => m.Value);
}

这将从您的词典中返回快照并保护您的原始快照。 它有一点GC的开销(额外的字典创建),但它可以忽略不计。