键入字典键的安全性?

时间:2011-01-07 13:56:27

标签: c# generics dictionary

我计划在项目中使用多个名称索引字典。我的第一选择是使用string键,它只是我的Value元素的Name属性。

然而,这使得字典键完全相同,即使它们访问不同的类型:

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 个答案:

答案 0 :(得分:5)

除非您需要覆盖EqualsGetHashCode以使名称按值进行比较,否则这将有效。

答案 1 :(得分:4)

第一个问题是:

  

我希望这些密钥彼此不兼容,使它们无法相互混淆:

为什么?实际上是否存在混淆的可能性?这并不明显。请注意,我不是说你的方法很糟糕;事实上,事实上,这可能是真正的好处。但考虑数组索引器:

int a[];
float b[];

数组的类型不兼容,但都使用整数索引。并且,当索引混淆时,这实际上可能导致问题 - 可能与您使用密钥时遇到的相同类型的问题。

所以这个案子与你的情况完全相同。也许对不同的容器使用相同的密钥类型并不是那么糟糕(尽管理论上你是对的并且存在混淆的风险)。