【问题标题】:Fixing CA1810: Initialize reference type static fields inline修复 CA1810:内联初始化引用类型静态字段
【发布时间】:2020-05-22 14:42:05
【问题描述】:

我有一个很小的静态类。我需要初始化这个锯齿状数组,稍后我将不得不做更多的事情。

namespace Kerumaton
{
  static internal class WorldGrid
  {
    static public int gridWidth;
    static public int gridHeight;
    static public int gridSizeX, gridSizeY;
    static public int[][] gridArray;

    static WorldGrid()
    {
        gridWidth = 10;
        gridHeight = 10;
        gridSizeX = World.imageWidth % gridWidth;
        gridSizeY = World.imageHeight % gridHeight;
        gridArray = new int[gridSizeX][];
        for (int i = 0; i < gridArray.Length; i++)
        {
            gridArray[i] = new int[gridSizeY];
        }
    }
  }
}

但我收到一条警告,告诉我最好删除静态构造函数并在声明它们的位置初始化变量。

当然,是的,我听说这会对性能产生重大影响。

但是怎么做呢?声明变量时有没有办法运行代码?我误解了什么吗?警告是虚惊一场吗?我确信答案是显而易见的,但我的 google-fu 只向我展示了非常简单的示例,例如字典内联初始化。

我正在使用 C# 8、Core 3.x、VS2019

【问题讨论】:

  • 为什么需要拆分字段声明及其分配?
  • 作为参考,您可以很容易地内联初始化它。它不是超级漂亮,但new int[5].Select(_ =&gt; new int[3]).ToArray() 有效。
  • @Pavel 不,我已经读过它,但并没有真正明白。 :(
  • 微软关于 CA1810 的文档说有正当的理由来禁止警告。当然,您应该尽可能遵守他们的建议。除此之外,如果您的目标是在变量被使用之前对其进行初始化,那么在声明时这样做会更安全且更易于阅读。

标签: c#


【解决方案1】:

事实证明,有一种简单的方法可以消除警告。我认为警告的存在仅仅是因为静态构造函数的存在,但事实并非如此。

虽然它没有严格回答我“如何在初始化时运行代码”的问题,但它修复了警告:

namespace Kerumaton
{
  static internal class WorldGrid
  {
    static public int gridWidth = 10;
    static public int gridHeight = 10;
    static public int gridSizeX = World.imageWidth % gridWidth;
    static public int gridSizeY = World.imageHeight % gridHeight;
    static public int[][] gridArray = new int[gridSizeX][];

    static WorldGrid()
    {
        for (int i = 0; i < gridArray.Length; i++)
        {
            gridArray[i] = new int[gridSizeY];
        }
    }
  }
}

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多