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;
Tags: