使用具有单个元素的数组而不仅仅是变量是一个坏主意吗?

时间:2011-05-02 08:13:23

标签: c# arrays performance

当我在单个元素数组上使用单个元素数组时,是否存在性能劣势?

我有一个基类,从中可以派生出许多其他类。此基类提供object类型的Value属性。

现在我还必须支持大多数类的多值版本。因此,即使只需要一个值,我也在考虑将protected object value更改为protected object[] value并使用数组。

我知道构造函数中数组的长度,因此在单值实例的情况下,数组的长度为1.

由于在运行时通常存在大量实例(最多数千个,具体取决于用户数),我非常关注性能。

所以我的问题是:这种从简单变量到数组的变化是否会导致性能发生明显变化,还是通常设计不好?

我考虑创建一个启用多个值的包装类,但这些类通过引用和事件进行了大量连接,因此使用和维护时会很笨拙。

修改澄清:

基类的目的主要是提供一个接口。其他类使用Value属性,这就是它在基类中定义的原因。变量本身只在基类中定义,所以我不必在每个派生类中定义它(类型总是对象)。

不需要多值扩展,因为派生类需要多个值,但是因为会有一个上下文敏感的环境(不知道如何更好地表达它),并且类需要记住每个背景的价值。

例如,将其视为一种移民技术(不是在我的情况下,仅作为示例)。

一个类代表一个单词,根据语言,Value是相应语言中的单词。

通过将所有多值逻辑放在基类中,派生类可以像往常一样继续工作(使用Value属性),基类可以确定要使用的值。

希望这会让事情变得更加清晰。

6 个答案:

答案 0 :(得分:3)

否:开销量肯定不会引人注意。如果它降低了代码的复杂性,那么这是一个好主意。

答案 1 :(得分:1)

我想将数组更改为单个变量会更加困难,反之亦然。我不介意有一个数组可以扩展一个值!

答案 2 :(得分:1)

这增加了开销,但我怀疑它会在“正常”情况下显而易见(例如,不是紧张的循环)。

答案 3 :(得分:1)

如果没有看到您的代码,我会感觉有人会质疑设计。你有一个基类可以保存一个或多个任意类型的“值”?通常,我会使用基类来包含派生类型共有的属性和/或功能,但如果我注意到基类试图“满足派生类的所有可能需求”,那么可能是重构的时候了。在这种情况下,你的基类似乎有点过于笼统。

话虽如此,您的具体情况可能证明了设计的合理性。 (我认为你不会注意到任何性能下降。)

答案 4 :(得分:1)

为什么需要(a)全局基类(b)还提供变量存储?

这似乎......不必要的反应(或者......如果你愿意的话......糟糕的设计)。当然,我不知道任何背景,但我建议更多这些方面:

public interface IValueProvider<out T> /* : IComparable<T>, IEquatable... etc */
{
    T Value { get; /*protected?*/ set; }
}

如果你坚持,你可以有实施助手,如下:

public class ValueProviderClass<T> : IValueProvider<T> 
     where T : class, new()
{
     ValueProviderClass() { Value = new T(); }
}

当然,结构也可以实现接口,如果将来需要,可以为性能优化提供更多空间(但是,值类型将无法透明地从'base'值类型派生,因为CLR不会允许那个)

请注意使用协方差来获得与IValueProvider的兼容性,例如

希望这个想法可以帮助你激发一些更精益求精的思维

答案 5 :(得分:0)

为什么不使类通用并在实例化类时指定Value的类型?