Лучший способ использовать свойство для ссылки на пару Ключ-значение в словаре [закрыто]
-
09-06-2019 - |
Вопрос
Это довольно тривиальный вопрос, но мне любопытно услышать мнения людей по этому поводу.
Если у меня есть словарь, доступ к которому я получаю через свойства, какой из этих форматов вы бы предпочли для свойства?
/// <summary>
/// This class's FirstProperty property
/// </summary>
[DefaultValue("myValue")]
public string FirstProperty {
get {
return Dictionary["myKey"];
}
set {
Dictionary["myKey"] = value;
}
Вероятно, это типичный способ сделать это.Это довольно эффективно, легко для понимания и так далее.Единственный недостаток заключается в том, что с более длинным или сложным ключом можно было бы написать его с ошибкой или изменить только один экземпляр или что-то в этом роде, что привело бы меня к этому:
/// <summary>
/// This class's SecondProperty property
/// </summary>
[DefaultValue("myValue")]
private const string DICT_MYKEY = "myKey"
public string SecondProperty {
get {
return Dictionary[DICT_MYKEY];
}
set {
Dictionary[DICT_MYKEY] = value;
}
Это немного сложнее, но, кажется, обеспечивает дополнительную безопасность и ближе к тому, что я бы назвал решением "Code Complete".Недостатком является то, что когда у вас также уже есть блок /// и блок [defaultValue()] над свойством, там начинает становиться немного тесно.
Итак, что вам нравится больше и почему?У кого-нибудь есть идеи получше?
Решение
Мне нравится второй вариант исключительно потому, что любое избегание магических строк / чисел в коде - это хорошо.IMO, если вам нужно сослаться на число или строковый литерал в коде более одного раза, это должна быть константа.В большинстве случаев, даже если он используется только один раз, он должен быть постоянным
Другие советы
Я согласен с @Glenn в отношении чисто придирчивой точки зрения.Ответ таков: все, что работает для вас.Весь этот код занимает 10 строк (если вы добавите опущенную последнюю фигурную скобку).Никто не заблудится, и вероятность опечатки довольно мала (не невозможна, но очень мала).С другой стороны, если вы использовали ключ где-то в другом месте, то ОПРЕДЕЛЕННО используйте константу.
Лично я бы разозлился на вас по поводу вашего стиля фигурных скобок.:) Просто шучу!Это действительно вопрос стиля.
Это не ответ на ваш вопрос, но я не думаю, что "defaultValue" означает то, что вы думаете.Он не устанавливает значение по умолчанию для вашего свойства.
Видишь MSDN и этот вопрос для получения более подробной информации.
Многие люди, вероятно, возразили бы, что второй вариант "правильный", потому что любое значение, используемое более одного раза, должно быть преобразовано в константу.Скорее всего, я бы использовал первый вариант.Вы уже приблизились к решению "Code Complete", инкапсулировав словарную статью в строго типизированное свойство.Это уменьшает вероятность ошибки при извлечении неправильной словарной записи в вашей реализации.Есть только 2 места, где вы могли бы ошибиться, набрав "MyKey", в получателе и установщике, и это было бы очень легко обнаружить.
Второй вариант был бы просто слишком запутанным.
Когда вы используете волшебную строку только в одном контексте, как вы это делаете, я думаю, это нормально.
Но если вам когда-нибудь понадобится использовать ключ в другой части класса, перейдите const
.
Вы могли бы сопоставить имена свойств с ключами и использовать отражение, чтобы получить имя для поиска.
public string FirstProperty {
get {
return Dictionary[PropertyName()];
}
set {
Dictionary[PropertyName()] = value;
}
private string PropertyName()
{
return new StackFrame(1).GetMethod().Name.Substring(4);
}
Это имеет дополнительное преимущество, заключающееся в том, что все ваши реализации свойств идентичны, поэтому вы можете настроить их в Visual Studio в виде фрагментов кода, если хотите.
@Джоэл, ты не хочешь рассчитывать на StackFrame. Внутренняя подкладка может испортить вам день, когда вы меньше всего этого ожидаете.
Но к вопросу:В любом случае, на самом деле это не имеет большого значения.