我计划在项目中使用多个名称索引字典。我的第一选择是使用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>
个实例而不是字符串。
这看起来有点笨拙,但这是我迄今为止提出的最好的 - 有关如何做得更好的任何建议吗?
这是误导,还是很棒?
答案 0 :(得分:5)
除非您需要覆盖Equals
和GetHashCode
以使名称按值进行比较,否则这将有效。
答案 1 :(得分:4)
第一个问题是:
我希望这些密钥彼此不兼容,使它们无法相互混淆:
为什么?实际上是否存在混淆的可能性?这并不明显。请注意,我不是说你的方法很糟糕;事实上,事实上,这可能是真正的好处。但考虑数组索引器:
int a[];
float b[];
数组的类型不兼容,但都使用整数索引。并且是,当索引混淆时,这实际上可能导致问题 - 可能与您使用密钥时遇到的相同类型的问题。
所以这个案子与你的情况完全相同。也许对不同的容器使用相同的密钥类型并不是那么糟糕(尽管理论上你是对的并且存在混淆的风险)。