如何避免初始化已初始化的变量

本文关键字:初始化 变量 何避免 | 更新日期: 2023-09-27 18:07:17

namespace text_test
{
public class txt_program

{
    public class txt
    {
        /* 0 */
        int[] M_array_0 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 1 */
        int[] M_array_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 2 */
        int[] M_array_2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 3 */
        int[] M_array_3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 4 */
        int[] M_array_4 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 5 */
        int[] M_array_5 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 6 */
        int[] M_array_6 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 7 */
        int[] M_array_7 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 8 */
        int[] M_array_8 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 9 */
        int[] M_array_9 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 10 */
        int[] M_array_10 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 11 */
        int[] M_array_11 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 12 */
        int[] M_array_12 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 13 */
        int[] M_array_13 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        int[][] M = { M_array_0, M_array_1 };
    }
}

}

出现与section相关的错误:

int[][] M = { M_array_0, M_array_1 };

错误涉及上面的M_array_0和M_array_1。我不明白的是为什么我不能从上面创建一个多维数组。我应该使用那个代码吗?I tried:

string[][] M = { M_array_0, M_array_1 };
double[][] M = { M_array_0, M_array_1 };

错误读取:

字段初始化器不能引用非静态字段、方法或属性'txt_program.txt '。M_array_0' text_test' psf'Home'Documents'Visual Studio 2015'Projects'text_test'text_test'text.cs 45 Active

谢谢。

如何避免初始化已初始化的变量

一种方法是编写一个静态方法,返回您想要的数组,并使用它来分配字段:

public class txt
{
    private int[][] M = createArray();
    private static int[][] createArray()
    {
        /* 0 */
        int[] M_array_0 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 1 */
        int[] M_array_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 2 */
        int[] M_array_2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 3 */
        // Etc
        return new [] { M_array_0, M_array_1, M_array_2 /* etc */ };
    }
}

或者你可以像这样内联地写(但这是不太灵活的):

public class txt
{
    private int[][] M = 
    {
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_0
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_1
        new[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // M_array_3
        // Etc
    };
}

由于您将所有数组初始化为相同的大小,并且包含0,因此您可以将其缩短为:

public class txt
{
    int[][] M = 
    {
        new int[14], // M_array_0
        new int[14], // M_array_1
        new int[14], // M_array_2
        // Etc
    };
}

然而,我怀疑这只是你给出的一个例子,在实际代码中你会使用非零值。

请注意,您可以将M声明为只读:

private readonly int[][] M = ...

我建议您这样做,除非您需要在创建类实例后更改数组本身(而不是内容)。

字段初始化项不能引用非静态字段、方法或属性'field'实例字段不能用于初始化其他方法外部的实例字段。如果您试图初始化变量,则考虑执行初始化在类构造函数

参考

我建议使用Linq生成数组

int[][] M = Enumerable.Range(0, 13) // 13 rows
  .Select(x => new int[13])         // each line contains 13 items
  .ToArray();