数据类型
数据类型是性质相同的值的集合,并且伴随着针对不同数据类型的操作。例如 int 和 double 类型,这两种类型在内存中的存储方式不一样,进行各种运算及操作的方式也不一样。容纳数据的内存过小会导致数据丢失精度,容纳的内存过大则会浪费内存空间。
C#是强类型语言,数据受数据类型约束,不允许将一个类型的值赋给另一个类型,如果不强制转换则永远为该类型。而JavaScript为弱类型语言,允许将不同类型的数据赋给一个变量,数据不受数据类型约束。
int x = 100; //将 int 类型的值赋给 bool 类型在C#中是不允许的 //但是在C语言中可以 if(x = 100) { ... } //为了避免比较变成赋值,C语言中一般采用下述写法 if(100 == x) { ... }
C#在4.0后引入了 dynamic 数据类型,以此来对弱类型进行模仿,但C#仍为强类型语言。
static void Main(string[] args) { dynamic myVar = 500; Console.WriteLine(myVar); myVar = "Hello Dynamic!"; Console.WriteLine(myVar); }
类型的作用
类型指出存储此类型变量所需的内存空间大小,可以存放的最大最小值。类型占内存空间的大小影响类型可表示的范围。一个类型知道它的基类型是谁,也知道自己包含哪些成员。
Type myType = typeof(Form); Console.WriteLine(myType.BaseType.BaseType); //打印类型名称 PropertyInfo[] propInfo = myType.GetProperties(); foreach (var p in propInfo) { Console.WriteLine(p.Name);//打印类型的成员名 } MethodInfo[] methodInof = myType.GetMethods(); foreach(var m in methodInof) { Console.WriteLine(m.Name);//打印类型的方法名 }
C#中的数据类型
类:Window、Form、Console、String
结构体:Int32、Int64、Single、Double
枚举:HorizontalAlignment、Visibility
接口(Interface)
委托(delegates)
C#类型系统包括引用类型和值类型两种。引用类型包括类、接口、委托,值类型包括结构体、枚举,所有类型都以 object 类型为基类型。
变量、对象与内存
每个变量对应一个类型,决定哪些值可以存入变量。变量不仅存储数据,还标识了以变量名所对应的内存地址为起点、数据类型所要求的存储空间为长度的一块内存区域。值类型没有实例,值类型变量的值存储在内存的栈中。引用类型变量的实例数据存储在堆内存中,引用类型变量本身只存储实例数据在堆内存中的地址。局部变量在栈中分配内存,常量变量声明时必须初始化,初始化后不可再对其进行修改。
class Student { private uint ID; private ushort Score; } class Program { static void Main(string[] args) { //stu为引用类型变量,也是局部变量,在栈分配内存。 //但stu所指向的实例(对象)数据成员在堆中分配内存。 Student stu = new Student(); } }
装箱和拆箱
假设声明了局部变量 x,x 在栈上分配内存并存入值100。此时如果把变量 x 赋给 object 类型的变量 obj,由于 obj 变量是引用类型变量,计算机发现obj变量所要引用的值不是堆内存中的实例,而是栈上的值类型,那么就会把 x 的值复制一份到堆中,并将其堆内存地址赋给 obj 变量。这个过程叫装箱。从堆内存中,将 obj 变量引用的值复制到变量 y 分配的栈内存中,这个过程称为拆箱。装箱和拆箱会损失程序的性能。
static void Main(string[] args) { int x = 100; object obj = x; //装箱 int y = (int)obj; //拆箱 }
标签:obj,变量,C#,数据类型,笔记,内存,类型 From: https://www.cnblogs.com/owmt/p/17985353