Доступ к жестко закодированным данным в приложении C # - PullRequest
1 голос
/ 14 июня 2010

Я пытаюсь избежать жесткого кодирования в .net 2.0, чтобы вскоре появилось приложение 3.5.

У меня большое перечисление, которое я хочу отобразить с 1 по 1 на набор строк. Каждое перечисляемое значение также будет отображаться в 1 из 2 значений, указывающих действие. Существующий код делает это с помощью большого оператора switch, но мне это кажется уродливым.

Есть ли лучший способ хранения и доступа к данным?

Я думал о файлах resx, но если учесть, что файл конструктора содержит столько же жестко закодированных значений, это кажется немного бессмысленным.

Является ли встраивание файла XML в сборку хорошей идеей?

Разве большой оператор switch не так плох, как кажется?

Есть ли лучшее решение?

Ответы [ 4 ]

1 голос
/ 14 июня 2010

Вы можете использовать атрибут описания Enum для назначения строки каждому значению enum.Я не знаю, является ли он более эффективным, чем оператор switch, но у него есть преимущество, заключающееся в том, что он присваивает строковое значение в том же месте кода, в котором определено перечисление..Есть также хороший пример здесь .

0 голосов
/ 14 июня 2010

Использование перечисления в этом случае - попытка поместить квадратный колышек в круглое отверстие.Принимая во внимание, что XML является излишним для того, что вы пытаетесь сделать.

Вместо этого используйте словарь.Таким образом, существует прямая связь «ключ => значение», и значение может быть любым.

Для строкового отношения 1-1 используйте следующее:

Dictionary<string, string> dictA = new Dictionary<string, string>();
dictA.Add("string1", "value1");
dictA.Add("string2", "value2");
dictA.Add("string3", "value3");

Чтобы получить доступ ко всем значениям словаря, используйте это:

foreach (KeyValuePair<string, string> item in dictA)
{   
    Console.WriteLine("Key: {0}; Value: {1};", item.Key, item.Value);
}

Если вам нужно строковое отношение 1-2 1-3 или 1-n, используйте это:

Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B"});
dictB.Add("string2", new List<string>() {"value2A", "value2B"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});

Чтобы получить доступ ко всем значениям словаря, используйте это:

foreach (KeyValuePair<string, List<string>> item in dictB)
{   
    Console.WriteLine("Key: {0}; Values: {1}, {2};", item.Key, item.Value[0], item.Value[1]);
}

Если вам нужно отношение массива в шахматном порядке, используйте это:

Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B, value1C"});
dictB.Add("string2", new List<string>() {"value2A", "value2B, value2C, value2D"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});

Чтобы получить доступ ко всем значениям словаря, используйте это:

foreach (KeyValuePair<string, List<string>> item in dictB)
{   
    string values = "";
    int valLen = ((List<string>)item.Value).Count;
    for (int i = 0; i < valLen; i++)
    {
        if (i == (valLen - 1))
        {
            values += item.Value[i] + "";
        }
        else
        {
            values += item.Value[i] + ", ";
        }
    }
    Console.WriteLine("Key: {0}; Values: {1};", item.Key, values);
}

Чтобы получить значение для определенного ключа, сделайте что-то вроде этого:

string match = "string2";
if (dictD.ContainsKey(match))
{
    Console.WriteLine("The value for Key='{0}' is: '{1}'", match, dictD[match]);
}

Enums isничего, кроме прославленного словаря.Вот почему вы не увидите их на многих других языках (особенно на языках с динамической типизацией).

0 голосов
/ 14 июня 2010

Также см. Ответы на этот вопрос.

ИМХО, большие операторы switch ВСЕГДА являются запахом кода, и их невозможно поддерживать.

0 голосов
/ 14 июня 2010

Несмотря на то, что уродливый оператор switch является наиболее эффективным способом отображения перечислений в строки.Внедрение XML-файла просто увеличит размер вашей сборки, и получение нужного строкового значения займет гораздо больше времени.

...