一维数组
//--------------------一维数组创建-------------------------------
int[] numbers = new int[5]; // 创建一个包含5个整数的数组,所有元素默认为0
string[] names = new string[] { "Alice", "Bob", "Charlie" }; // 创建并初始化一个字符串数组
二维数组
//--------------------二维数组创建-------------------------------
int[,] matrix = new int[3, 3]; // 创建一个3x3的二维整数数组
string[,,] threeDimensional = new string[4, 5, 6]; // 创建一个4x5x6的三维字符串数组
交错数组
//------------------------------交错数组-------------------------------------
// 声明并初始化一个交错数组
int[][] jaggedArray = new int[][]
{
new int[] { 1, 2, 3 },
new int[] { 4, 5 },
new int[] { 6, 7, 8, 9 },
new int[] { 10 }
};
ArrayList非泛型列表
ArrayList的特点
- 类型不安全:可以存储任何类型的元素。
- 装箱和拆箱:存储值类型时会发生装箱和拆箱操作。
- 动态大小:可以根据需要自动调整其大小。
-
ArrayList myList = new ArrayList(); // 添加不同类型的元素 myList.Add(42); // 添加整数(装箱) myList.Add("Hello"); // 添加字符串 myList.Add(true); // 添加布尔值 // 打印ArrayList中的全部数据 Console.WriteLine("ArrayList中的数据:"); foreach (object item in myList) { Console.WriteLine(item); } 在C#中,object类型是.NET类型系统中的顶级类型,所有其他类型都直接或间接继承自object。这意味着object类型的变量可以存储任何类型的值,但是当你这样做时,你需要进行类型转换(拆箱)才能将其还原为原始类型。 // 获取并拆箱整数 int myNumber = (int)myList[0]; Console.WriteLine("整数: " + myNumber); // 获取字符串,不需要拆箱,因为它是引用类型 string myString = (string)myList[1]; Console.WriteLine("字符串: " + myString); // 获取并拆箱布尔值 bool myBool = (bool)myList[2]; Console.WriteLine("布尔值: " + myBool); 请注意,字符串是引用类型,所以在添加到ArrayList时不会发生装箱,并且在获取时也不需要拆箱。只有值类型(如整数和布尔值)在添加到ArrayList时会发生装箱,并且在获取时需要拆箱。
什么是拆箱什么是装箱
-
装箱
- 装箱是将值类型转换为其对应的引用类型(通常是
object
类型)的过程。这通常发生在值类型变量被赋值给一个可以存储任何类型对象(如object
或dynamic
)的变量时。
int myInt = 42;
object myObject = myInt; // 装箱:将整数装箱为object
/*在上面的例子中,整数42被装箱为一个object类型的变量myObject。
装箱操作在堆上创建一个新的对象,并复制值类型的值到这个新对象中。
*/
在现代C#编程中,使用泛型集合(如List<T>
)可以避免装箱和拆箱,因为它们直接存储特定类型的元素,而不是将它们作为object
类型存储。
-
拆箱
- 拆箱是将引用类型转换回其原始的值类型(如果可能)的过程。这通常发生在从可以存储任何类型对象(如
object
或dynamic
)的变量中取出值类型时。 -
object myObject = 42; // 装箱:将整数装箱为object int myInt = (int)myObject; // 拆箱:将object拆箱为int /* 在上面的例子中,整数42被装箱为一个object类型的变量myObject。 然后,我们通过拆箱操作将myObject转换回int类型的变量myInt。 拆箱操作假设myObject包含一个可以转换回int的值,否则将抛出一个运行时异常。 */
注意事项
- 装箱和拆箱都会产生额外的开销,因为它们涉及在堆上创建新对象。
- 装箱通常发生在值类型被赋值给一个可以存储任何类型对象的变量时,而拆箱通常发生在从这样的变量中取出值类型时。
- 在C#中,
dynamic
类型也支持装箱和拆箱,但它们通常只在运行时进行类型检查。
List<T>
泛型列表
动态大小
List<T>
可以根据需要自动调整其大小。当添加新元素时,如果现有数组无法容纳新元素,它会自动创建一个新的更大的数组,并将现有元素复制到新数组中。
// 创建一个空列表
List<int> myList = new List<int>();
myLabel.Add(8);
/*
在这段代码中,我们首先创建了一个空的List<int>实例,
然后使用Add方法向列表中添加了一个整数8。这样,myList现在包含了一个元素,即8。
*/