C#数据类型

一、简介

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

二、数据类型

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

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

2.1 值类型

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

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ‘\0’
decimal 128 位精确的十进制值,具有 28~29 个有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

如果想要获取类型或变量的确切大小,可以使用 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";

注意: 虽然字符串是引用类型,但字符串是不可改变的。修改其中一个字符串,就会创建一个全新的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

你可能感兴趣的:(C#,c#,开发语言)