C# 配列の初期化の簡単な分析

高洛峰
高洛峰オリジナル
2016-12-16 14:42:421555ブラウズ

いつも様々な驚きと衝撃があります! C# 配列もその 1 つで、これが私のブログデビューと考えています。
C# 配列は他の C シリーズ言語とは大きく異なります。以前に使用したときの理解には大きな違いがありました。特に多次元配列の理解。多次元配列は、C 言語と比較すると新しい概念です。最初、私はそれをギザギザ配列の特殊なタイプだと考えていました。

まず、2 次元配列と単純なインターリーブ配列の初期化とアクセスに焦点を当てます

int[,] nums={ 
{1,2,3}, 
{1,2,0} 
}; 
for (int i = nums.GetLowerBound(0); i <= nums.GetUpperBound(0); i++) 
{ 
for (int j = nums.GetLowerBound(1); j <= nums.GetUpperBound(1); j++) 
{ 
Console.WriteLine(nums[i,j]); 
Console.WriteLine(nums.GetValue(i,j)); 
} 
} 
foreach (var num in nums) 
{ 
Console.WriteLine(num); 
} 
//对任意维度的数组,都可以这样快速访问,只是foreach不能修改变量。

そして、インターリーブ配列でも同様の内容を実現できます

int[][] nums2 ={ 
new int[]{1,2,3}, 
new int[]{1,2,0} 
}; 
for (int i = nums2.GetLowerBound(0); i <= nums2.GetUpperBound(0); i++) 
{ 
for (int j = nums2[i].GetLowerBound(0); j <= nums2[i].GetUpperBound(0); j++) 
{ 
Console.WriteLine(nums2[i][j]); 
} 
} 
foreach (var ia in nums2) 
{ 
foreach (var i in ia) 
{ 
Console.WriteLine(i); 
} 
}

多次元配列に格納されているデータは、インターリーブ配列で置き換えることができます。ギザギザ配列は、高次元の特殊な配列です。そして、ギザギザ配列は配列の配列です。そして、配列には非常に重要なプロパティがあります。

配列に格納される項目は同じ型である必要があります。これは、さまざまな複雑な配列を理解するために重要です。
複雑なギザギザ配列

bool[][][] cells31 = new bool[2][][] 
{ 
new bool[2][] 
{ 
new bool[] {false}, 
new bool[] {true} 
}, 
new bool[3][] 
{ 
new bool[] {false}, 
new bool[] {true}, 
new bool[] {true} 
} 
};

このように初期化する必要があります。ギザギザ配列は配列の配列であるため、以前は常にネストしていました。ただし、多数の配列型が必要であり、無数の配列型を作成できます。

Console.WriteLine("交错数组类型"); 
Console.WriteLine(cells31[0].GetType()); 
Console.WriteLine(cells31[0][0].GetType()); 
Console.WriteLine(cells31[0][0][0].GetType()); 
//交错数组类型 
//System.Boolean[][] 
//System.Boolean[] 
//System.Boolean 
//这是交错数组里面的类型。 
// bool[2][] 与boo[3][] 是相同的类型,所以我们创建存储结构不一致的数组

次は最も複雑なタイプです。ギザギザ配列と多次元配列を混在させます。以下の配列を初期化できれば、より深く理解できるはずです。

bool [][,,][][,,][]Foo;
例として単純なポイントを選択しました bool [][,][]Foo;

bool[][,][] Foo = new bool[1][,][] 
{ 
new bool[2,2][] 
{ 
{ 
new bool[2] {false, true}, 
new bool[2] {false, true} 
}, 
{ 
new bool[2] {false, true}, 
new bool[2] {false, true} 
} 
} 
}; 
Console.WriteLine("混合数组类型"); 
Console.WriteLine(Foo.GetType()); 
Console.WriteLine(Foo[0].GetType()); 
Console.WriteLine(Foo[0][0,0].GetType()); 
Console.WriteLine(Foo[0][0, 0][0].GetType()); 
//结果 混合数组类型 
//system.boolean[][,][] 
//system.boolean[][,] 
//system.boolean[] 
//system.boolean
//定义交错数组:一维数组存放(二维int数组存放(一维int数组存放(四维int数组))) 
//标准的C#定义描述 array of( multi-array of( array of (nulti-array))) 
int[][,][][, , ,] arr = new int[10][,][][,,,]; 
//初始化 二维int数组存放(一维int数组存放(四维int数组)) 
arr[4] = new int[1, 2][][,,,]; 
//初始化 一维int数组存放(四维int数组) 
arr[4][0, 1] = new int[3][, , ,]; 
//初始化 四维int数组 
arr[4][0, 1][2] = new int[1, 2, 3, 4]; 
Console.WriteLine(arr.GetType()); 
Console.WriteLine(arr[4].GetType()); 
Console.WriteLine(arr[4][0, 1].GetType()); 
Console.WriteLine(arr[4][0, 1][2].GetType()); 
//System.Int32[,,,][][,][] 
//System.Int32[,,,][][,] 
//System.Int32[,,,][] 
//System.Int32[,,,] 
//C#编译器生成的名字与我们声明的是倒着的。理解起来应该也没差异吧

これでより明確になるはずです。すべてのプログラマーがこれを理解しているかどうかはわかりませんが、私はそれを理解するのに多くの時間がかかりました。

最後に、配列メソッドへの影響を考慮します。特に Clear();

Console.WriteLine(Foo[0][0,0][0]); 
//输出为Flase 
Array.Clear(Foo,0,1); 
Console.WriteLine(Foo[0][0, 0][0]); 
//这里会引发空引用异常。因为 bool[][,]的类型的值已经变为null。


C# 配列の初期化の簡単な分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。