匿名类:
/*原理:编译器根据初始化值推断变量的真正类型.。var只能在初始化变量时使用(编译器要根据初始值固化其正真类型),例如var myint = 100;编译器会推断出myint为int类型。
而var myint ; myint = 0;//错误。因为编译器无法知道myint的具体类型,也就无法后续对其进行各种操作了(包括赋值等操作)。
一旦编译器确定了变量的类型,就不能更改,也即不能赋予不符合其类型的值了。*/
/*
* entry为匿名类,匿名类有诸多限制:
* 1、匿名类必须只具有public属性,且必须初始化属性
* 2、不可以具有static属性或字段
* 3、不可以有任何方法
*/
var entry = new {Name="牛逼火火",Address="天朝" };
Console.WriteLine(entry.Name+":"+entry.Address);
var(隐式变量)只能用于变量初始化,且只能是局部变量。不能用于函数返回值或参数。
当然,如果返回值是Object类型,也可以,但无实际意义。
可空类型:
如果一个值类型想变成可空类型,只需在类型后面使用?即可。例如 int? i=null;此时i可以赋予null(引用类型)了。
可以将值类型常量或变量赋予可空类型变量。例如
int? i=null;
i = 100;
int j=500;
i=j;
但不能将可空类型值类型赋予普通值类型变量。例如:
int? i = null;
i = 100;
int j=i;//Error。
可以使用HasValue来判断可空类型是否有值(即不是null),如果有返回true,否则为ifalse。
使用Value属性获取其值(真正的值,而非null。因此需要在进行HasValue判断后使用,否则如果可空类型为null,调用Value时将抛出异常:可空类型Value不能是null,必须有一个值。)
可空类型实际是引用类型,所以,它的存储位置是堆。
//装箱 拆箱
/*
* 装箱
* 原理:由于Object是引用类型,而引用类型绝对不能引用栈上的数据,所以oo实际引用是这样的:
* 首先在堆内存区开辟一小块内存,把bi(栈内存数据)的值复制一份赋予该堆内存,之后把该堆内存地址返回给oo。
* 结果:bi和oo互不影响。
*/
int bi = 10;
Object oo = bi;
bi = 108;
oo = 88;
Console.WriteLine("bi = " +bi+";oo="+oo);
/*
* 拆箱
* 拆箱需要强制类型转换。如果堆内存中的数据与要转换的值类型不匹配,将发生转换失败异常。
* 例如 Object o = new Person(); int a = (int)o;将会转换失败(拆箱失败)。
* 原理:如果发现oo是引用类型,就把对应堆内存中数据复制到对应的值类型栈内存中去。
* 结果:互不影响
*/
int myi2 = (int)oo;//如果oo = person将会转换失败
Console.WriteLine("myi2 = "+ myi2);