类型和变量,弄清楚了,对你的数据结构和算法很有帮助
作者:互联网
C# 中的类型有两种:值类型 (value type) 和引用类型 (reference type)。值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除 ref 和 out 参数变量外),因此对一个变量的操作不可能影响另一个变量。
C# 的值类型进一步划分为简单类型 (simple type)、枚举类型 (enum type)、结构类型 (struct type) 和可以为 null 的类型 (nullable type),C# 的引用类型进一步划分为类类型 (class type)、接口类型 (interface type)、数组类型 (array type) 和委托类型 (delegate type)。
下表为 C# 类型系统的概述。
类别 | 说明 | |
值类型 | 简单类型 | 有符号整型:sbyte、short、int 和 long |
无符号整型:byte、ushort、uint 和 ulong | ||
Unicode 字符型:char | ||
IEEE 浮点型:float 和 double | ||
高精度小数型:decimal | ||
布尔型:bool | ||
枚举类型 | enum E {...} 形式的用户定义的类型 | |
结构类型 | struct S {...} 形式的用户定义的类型 | |
可以为 null 的类型 | 其他所有具有 null 值的值类型的扩展 | |
引用类型 | 类类型 | 其他所有类型的最终基类:object |
Unicode 字符串型:string | ||
class C {...} 形式的用户定义的类型 | ||
接口类型 | interface I {...} 形式的用户定义的类型 | |
数组类型 | 一维和多维数组,例如 int[] 和 int[,] | |
委托类型 | 例如,delegate int D(...) 形式的用户定义的类型 |
八种整型类型分别支持 8 位、16 位、32 位和 64 位整数值的有符号和无符号的形式。
两种浮点类型:float 和 double,分别使用 32 位单精度和 64 位双精度的 IEEE 754 格式表示。
decimal 类型是 128 位的数据类型,适合用于财务计算和货币计算。
C# 的 bool 类型用于表示布尔值 — 为 true 或者 false 的值。
在 C# 中,字符和字符串处理使用 Unicode 编码。char 类型表示一个 UTF-16 编码单元,string 类型表示 UTF-16 编码单元的序列。
下表总结了 C# 的数值类型。
类别 | 位数 | 类型 | 范围/精度 |
有符号整型 | 8 | sbyte | –128...127 |
16 | short | –32,768...32,767 | |
32 | int | –2,147,483,648...2,147,483,647 | |
64 | long | –9,223,372,036,854,775,808...9,223,372,036,854,775,807 | |
无符号整型 | 8 | byte | 0...255 |
16 | ushort | 0...65,535 | |
32 | uint | 0...4,294,967,295 | |
64 | ulong | 0...18,446,744,073,709,551,615 | |
浮点型 | 32 | float | 1.5 × 10−45至3.4 × 1038,7位精度 |
64 | double | 5.0 × 10−324 至 1.7 × 10308,15 位精度 | |
小数 | 128 | decimal | 1.0 × 10−28 至 7.9 × 1028,28 位精度 |
C# 程序使用类型声明 (type declaration) 创建新类型。类型声明指定新类型的名称和成员。在 C# 类型分类中,有五类是用户可定义的:类类型 (class type)、结构类型 (struct type)、接口类型 (interface type)、枚举类型 (enum type) 和委托类型 (delegate type)。
类类型定义了一个包含数据成员(字段)和函数成员(方法、属性等)的数据结构。类类型支持单一继承和多态,这些是派生类可用来扩展和专用化基类的机制。
结构类型与类类型相似,表示一个带有数据成员和函数成员的结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型不支持用户指定的继承,并且所有结构类型都隐式地从类型 object 继承。
接口类型定义了一个协定,作为一个公共函数成员的命名集。实现某个接口的类或结构必须提供该接口的函数成员的实现。一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
委托类型表示对具有特定参数列表和返回类型的方法的引用。通过委托,我们能够将方法作为实体赋值给变量和作为参数传递。委托类似于在其他某些语言中的函数指针的概念,但是与函数指针不同,委托是面向对象的,并且是类型安全的。
类类型、结构类型、接口类型和委托类型都支持泛型,因此可以通过其他类型将其参数化。
枚举类型是具有命名常量的独特的类型。每种枚举类型都具有一个基础类型,该基础类型必须是八种整型之一。枚举类型的值集和它的基础类型的值集相同。
C# 支持由任何类型组成的一维和多维数组。与以上列出的类型不同,数组类型不必声明就可以使用。实际上,数组类型是通过在某个类型名后加一对方括号来构造的。例如,int[] 是一维 int 数组,int[,] 是二维 int 数组,int[][] 是一维 int 数组的一维数组。
可以为 null 的类型也不必声明就可以使用。对于每个不可以为 null 的值类型 T,都有一个相应的可以为 null 的类型 T?,该类型可以容纳附加值 null。例如,int? 类型可以容纳任何 32 位整数或 null 值。
C# 的类型系统是统一的,因此任何类型的值都可以按对象处理。C# 中的每个类型直接或间接地从 object 类类型派生,而 object 是所有类型的最终基类。引用类型的值都被视为 object 类型,被简单地当作对象来处理。值类型的值则是在对其执行装箱 (boxing) 和拆箱 (unboxing) 操作后按对象处理。下面的示例将 int 值转换为 object,然后又转换回 int。
using System;
class Test
{
static void Main() {
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
}
}
当将值类型的值转换为类型 object 时,将分配一个对象实例(也称为“箱子”)以包含该值,并将值复制到该箱子中。反过来,当将一个 object 引用强制转换为值类型时,将检查所引用的对象是否含有正确的值类型,如果有,则将箱子中的值复制出来。
C# 的统一类型系统实际上意味着值类型可以“按需”转换为对象。因为统一,所以使用类型 object 的通用库可以与引用类型和值类型一同使用。
C# 中存在几种变量 (variable),包括字段、数组元素、局部变量和参数。变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量,如下表所示。
变量类型 | 可能的内容 |
不可以为 null 的值类型 | 类型完全相同的值 |
可以为 null 的值类型 | null 值或类型完全相同的值 |
object | null 引用、对任何引用类型的对象的引用,或者对任何值类型的装箱值的引用 |
类类型 | null 引用、对该类类型的实例的引用,或者对从该类类型派生的类的实例的引用 |
接口类型 | null 引用、对实现该接口类型的类类型的实例的引用,或者对实现该接口类型的值类型的装箱值的引用 |
数组类型 | null 引用、对该数组类型的实例的引用,或者对兼容数组类型的实例的引用 |
委托类型 | null 引用或对该委托类型的实例的引用 |
转载于:https://www.cnblogs.com/Leeyong/archive/2010/06/26/1765733.html
标签:弄清楚,null,int,C#,算法,引用,类型,数据结构,type 来源: https://blog.csdn.net/weixin_30633405/article/details/97805497