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 <variable_name> = value;

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

2.2.3 字符串(String)

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

string str1 = "hello ";
string str2 = @"word";

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

2.2.4 指针类型(Pointer types)

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

type* identifier;
char* cptr;
int* iptr;

三、类型转换

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 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;

隐式数值转换:

  • 从 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
  • 4
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值