Тип безопасности для словарных ключей? - PullRequest
1 голос
/ 07 января 2011

Я планирую использовать несколько именованных словарей в проекте. Моим первым выбором было использование ключа string, который является просто свойством Name моих Value элементов.

Однако это делает ключи словаря идентичными, даже если они обращаются к разным типам:

private Dictionary<string, Foo> myFoos;
private Dictionary<string, Bar> myBars;

myFoos[bar.Name];  // shouldn't be able to do this!

Я бы хотел, чтобы ключи были несовместимы по типу, чтобы их нельзя было спутать друг с другом:

private Dictionary<FooName, Foo> myFoos;
private Dictionary<BarName, Bar> myBars;

Поскольку создание класса *Name для каждого типа Value является излишним, я создал класс Name<T>:

public struct Name<T>
{
    public string Name;

    // for convenience, could be explicit instead
    static implicit operator string(Name<T> name)
    {
        return name.Name;
    }
}

что дало бы мне

private Dictionary<Name<Foo>, Foo> myFoos;
private Dictionary<Name<Bar>, Bar> myBars;

и тогда я мог бы хранить Name<Foo> экземпляров вместо строк.

Это кажется немного громоздким, но это лучшее, что я придумал до сих пор - какие-нибудь предложения о том, как сделать это лучше? Это заблуждение или круто?

Ответы [ 2 ]

5 голосов
/ 07 января 2011

Это будет работать, за исключением того, что вам нужно переопределить Equals и GetHashCode, чтобы имена сравнивались по значению.

4 голосов
/ 07 января 2011

Первый вопрос:

Я бы хотел, чтобы ключи были несовместимы по типу, чтобы их нельзя было спутать друг с другом:

Почему? Есть ли вероятность путаницы? Это не очевидно. Имейте в виду, я не говорю, что ваш метод плох; на самом деле, на самом деле, есть, вероятно, реальные выгоды от этого. Но рассмотрим индексаторы массивов:

int a[];
float b[];

Типы массивов несовместимы, но оба используют целочисленные индексы. И да , это может привести к проблемам, когда индексы перепутаны - возможно, те же проблемы, с которыми вы сталкиваетесь при использовании ваших ключей.

Так что этот случай в точности аналогичен вашему. Возможно, использование одних и тех же типов ключей для разных контейнеров не так уж и плохо (хотя в теории вы правы и существует риск путаницы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...