如何避免初始化已经初始化的变量?
How do I avoid initializing an already initialized variable?
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 };
}
}
}
出现与以下部分相关的错误:
int[][] M = { M_array_0, M_array_1 };
错误涉及上面的M_array_0和M_array_1。我不明白的是为什么我不能从上面创建一个多维数组。我应该使用那个代码?
我试过了:
string[][] M = { M_array_0, M_array_1 };
double[][] M = { M_array_0, M_array_1 };
错误显示:
A field initializer cannot reference the non-static field, method, or property 'txt_program.txt.M_array_0' text_test \psf\Home\Documents\Visual Studio 2015\Projects\text_test\text_test\text.cs 45 Active
提前谢谢。
A field initializer cannot reference the nonstatic field, method, or
property 'field' Instance fields cannot be used to initialize other
instance fields outside a method. If you are trying to initialize a
variable outside a method, consider performing the initialization
inside the class constructor
另请参阅 this 以获得描述性答案。
一种方法是编写一个静态方法returns你想要的数组,并用它来分配字段:
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
};
}
由于您将所有数组初始化为相同大小并包含零,因此您可以将其缩短为:
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 = ...
我建议您这样做,除非您需要在创建 class 实例后更改数组本身(而不是内容)。
我建议使用 Linq 以便 生成 数组
int[][] M = Enumerable.Range(0, 13) // 13 rows
.Select(x => new int[13]) // each line contains 13 items
.ToArray();
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 };
}
}
}
出现与以下部分相关的错误:
int[][] M = { M_array_0, M_array_1 };
错误涉及上面的M_array_0和M_array_1。我不明白的是为什么我不能从上面创建一个多维数组。我应该使用那个代码? 我试过了:
string[][] M = { M_array_0, M_array_1 };
double[][] M = { M_array_0, M_array_1 };
错误显示:
A field initializer cannot reference the non-static field, method, or property 'txt_program.txt.M_array_0' text_test \psf\Home\Documents\Visual Studio 2015\Projects\text_test\text_test\text.cs 45 Active
提前谢谢。
A field initializer cannot reference the nonstatic field, method, or property 'field' Instance fields cannot be used to initialize other instance fields outside a method. If you are trying to initialize a variable outside a method, consider performing the initialization inside the class constructor
另请参阅 this 以获得描述性答案。
一种方法是编写一个静态方法returns你想要的数组,并用它来分配字段:
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
};
}
由于您将所有数组初始化为相同大小并包含零,因此您可以将其缩短为:
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 = ...
我建议您这样做,除非您需要在创建 class 实例后更改数组本身(而不是内容)。
我建议使用 Linq 以便 生成 数组
int[][] M = Enumerable.Range(0, 13) // 13 rows
.Select(x => new int[13]) // each line contains 13 items
.ToArray();