• C#数据类型


    一、简介

    C# 语言中内置了一些基本的数据类型,数据类型用来指定程序中变量可以存储的数据的类型。不同编程语言的数据类型都有所不同,下面让我们来了解一下C#的数据类型。

    二、数据类型

    C# 中的数据类型可以大致分为三类:

    • 值类型(Value types)
    • 引用类型(References types)
    • 指针类型(Pointer types)

    2.1 值类型

    C# 中的值类型是从 System.ValueType 类中派生出来的,对于值类型的变量我们可以直接为其分配一个具体的值。当声明一个值类型的变量时,系统会自动分配一块儿内存区域用来存储这个变量的值,需要注意的是,变量所占内存的大小会根据系统的不同而有所变化。

    类型描述范围默认值
    bool布尔值True 或 FalseFalse
    byte8 位无符号整数0 到 2550
    char16 位 Unicode 字符U +0000 到 U +ffff‘\0’
    decimal128 位精确的十进制值,具有 28~29 个有效位数(-7.9 x 1028 到 7.9 x 1028) / 100 到 280.0M
    double64 位双精度浮点型(+/-)5.0 x 10-324 到 (+/-)1.7 x 103080.0D
    float32 位单精度浮点型-3.4 x 1038 到 + 3.4 x 10380.0F
    int32 位有符号整数类型-2,147,483,648 到 2,147,483,6470
    long64 位有符号整数类型-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070L
    sbyte8 位有符号整数类型-128 到 1270
    short16 位有符号整数类型-32,768 到 32,7670
    uint32 位无符号整数类型0 到 4,294,967,2950
    ulong64 位无符号整数类型0 到 18,446,744,073,709,551,6150
    ushort16 位无符号整数类型0 到 65,5350

    如果想要获取类型或变量的确切大小,可以使用 sizeof 方法,示例:sizeof(int),返回4

    2.2 引用类型

    引用类型的变量中并不存储实际的数据值,而是存储的对数据(对象)的引用,换句话说就是,引用类型的变量中存储的是数据在内存中的位置。当多个变量都引用同一个内存地址时,如果其中一个变量改变了内存中数据的值,那么所有引用这个内存地址的变量的值都会改变。C# 中内置的引用类型包括 Object(对象)、Dynamic(动态)和 string(字符串)。

    2.2.1 对象(Object)

    Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。

    当一个值类型转换为对象类型时,则被称为 装箱:object obj = 100;;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱

    2.2.2 动态(Dynamic)

    Dynamic可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。语法:dynamic = value;

    注意: 动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

    2.2.3 字符串(String)

    String允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

    string str1 = "hello ";
    string str2 = @"word";
    
    • 1
    • 2

    注意: 虽然字符串是引用类型,但字符串是不可改变的。修改其中一个字符串,就会创建一个全新的string对象,而另一个字符串不会发生任何变化。

    2.2.4 指针类型(Pointer types)

    指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。语法:

    type* identifier;
    char* cptr;
    int* iptr;
    
    • 1
    • 2
    • 3

    三、类型转换

    类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:

    • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
    • 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

    3.1 显示类型转换

    C# 提供了下列内置的类型转换方法:

    方法描述
    ToBoolean如果可能的话,把类型转换为布尔型。
    ToByte把类型转换为字节类型。
    ToChar如果可能的话,把类型转换为单个Unicode 字符类型。
    ToDateTime把类型(整数或字符串类型)转换为 日期-时间 结构。
    ToDecimal把浮点型或整数类型转换为十进制类型。
    ToDouble把类型转换为双精度浮点型。
    ToInt16把类型转换为 16 位整数类型。
    ToInt32把类型转换为 32 位整数类型。
    ToInt64把类型转换为 64 位整数类型。
    ToSbyte把类型转换为有符号字节类型。
    ToSingle把类型转换为小浮点数类型。
    ToString把类型转换为字符串类型。
    ToType把类型转换为指定类型。
    ToUInt16把类型转换为 16 位无符号整数类型。
    ToUInt32把类型转换为 32 位无符号整数类型。
    ToUInt64把类型转换为 64 位无符号整数类型。

    3.2 隐式类型转换

    隐式类型转换是由 C# 以类型安全的方式执行的,转换的过程中不会导致数据丢失,例如从较小的整数类型(例如 int)转换到较大的整数类型(例如 long),从派生类转换为基类。实例:

    int a = 10;
    double b = a;
    
    • 1
    • 2

    隐式数值转换:

    • 从 sbyte 到 short、int、long、float、double 或 decimal。
    • 从 byte 到 short、ushort、int、uint、long、ulong、float double 或 decimal。
    • 从 short 到 int、long、float、double 或 decimal。
    • 从 ushort 到 int、uint、long、ulong、float、double 或 decimal。
    • 从 int 到 long、float、double 或 decimal。
    • 从 uint 到 long、ulong、float、double 或 decimal。
    • 从 long 到 float、double 或 decimal。
    • 从 ulong 到 float、double 或 decimal。
    • 从 char 到 ushort、int、uint、long、ulong、float、double 或 decimal。
    • 从 float 到 double。

    不存在向 char 类型的隐式转换,因此其它整型的值不会自动转换为 char 类型。
    浮点型不能隐式地转化为decimal型 ,隐式数据类型转换适用于数值类型的数据之间。

    注意: 一种数据类型(类型 A),只要其取值范围完全包含在另一种数据类型(类型 B)的取值范围内,那么类型 A 就可以隐式转换为类型 B。基于这一特性,C# 的隐式类型转换不会导致数据丢失。

    隐式枚举转换: 允许将十进制整数 0 转换为任何枚举类型。

    隐式引用转换: 是指一类引用类型之间的转换,这种转换总是可以成功,因此不需要在运行时进行任何检查。

    装箱转换: 允许将值类型隐式转换为引用类型。

    四、可空类型(Nullable)

    C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。主要使用于:在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能。

    例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。语法:

    <数据类型>? <变量名> = null;

    Null 合并运算符( ?? )

    Null 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。

    示例:

    int? num1 = null;
    int num2 = 1;
    int num3 = num1 ?? num2; // num3为1
    
    • 1
    • 2
    • 3
  • 相关阅读:
    webpack--插件
    什么?又来看驱动的过程了?是滴,必需滴--I2C设备的注册过程(小白篇)
    【HarmonyOS开发】设备调试避坑指南
    docker 转为docker-compose(composerize 命令)
    【数据结构】ArrayList详解
    5、Nacos服务注册与发现
    SpringBoot整合RestHighLevelClient实现索引操作以及文档操作
    ASEMI整流桥GBU810参数,GBU810封装
    用友vs金蝶产品分析(云星空与YonSuite)
    Python二分查找的左闭右闭和左闭右开
  • 原文地址:https://blog.csdn.net/IO14122/article/details/126104954