你可以在 C# 编程语言中使用 object[] 数组把不同类型的元素保存在一维数组中。 C# 语言中的 object 类型和 object 对象提供了一种将许多对象类型实例结合在一个单一的引用中,这样代码简单并在运行时执行。下面我们看一个在 C# 语言中使用 object 数组,看下它们是如何存储各种类型的元素,以及在通过对象数组引用访问数组元素是如何保持数组元素的原始类型。
使用 object[] 数组
首先,我们看一个示例程序,使用 object[] 数组存储不同类型的数据元素。这不是一个完美的有意义的 C# 代码,但它的设计为了说明 object 数组如何存储所有类型的元素,即包含应用类型例如 string 和值类型例如 int 。这些类型信息仍然被保存,并且在后面可以使用它们。
~~~ 使用 object[] 数组 (C#) 程序 ~~~
using System;
using System.Text;
class Program{
static void Main(){
//
// 声明一个 object 数组
//
object[] array1 = new object[5];
//
// - 放一个空对象到 object 数组中。
// - 放各式各样的对象到数组中。
// - 放字符串常量到数组中。
// - 放整型常量到数组中。
// - 放 null 常量到数组中。
//
array1[0] = new object();
array1[1] = new StringBuilder("Initialized");
array1[2] = "String literal";
array1[3] = 3;
array1[4] = null;
//
// 使用 object 数组引用作为参数。
//
WriteArray(array1);
}
static void WriteArray(object[] array ){
//
// 循环变量数组中的对象。
//
foreach (object element in array){
if (element != null){ // 防止 NullReferenceException
Console.WriteLine(element.ToString());
Console.WriteLine(element.GetType());
Console.WriteLine("---");
}
}
}
}
~~~ 程序输出结果 ~~~
System.Object
System.Object
---
Initialized
System.Text.StringBuilder
---
String literal
System.String
---
3
System.Int32
---
为 object[] 数组创建一个表达式。这个程序的内容包括创建一个数组的表达式,并在托管堆中为 object 数组分配空间保存 5 个元素。由于 CLR 设计时为了防止为赋初始值,所以这些元素都已经赋了 null 值。
为对象数组中的元素分配在垂直连续的空间中。程序中下一部分是分配 5 个连续的空间存储数组中各式各样的对象或引用。“ new object() ”基本上是不可用的空对象。 StringBuilder 是一个快速链接字符串的对象。 string 常量实际上是存储在引号中的字符串文本的字符数据的引用。 integer 是值类型,当时经过装箱操作后,可以被当作一个逻辑上的对象。 null 常量是一个特殊的引用,它兼容所有引用类型。
数组中的装箱操作。由于关系执行效率,在 C# 语言中所有的数字例如“ int ”变量大多数情况下直接存储在栈中。这样可以提高执行效率,但是为了让值类型作为一个具有类型指针的对象, CLR 必须使用装箱来实现。在方法体中使用 integer 变量,它并不是类型指针。然而, integer 变量表示对象时就已经是一个类型指针。
循环遍历 object 数组。示例代码下面部分的 WriteArray 方法用 foreach 循环反复迭代 object[] 数组。用来测试每个元素是否为 null 来防止 NullReferenceException 。最后,打印出存储在数组中的对象的一些信息。你可以看到保存在数组中的元素的精确类型信息,而且还可以使用。
Object 数组的用法
在这里我们注意到可能在 C# 编程时会遇到的 object 数组的一些实际用法。在 .NET Framework 的 System.Data 命名空间中包含了一些使用 object 数组的类型,例如 DataRow 类型和 DataTable 类型。在数据库的数据表中使用 object 数组表示各种类型的数据元素是非常普通的用法。另外, Microsoft.Office.Interop.Excel 命名空间也能够使用 C# 代码操作 Microsoft Excel 并创建工作表,为了一些通用的目的经常要使用 object[] 数组。
结束语
我们在 C# 语言和 .NET Framework 中验证了 object 数组,并且看到了 object 数组如何用于将不同类型的对象存储在一起,而且每个对象仍可以保存原有的类型信息。 object 数组常用在方法中用来和其他的技术进行互操作,例如数据库或类似于 Excel 等程序。同时, object 数组也可以用在线程的方法中,本质上,这种方式是和操作系统中线程交换的能力。总的来说, object 类型是比较混乱的,使用起来效率不高,因为在方法中使用内部类型之前需要还原数据类型。由于这个原因,如果可以的话使用泛型类型和泛型列表是更可取的方式。