2017-01-13 3 views
-4

У меня вопрос о C# Dictionary в классе i. Проблема в том, что когда я заполняю словарь с помощью setValue (String str, object obj), все работает нормально. Но когда я запрашиваю значение из словаря (например, getX()), debuggins сообщает мне, что значение dictionaty = 0.C# Словарь пуст после вызова новой функции

Я не уверен, что я здесь делаю неправильно.

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(); 

На мой взгляд base1 типа KRLFrame будет содержать словарь под названием Dict, который будет связан с Base1. поэтому вызов base1.getX() должен привести к значению словаря с ключом «X» правильно?

Спасибо за помощь! ;)

KRLStruct класс использует folowing функцию:

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

Вы можете разместить класс KRLStruct? – MadOX

+0

Нет использования класса 1 в коде, который вы предоставили –

+1

Как 'KRLFrame' относится к' Class1' –

ответ

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 (дополнительное создание словаря), но это ничтожно.

+0

Это действительно решило проблему! Спасибо большое! –