Я рассматриваю три подхода для возврата ссылок на внутренние экземпляры Dictionary (C#) в отношении безопасности кода и влияния на читаемость кода визуально для проекта, над которым я работаю.C#, возвращающий словарные ссылки безопасно
Я сузил его до следующих трех подходов, но открыт для лучших предложений. В настоящее время я предпочитаю # 3 как лучший баланс безопасности без дополнительной плиты котла.
1) Используйте второй ReadOnlyDictionary экземпляр, чтобы обернуть внутренний словарь, только когда-либо позволить ReadOnlyDictionary избежать класс:
2) Возвращение словаря экземпляра как IReadOnlyDictionary, но переделывая позволит ему быть изменен так не безопасен, как вариант №1 или №3.
3) Возвращение Dictionary.ToImmutableDictionary() как ImmutableDictionary, когда она сбегает вмещающий класс так, что возвращаемый объект является непреложным видом внутреннего словаря, хотя это будет сделать новую копию для каждого вызова подвергаясь выше стоимость, это должно быть хорошо с небольшими простыми словарями (которые мои).
private readonly Dictionary<string, string> innerDictionary = new Dictionary<string, string>();
// Only required for Example #1
private readonly IReadOnlyDictionary<string, string> readonlyInnerDictionary;
public ExampleClass() {
// Only required for Example #1
readonlyInnerDictionary = new ReadOnlyDictionary<string, string>(innerDictionary);
}
public IReadOnlyDictionary<string, string> GetExampleOne() {
// Requires a second dictionary which is more boiler plate but the object being returned is truly readonly
return readonlyInnerDictionary;
}
public IReadOnlyDictionary<string, string> GetExampleTwo() {
// Requires InnerDictionary be defined as Dictionary (Not IDictionary) but doesn't require the second dictionary be defined
// which is less boiler plate, but the object returned could be re-cast to it's mutable form meaning it's not truly mutation safe.
return innerDictionary;
}
public ImmutableDictionary<string, string> GetExampleThree() {
// Truly immutable object returned, but a new instance is built for every call; fortunately all of my dictionaries are small (containing at most 9 keys)
return innerDictionary.ToImmutableDictionary();
}
@Syntax Решили ли вы ваши сомнения? Я могу поделиться более подробной информацией, если вы хотите. –
Извините за задержку Артура, ваш отзыв был очень полезен для дальнейшего обсуждения, однако я нашел другое решение, которое я предпочел больше, обсудив это дальше с друзьями; для всех, кого это интересует, я представил его как ответ на мой собственный вопрос и отметил его как принятый. – Syntax
Нет проблем, но, хм, вы никогда не указывали, что вам нужна безопасность потоков, и даже тогда ReadOnlyDictionary является потокобезопасным, если вы никогда не раскрываете словарь, который вы обертываете. –