如何避免使用"对象"作为变量类型

时间:2014-08-14 08:22:38

标签: c# object dictionary

我正在以下列方式实现字典以容纳整数“key”和Decimal / DateTime / String“value”:

Dictionary<int, object>

但是我认识到将“值”的类型设置为“对象”并不是最安全的方法。您对更好的实施有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我认为您的担忧可能处于错误的水平。如果您想将所有这些类型的数据存储在同一个集合中,object可能是您的正确选择,但您有理由担心。

编写强类型代码有很多优点,因为许多检查将在编译时发生,而不是运行时。这意味着很多错误都很容易看到,而不是在测试期间出现(第一次可能会或可能不会真正捕获它们)。通过在同一个集合中存储三种非常不同的数据,您本身就会失去强类型的优势。这就是为什么你不想为此使用object,根据定义,任何完成相同专长的替代解决方案都会带来同样的风险。

相反,我会说你有几个更合理的选择。

  • 您可以重新考虑您要存储的内容。您确定在同一个地方需要这三种类型的数据吗?也许你最好使用三个单独的词典,每个词典都有正确的类型信息。我们通常不想比较 stringint,但它们通常以完全不同的方式使用。
  • 您可以编写一个包装类型的类。有三个属性,每种类型一个属性,然后在空的属性中存储某种空指示符。这仍然不是一个很好的解决方案,但它比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即可。