类型分为值类型(存在声明的地方)和引用类型存储位置堆区。在运行过程中经常会遇到 变量在 值类型与引用类型之间的转换。
目录
常用数据类型:
值类型:基本数据类型(int、double、float、bool等);枚举(可自定义) enum ;结构体(可自定义) struct
引用类型:类(可自定义)class;容器 array、List、Dictionary等;字符串 string;委托 delegate等
默认值:
值类型:整形默认值为0;浮点型默认值为 0.0;bool 默认值为 false ;枚举默认值从0开始;
引用类型:默认值为null;意为在堆内存上没有地址指引 没有分配内存;
装拆箱指的是将一个值从栈区拿出创建堆区对象存储,或将堆区内存对象值移动到栈区存储的过程,在过程中将该值进行内存位置移动。
装箱:
将一个int类型的值 通过tostring 或Convert 进行类型转换,将int 转为了string。在转换过程中,在堆上分配了内存 存储一个字符串的类型对象,该对象内包含某值的字符串。将值类型的值 从栈区到堆区上创建引用类型对象的 这一操作称为装箱。
如代码所示:
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
int id = 10;//值类型 int
Console.WriteLine(id.GetType());
string idStr = id.ToString();
Console.WriteLine(idStr.GetType());//输出 System.String
string idStr2 = Convert.ToString(id);
Console.WriteLine(idStr2.GetType());//输出 System.String
}
}
}
拆箱:
将一个引用类型对象的值,包含创建进一个值类型对象中,该值的内存地址由堆区移动到了栈区,称为拆箱。
如代码所示:将一个值为10的字符串引用类型转为int值类型存储在栈区。
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
string tId = "10";
Console.WriteLine(tId);
int tId2 = Convert.ToInt32(tId);
Console.WriteLine(tId2);
}
}
}
在装拆箱的过程中,一个值在内存上被来回的转移分配存储,是一种内存操作,在编码中要尽量避免装拆箱的操作,避免内存来回分配到来的消耗。