C#学习第四天

匿名类:

 

 /*原理:编译器根据初始化值推断变量的真正类型.。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);


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值