2016-09-16 197 views
1
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 }; 

錯誤讀取:

甲字段初始不能引用非靜態字段,方法或屬性 'txt_program.txt.M_array_0' text_test \ PSF \首頁\文件\ Visual Studio 2015 \ Projects \ text_test \ text_test \ text.cs 45活動

提前謝謝。

+1

你應該在[構造]設置這些變量(https://msdn.microsoft.com/en-us/library /k6sa6h87.aspx)。 – x13

+0

如果你使數組靜態,這將工作。 – juharr

+0

我已經重新提出了這個問題,因爲它看起來更像鋸齒陣列創建而不是關於錯誤發生。 –

回答

1

一種方式是寫一個返回所需的陣列靜態方法,並用它來分配領域:

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 = ... 

,我建議您這樣做,除非你需要創建類的實例後更改陣列本身(而不是內容)。

0

甲字段初始不能引用非靜態字段,方法或 屬性「字段」的實例字段不能被用於初始化的方法以外的其他 實例字段。如果你想初始化的方法外 變量,考慮執行類的構造函數

Reference

內初始化 也看到this一個描述性的答案。

0

我建議爲了使用的LINQ產生陣列

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