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

问题描述:

我在默认配置中使用最新版本的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分配给子类。更重要的是,这种模式将数据从感觉完全不自然的功能中分离出来。我认为这些问题根本上是同样的问题。

目前我正在使用显示的第一种方法来实现该功能。我不确定这是否是微型优化,无论c#是否处理此问题,或者是否有更好的设计模式来实现此目的,但所有反馈都将得到赞赏:)

+0

你的实例属性获取器可以返回私有静态成员。值类型将被复制,但这是价值类型的要点。 – Blorgbeard

+0

访问每个成员时将创建唯一值。运行时绝对不会优化数组的创建,因为它不能证明有人不会修改其中一个数组(在这种情况下,成员将不再返回预期的元素)。这是避免返回可变集合的一个原因。 –

您可以简单地返回公共数据你已经定义了静态和私人的获取者:

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; } } 
} 
+0

我曾试过这个,但因为某些数据传递给OtherClass引用SubClass的成员,所以它不适合我。解决的办法是在SubClass中的一个单独的私有数组中定义SubClass的静态成员(如你所做的那样),并在适当的地方使用它们来设置每个子类中的OtherClass。我应该已经意识到这一点,但感谢您的正确解决方案:) – MushyShaman