是否由编译器优化的类上的硬编码数组?

时间:2017-11-03 22:07:08

标签: c# .net inheritance optimization

我在默认配置中使用最新版本的Visual Studio Community 2017以及所有最新更新。

我正在编写一个处理具有不同属性的项目的系统。它们可以包含任何属性组合,每个属性都需要一个或多个数据成员以及处理它们的独特功能。为了让我(或任何开发人员)能够快速实现新功能并减少我必须编写的代码量,我使用了继承。

问题是提供数据和函数的每个子类都需要某些基本上是静态的数据,但是c#不允许覆盖静态成员。我的解决方案是覆盖基类成员,只需在其getter方法中对数据进行硬编码,如下所示:

public class BaseClass
{
    public abstract string name { get; }
    public abstract Color color { get; }
    public abstract string[] info { get; }
    public abstract OtherClass[] otherClasses { get; }
}

public class SubClass : BaseClass
{
    public override string name { get { return "flip flops"; } }
    public override Color color { get { return Color.FromArgb(255, 0, 255, 255); } }
    public override string[] info { get { return new string[] { "a", "b", "c" }; } }
    public override OtherClass[] otherClasses {
        get {
            return new otherClass[] {
                new OtherClass("hard"),
                new OtherClass("coded"),
                new OtherClass("data") }
        }
    };
}

正如您所看到的,一些成员是值类型,一些是类,一些是类的数组。我担心的是,如果我有1000个SubClass实例,运行时环境将为每个类创建每个成员的唯一实例。这完全没必要,因为每个数据都是相同的。颜色是结构,因此是值类型,因此我不确定它是否会有任何不同的反应。

我试图(并且确实)已经使用另一个类来解决问题。 SubClassData存储成员,每个SubClass引用通过类构造函数分配的SubClassData。 SubClassData类存储在一个大型静态数组中。首先,使用它可以在构造时将错误的SubClassData分配给SubClass。更重要的是,这种模式将数据与感觉完全不自然的功能分开。我认为这些基本上是同一个问题。

目前,我正在使用第一种方法来实现该功能。我不确定这是微观优化,c#是否负责这一点,或者是否有更好的设计模式来实现这一点,但所有反馈都表示赞赏:)

1 个答案:

答案 0 :(得分:2)

您只需从静态和私下定义的公共getter中返回数据:

public class SubClass : BaseClass
{
    private const string _name = "flip flops";
    private static readonly Color _color = Color.FromArgb(255, 0, 255, 255);
    private static readonly string[] _info = new string[] { "a", "b", "c" };
    private static readonly OtherClass[] _otherClasses = new otherClass[] {
        new OtherClass("hard"),
        new OtherClass("coded"),
        new OtherClass("data") 
    };

    public override string name { get { return _name; } }
    public override Color color { get { return _color; } }
    public override string[] info { get { return _info; } }
    public override OtherClass[] otherClasses { get { return _otherClasses; } }
}
相关问题