【问题标题】:Are hard coded arrays on classes optimized by the compiler(s)?类上的硬编码数组是否由编译器优化?
【发布时间】:2023-03-05 14:37:02
【问题描述】:

我在默认配置中使用最新版本的 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 个子类实例,运行时环境将为每个类创建每个成员的唯一实例。这是完全没有必要的,因为每个数据都是相同的。颜色是一个结构体,因此是一个值类型,所以我不确定它是否会有不同的反应。

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

目前我正在使用所示的第一种方法来实现该功能。我不确定这是否是微优化,c# 是否会处理这个问题,或者是否有更好的设计模式可以用来实现这一点,但感谢所有反馈:)

【问题讨论】:

  • 您的实例属性获取器可以返回私有静态成员。值类型将被复制,但这是值类型的重点。
  • 访问每个成员时将创建唯一值。运行时肯定不会优化数组创建,因为它不能证明有人不会修改这些数组之一(在这种情况下,成员将不再返回预期的元素)。这是避免返回可变集合的原因之一。

标签: c# .net inheritance optimization


【解决方案1】:

您可以简单地从您静态和私有定义的公共 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; } }
}

【讨论】:

  • 我试过这个,但是因为传递给 OtherClass 的某些数据引用了 SubClass I 的成员,它对我不起作用。解决方案是在子类内部的一个单独的私有数组中定义子类的静态成员(正如您所做的那样),并在适当的地方使用它们来设置每个子类中的其他类。我真的应该意识到这一点,但感谢您提供正确的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多