开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
什么是类型?
类型是一种模板,表示一类数据。 依照这种模板、符合同一类特征的数据,就是同种类型的数据。
比如 int 类型表示整数、unit 类型表示无符号整数、string 表示字符串文本内容等
以及,对于Class类、struct结构等也是一样,只不过这些是复杂类型。
值类型和引用类型
C#中的类型分为值类型(Value types)和引用类型(Reference types)两个主要的分类。
值类型的变量包含类型的实例,这与引用类型的变量不同,引用类型的变量包含类型的实例的引用(包含的是实际数据的内存地址,通过地址引用到真正的实例)。
默认地,在赋值、传递参数给方法、方法返回结果,值类型的变量会复制一份数据,即复制类型的实例;引用类型的变量会复制一份引用,而不是复制实际的实例数据。
值类型
值类型的分类
值类型的种类是以下其中之一:
- 结构类型(
structure type),可以封装数据和相关的功能。 - 枚举类型(
enumeration type),由一组命名常数定义,表示一个选择或选择组合。
可为空的值类型T?表示基础值类型T的所有值及额外的null值。不能将 null 分配给值类型的变量,除非是可为 null 的值类型。
内置值类型 Built-in value type
C#提供的内置值类型也被称为“简单类型”:
- 整型数值类型(
Integral numeric types) - 浮点型数值类型(
Floating-point numeric types) bool类型表示布尔值true或falsechar类型 表示 Unicode UTF-16 字符
所有的简单类型都是结构structure类型,与其他结构类型不同的地方在于,简单类型允许额外操作:
-
简单类型可以使用字面量(
literal)提供值。例如,a是类型char的字面量,2000是类型int或uint等数值类型的字面量,false或true是布尔类型的字面量。 -
可以使用
const关键字声明简单类型的常数或常量。其他结构类型不能为常量。 -
常量表达式的操作数都是简单类型常量,会在编译时进行评估。
可以在 visual studio 中,通过按ctrl,鼠标变为小手后,点击查看 int 类型的源码,如下为 int/Int32 对应的struct类型源码:
值元组是值类型,但不属于简单类型。
value tuple is a value type, but not a simple type.
整型
介绍
整型数值类型Integral numeric types表示整数,是值类型。
所有的整型数值类型都支持算术arithmetic、位运算bitwise、逻辑logical、比较comparison和相等equality操作符。
整型的类型
C# 提供的预定义整型类型(predefined integral type)有如下几种:
| C# 类型/关键字 | 范围 | 大小 | .NET 类型 |
|---|---|---|---|
sbyte | -128 到 127 | 8 位带符号整数 | System.SByte |
byte | 0 到 255 | 无符号的 8 位整数 | System.Byte |
short | -32,768 到 32,767 | 有符号 16 位整数 | System.Int16 |
ushort | 0 到 65,535 | 无符号 16 位整数 | System.UInt16 |
int | -2,147,483,648 到 2,147,483,647 | 带符号的 32 位整数 | System.Int32 |
uint | 0 到 4,294,967,295 | 无符号的 32 位整数 | System.UInt32 |
long | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 64 位带符号整数 | System.Int64 |
ulong | 0 到 18,446,744,073,709,551,615 | 无符号 64 位整数 | System.UInt64 |
nint | 取决于(在运行时计算的)平台 | 带符号的 32 位或 64 位整数 | System.IntPtr |
nuint | 取决于(在运行时计算的)平台 | 无符号的 32 位或 64 位整数 | System.UIntPtr |
除了nint和nuint,表中其他每个 C# 类型关键字 都是对应的 .NET 类型的别名,C#类型关键字 和 .NET类型名称 是可以互换的。
int a = 123;
System.Int32 b = 123;
a、b 两个变量类型相同。
即,int是System.Int32的别名,两者含义和用法一模一样,只是在C#中更习惯使用int。
nint 和 nuint 是 C# 9.0 开始提供的表示本机大小的整数类型。在 32 位进程中运行时为 32 位的整数,在 64 位进程中运行时为 64 位的整数。这些类型可用于互操作场景、低级别的库中,以及可以用于在广泛使用整数运算的场景中优化提高性能。
本机大小的整型native-sized integer type在内部表示为 .NET类型的 System.IntPtr 和 System.UIntPtr,从C# 11开始,nint 和 nuint 类型是基础类型(underlying type)的别名。
每个整型类型的默认值都为零 0。
整型的 MinValue 和 MaxValue 属性,表示该类型的最小值和最大值,除了本机大小类型 nint 和 nuint 之外,这两个属性都是 编译时常量。
System.Numerics.BigInteger结构用于表示没有上限或下限的有符号整数。
整型字面量
整型字面量可以是:
- 十进制:不使用任何前缀。比如
10、7 - 十六进制:使用 0x 或 0X 前缀。比如
0xF8、0XA1 - 二进制:使用 0b 或 0B 前缀。比如
0b101、0B10 _数字分隔符,如同现实中数字书写的千分位,表示对数字的分割,便于阅读和人类数值识别。任何数字字面量都可以使用数字分隔符_。
var decimalLiteral = 43;
var hexLiteral = 0x2B;
var binaryLiteral = 0b_0010_1011;
整型的后缀
整数字面量可以添加后缀,表示整型的类型。
-
整型数值没有后缀时,其类型为后面类型中的第一个:
int、uint、long、ulong。 -
U或u后缀,其类型为后面类型中的第一个:uint、ulong,即 无符号整型或无符号长整型。 -
L或l后缀,其类型为后面类型中的第一个:long、ulong,即 长整型或无符号长整型。 -
UL、Ul、uL、ul、LU、Lu、lU或lu后缀,其类型为ulong。