C#语言主要有两种类型:
- 值类型:直接存储在内存的栈上面;int, bool, struct, enum,
- 引用类型:在栈上只存储一个引用,堆上面才会存储具体的值;内建引用:object, string,dynamic; class
C#类型转换
C#是一种强类型的编程语言,即在编译的时候进行类型的检查。
类型转换的形式:
1. 隐式转换:
//1. 隐式转换;用于小的类型向大的类型转换;子类向基类转换;
int i = 10;
long l = i;
2. 显式转换:有数据丢失可能无法强制转换,要使用异常机制
//2. 显式转换:有大的范围向小的范围转换; 基类向子类转换:
double d = 10.05;
int iFromD = (int)d;
使用as: as只能用于引用类型和非空类型
C1 c1 = new C1();
C2 c2 = c1 as C2; //不会报错,如果转换失败,则c2=null;
3. 通过Method进行转换:
int iFroms = Convert.ToInt32("100");
或者:int iFroms =Int32.Parse("100");
或者:int iFroms2;
bool iFroms = Int32.TryParse("100", out iFroms2); //尝试去转换
C#的装箱和拆箱和Nullable类型
1. 装箱: 将一个值类型转换成引用类型 :将栈中的值类型打包放入堆中
//装箱:是一个隐式转换,不需要特别的语法
int iToBoxing = 100;
object iBoxed = iToBoxing;
2. 拆箱: 将一个引用类型转变成值类型
//拆箱: 通过显式转换实现,可能有数据丢失或出错
int iUnBoxing = (int)iBoxed;
由于装箱和拆箱比较消耗资源,因此应当尽量避免使用
3. 另值类型可为空:
int? iNullable = 100;
相当于:System.Nullable<int> iNullable = 100;
访问时用: iNullable.hasValue; 判断是否有值,如果有,则可以用iNullable.Value; 访问;
或者:iNullable.GetValueOrDefault(); 如果为空,返回0, 不为空,返回该值
另外: int ii = iNullable ?? 500; // 如果iNullable为空,则赋值为500,不为空,则保持原值