.NET/C#基础之数据类型、值类型分类和整型

333 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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类型表示布尔值 truefalse
  • char类型 表示 Unicode UTF-16 字符

所有的简单类型都是结构structure类型,与其他结构类型不同的地方在于,简单类型允许额外操作:

  • 简单类型可以使用字面量(literal)提供值。例如,a是类型char的字面量,2000 是类型 intuint 等数值类型的字面量,falsetrue是布尔类型的字面量。

  • 可以使用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 到 1278 位带符号整数System.SByte
byte0 到 255无符号的 8 位整数System.Byte
short-32,768 到 32,767有符号 16 位整数System.Int16
ushort0 到 65,535无符号 16 位整数System.UInt16
int-2,147,483,648 到 2,147,483,647带符号的 32 位整数System.Int32
uint0 到 4,294,967,295无符号的 32 位整数System.UInt32
long-9,223,372,036,854,775,808 到 9,223,372,036,854,775,80764 位带符号整数System.Int64
ulong0 到 18,446,744,073,709,551,615无符号 64 位整数System.UInt64
nint取决于(在运行时计算的)平台带符号的 32 位或 64 位整数System.IntPtr
nuint取决于(在运行时计算的)平台无符号的 32 位或 64 位整数System.UIntPtr

除了nintnuint,表中其他每个 C# 类型关键字 都是对应的 .NET 类型的别名,C#类型关键字 和 .NET类型名称 是可以互换的。

int a = 123;
System.Int32 b = 123;

a、b 两个变量类型相同。

即,intSystem.Int32的别名,两者含义和用法一模一样,只是在C#中更习惯使用int

nintnuint 是 C# 9.0 开始提供的表示本机大小的整数类型。在 32 位进程中运行时为 32 位的整数,在 64 位进程中运行时为 64 位的整数。这些类型可用于互操作场景、低级别的库中,以及可以用于在广泛使用整数运算的场景中优化提高性能。

本机大小的整型native-sized integer type在内部表示为 .NET类型的 System.IntPtrSystem.UIntPtr,从C# 11开始,nintnuint 类型是基础类型(underlying type)的别名。

每个整型类型的默认值都为零 0

整型的 MinValueMaxValue 属性,表示该类型的最小值和最大值,除了本机大小类型 nint 和 nuint 之外,这两个属性都是 编译时常量

System.Numerics.BigInteger 结构用于表示没有上限或下限的有符号整数。

整型字面量

整型字面量可以是:

  • 十进制:不使用任何前缀。比如107
  • 十六进制:使用 0x 或 0X 前缀。比如0xF80XA1
  • 二进制:使用 0b 或 0B 前缀。比如0b1010B10
  • _ 数字分隔符,如同现实中数字书写的千分位,表示对数字的分割,便于阅读和人类数值识别。任何数字字面量都可以使用数字分隔符_
var decimalLiteral = 43;
var hexLiteral = 0x2B;
var binaryLiteral = 0b_0010_1011;

整型的后缀

整数字面量可以添加后缀,表示整型的类型。

  • 整型数值没有后缀时,其类型为后面类型中的第一个:intuintlongulong

  • Uu 后缀,其类型为后面类型中的第一个:uintulong,即 无符号整型或无符号长整型。

  • Ll 后缀,其类型为后面类型中的第一个:longulong,即 长整型或无符号长整型。

  • ULUluLulLULulUlu后缀,其类型为 ulong

参考