我在一个班级中有一个关于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) ;
}
答案 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的开销(额外的字典创建),但它可以忽略不计。