C# 的数据类型:值类型 Value types,引用类型 Reference types,指针类型 Pointer types(学习心得 4)
变量 分为 3 种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
一、值类型(Value types)
这个类型的变量,可以赋值。
该类型变量从类 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 方法,可以查看 int 以字节为单位的存储尺寸:
using System;
namespace DataTypeApplication
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Size of int: {0}", sizeof(int));
// 显示 int 的长度,这里是 4,即 4 个字节
// 1 个字节是 8 位,2^8=256
// 4 个字节是 32 位,2^32=4,294,967,296
// 所以 int 的范围是 -2,147,483,648 到 2,147,483,647
Console.ReadLine();
//会等待直到用户按下回车,一次读入一行。
}
}
}
运行结果:
Size of int: 4
二、引用类型(Reference types)
该类型不包含实际数据,只包含变量。
指向一个内存位置。
可以多个变量指向一个内存位置。
如果该内存位置数据由一个变量进行改变,则其他变量自动反映该变化。
内置的 引用类型有:
- object
- dynamic
- string
2.1 对象(Object)类型
该类型是 C# 通用类型系统(Common Type System – CTS)中所有数据类型的终极基类。
Object 即 System.Object 类的别名。
所以 对象 类型可以被分配成任何其他类型(值类型,引用类型,预定义类型或用户自定义类型)的值。但转换前,需要先进行类型转换。
- 值类型——> 对象类型,称作:装箱
- 对象类型——> 值类型,称作:拆箱
object obj;
obj = 100; // 这就是装箱
// 我的理解是,将值装入了对象中
int num =(int) obj; // 这就是拆箱
// 我的理解是,取出对象中的值
// 注:被装过箱的对象才能被拆箱
2.2 动态(Dynamic)类型
可以存储任何类型的值。
类型检查在 运行 时发生。
声明:
dynamic <variable_name> = value;
比如:
dynamic d = 20;
对象类型 变量的类型检查,是在编译时发生。
动态类型 变量的类型检查,是在运行时发生。
2.3 字符串(String)类型
该类型可给变量分配任何 字符串值。
String 是 System.String 类的别名,从 Object 类型派生。
两种分配方式:
- 引号
- @引号
例如:
String str = "runoob.com";
@引号字符串,表示把转义字符当作普通字符,称作 “逐字字符串”。
string str = @"C:\Windows";
等价于:
string str = "C:\\Windows";
@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
string str = @"<script type=""text/javascript"">
<!--
-->
</script>";
附注:
- string 是 C# 中的类,String 是 .net Framework 的类(在 IDE 中显示颜色不同)。
- C# string 映射为 .net Framework 的 String。
- 如果用 string,编译器会把它编译成 String,所以如果直接用 String 就可以让编译器少做一点点工作。
- 建议使用 string,比较符合规范 。
- string 是关键字,String 不是。
2.4 用户自定义引用类型
包括 class,interface 或 delegate。
三、指针类型(Pointer types)
该类型存储 另一种类型 的内存地址。
声明:
type* indentifier
例如:
int* num;