我正在以下列方式实现字典以容纳整数“key”和Decimal / DateTime / String“value”:
Dictionary<int, object>
但是我认识到将“值”的类型设置为“对象”并不是最安全的方法。您对更好的实施有什么建议吗?
答案 0 :(得分:1)
我认为您的担忧可能处于错误的水平。如果您想将所有这些类型的数据存储在同一个集合中,object
可能是您的正确选择,但您有理由担心。
编写强类型代码有很多优点,因为许多检查将在编译时发生,而不是运行时。这意味着很多错误都很容易看到,而不是在测试期间出现(第一次可能会或可能不会真正捕获它们)。通过在同一个集合中存储三种非常不同的数据,您本身就会失去强类型的优势。这就是为什么你不想为此使用object
,根据定义,任何完成相同专长的替代解决方案都会带来同样的风险。
相反,我会说你有几个更合理的选择。
string
和int
,但它们通常以完全不同的方式使用。object
更好。T
。如你所说,将它存储为object
将会工作,但我会说你最好提出一个更好的选择。但是,很难真正告诉你该怎么做,因为我们对你正在做的具体事情了解不多。
答案 1 :(得分:1)
如果要在泛型集合中使用不同的类型,则泛型类型必须是对象。
现在,它可能表明您的架构存在更大问题。退一步考虑一下。也许最好有3个词典而不是一个(Dictionary<int,decimal>
,Dictionary<int,DateTime>
和Dictionary<int,string>
)。
或者也许您可以创建自己的类来封装您的值。
public class Wrapper
{
public Wrapper(decimal d)
{
//...
}
public Wrapper(DateTime date)
{
//...
}
public Wrapper(string s)
{
//...
}
}
然后使用Dictionary<int,Wrapper>
。真正的好方法是关于你想要实现的目标。将通用类型作为对象通常是某种程度上糟糕的架构决策的症状。
答案 2 :(得分:0)
变量应该一次性使用!因此:
var itemsObject = default(Dictionary<int, object>);
你应该
var itemsString = default(Dictionary<int, string>);
var itemsDecimal = default(Dictionary<int, Decimal>);
var itemsDateTime = default(Dictionary<int, DateTime>);
不是代码的重复。如果代码的类型不同,那么您只需使用itemsString
即可。