Лучший способ использовать свойство для ссылки на пару Ключ-значение в словаре [закрыто]

StackOverflow https://stackoverflow.com/questions/44100

Вопрос

Это довольно тривиальный вопрос, но мне любопытно услышать мнения людей по этому поводу.

Если у меня есть словарь, доступ к которому я получаю через свойства, какой из этих форматов вы бы предпочли для свойства?

/// <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. Внутренняя подкладка может испортить вам день, когда вы меньше всего этого ожидаете.

Но к вопросу:В любом случае, на самом деле это не имеет большого значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top