类型和变量Types and variables

    C# 值类型又细分为简单类型枚举类型结构类型可以为 null 的值类型C# 引用类型又细分为类类型接口类型数组类型委托类型

    下面概述了 C# 的类型系统。

      • 简单类型
        • 有符号的整型:sbyteshortintlong
        • 无符号的整型:byteushortuintulong
        • Unicode 字符:char
        • IEEE 二进制浮点:floatdouble
        • 高精度十进制浮点数:decimal
        • 布尔:bool
        • 格式为 enum E {…} 的用户定义类型
      • 结构类型
        • 值为 null 的其他所有值类型的扩展
    • 引用类型
        • 其他所有类型的最终基类:object
        • Unicode 字符串:string
        • 格式为 class C {…} 的用户定义类型
      • 接口类型
        • 格式为 interface I {…} 的用户定义类型
        • 一维和多维,例如 int[]int[,]
      • 委托类型

    C# 的 类型用于表示布尔值(truefalse)。

    C# 使用 Unicode 编码处理字符和字符串。char 类型表示 UTF-16 代码单元,string 类型表示一系列 UTF-16 代码单元。

    C# 程序使用类型声明创建新类型。类型声明指定新类型的名称和成员。用户可定义以下五种 C# 类型:类类型、结构类型、接口类型、枚举类型和委托类型。

    struct 类型定义包含数据成员和函数成员的结构,这一点与类类型相似。不过,与类不同的是,结构是值类型,通常不需要进行堆分配。结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object

    interface 类型将协定定义为一组已命名的公共函数成员。实现 interfaceclassstruct 必须提供接口函数成员的实现代码。interface 可以继承自多个基接口,classstruct 可以实现多个接口。

    delegate 类型表示引用包含特定参数列表和返回类型的方法。通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。委托类同于函数式语言提供的函数类型。委托也类似于其他一些语言中的函数指针概念,但与函数指针不同的是,委托不仅面向对象,还类型安全。

    classstructinterfacedelegate 类型全部都支持泛型,因此可以使用其他类型对它们进行参数化。

    enum 类型是一种包含已命名常量的独特类型。每个 enum 类型都有一个基础类型(必须是八种整型类型之一)。enum 类型的值集与基础类型的值集相同。

    可以为 null 的值类型也无需先声明即可使用。对于所有不可以为 null 的值类型 T,都有对应的可以为 null 的值类型 T?,后者可以包含附加值 null例如,int? 是可以包含任何 32 位整数或值 null 的类型。

    C# 采用统一的类型系统,因此任意类型的值都可视为 object每种 C# 类型都直接或间接地派生自 object 类类型,而 object 是所有类型的最终基类。只需将值视为类型 object,即可将引用类型的值视为对象。通过执行装箱取消装箱操作,可以将值类型的值视为对象。在以下示例中,int 值被转换成 object,然后又恢复成 int

    当值类型的值转换成 object 类型时,将分配 object 实例(亦称为“箱”)来包含值,然后该值会复制到相应的箱中。相反,当 object 引用被显式转换成值类型时,将检查引用的 object 是否是具有正确值类型的箱;如果检查成功,则会将箱中的值复制出来。

    C# 的统一类型系统实际上意味着可以“按需”将值类型转换成对象。鉴于这种统一性,使用类型 object 的常规用途库可以与引用类型和值类型结合使用。

    C# 有多种变量,其中包括字段、数组元素、局部变量和参数。变量表示存储位置,每个变量都具有一种类型,用于确定可以在变量中存储哪些值,如下文所述。

    • 不可以为 null 的值类型
      • 具有精确类型的值
    • 可以为 null 的值类型
      • null 值或具有精确类型的值
    • object
      • null 引用、对任意引用类型的对象的引用,或对任意值类型的装箱值的引用
    • 类类型
      • null 引用、对类类型实例的引用,或对派生自类类型的类实例的引用
    • 接口类型
      • null 引用、对实现接口类型的类类型实例的引用,或对实现接口类型的值类型的装箱值的引用
    • 数组类型
      • 引用、对数组类型实例的引用,或对兼容的数组类型实例的引用