c#学习笔记(六):可空类型、匿名方法和迭代器 -尊龙游戏旗舰厅官网
为啥要引入可空类型?
在数据库中,字段是可以为null值的,那么在c#中为了方便的操作数据库的值,微软引入了可空类型。
声明可空类型
我们可以使用两种方法声明一个可空类型:
1 nullable<int> i = null; 2 int? i = null;第二行是第一行的简写方法,其中“?”是微软为可空类型提供的一个语法糖。
我们看看可空类型的实现:
1 // type: system.nullable`1 2 // assembly: mscorlib, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089 3 // mvid: 255abcdf-d9d6-4e3d-bad4-f74d4ce3d7a8 4 // assembly location: c:\windows\microsoft.net\framework\v4.0.30319\mscorlib.dll 5 6 using system.runtime; 7 8 namespace system 9 { 10 ///我们注意一下其类的声明:
public struct nullable首先,可空类型是值类型而不是引用类型。
where表明了其接受的类型仅仅是值类型,当然,引用类型天生就支持为null。
使用可空类型
我们来看一个使用可空的例子:
1 using system; 2 3 namespace study 4 { 5 class program 6 { 7 static void main(string[] args) 8 { 9 int? i = null; 10 11 // getvalueordefault() 如果为空则返回默认值 12 console.writeline("是否有值:" i.hasvalue ", 值:" i.getvalueordefault()); 13 14 //赋值 15 if (!i.hasvalue) 16 { 17 i = 100; 18 } 19 20 console.writeline("是否有值:" i.hasvalue ", 值:" i.value); 21 22 //int num = i * 2; 23 //上面的写法会报错 24 int num = i.value * 2; 25 console.writeline("num:" num); 26 27 if (i == 100) 28 { 29 console.writeline("等于100"); 30 } 31 32 console.read(); 33 } 34 } 35 }输出如下:
1 是否有值:false, 值:0 2 是否有值:true, 值:100 3 num:200 4 等于100空合并操作符
由于可空类型可以为空,所以,如果我们需要获取一个可空类型的值时,如果为null返回0,否则返回其自己的值,写法如下:
int i = nullable.hasvalue ? nullable.value : 0;我们还可以直接使用getvalueordefault();方法来获取,如果是为null需要一个指定的数,如100的写法如下:
1 int i = nullable.hasvalue ? nullable.value : 100; 2 int i = nullable.getvalueordefault(100);上面两种写法的效果一致。
下面我们来看看空合并操作符“??”的效果:判断左方的数,如果不为空则返回左方的数,否则返回右方的数。
比如上面的效果用空合并操作符来写如下:
int i = nullable ?? 100;我们可以把空操作符看做一种方便的简写形式。
委托、匿名函数、lambda表达式和事件的学习
闭包
一般一个方法内部定义的值对象会在方法或其作用域结束时被系统回收,但是如果使用匿名函数和lambda表达式时会引入一种新的情况,导致方法内部定义的值对象不会再方法结束时被回收,这种想象称为闭包。
闭包的概念:主要是指由函数以及与函数相关的上下文环境组成的实体,通过闭包,函数与上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程中持久保持,从作用域的角度而言,私有变量的生存期被延长,函数调用所生成的值在下次调用时仍被保持。从安全性的角度而言,闭包有利于信息隐蔽,私有变量只在该函数内可见。
形成闭包的条件:嵌套定义的函数、匿名函数、将函数作为参数或者返回值。
我们来看一个闭包的例子:
1 using system; 2 3 namespace study 4 { 5 class program 6 { 7 static void main(string[] args) 8 { 9 tcloser a = new tcloser(); 10 func<int> b = a.t1(); 11 console.writeline(b()); 12 13 console.read(); 14 } 15 } 16 17 public class tcloser 18 { 19 public func<int> t1() 20 { 21 int n = 999; 22 return () => 23 { 24 console.writeline(n); 25 return n; 26 }; 27 } 28 } 29 }我们会发现,例子中t1的局部变量n,在t1执行完毕后仍然被保留没有被系统回收,而在其返回的方法中可以被使用到,这就是闭包。
ienumerable、ienumerator与yield的学习
yield学习续:yield return迭代块在unity3d中的应用——协程
总结
以上是尊龙游戏旗舰厅官网为你收集整理的c#学习笔记(六):可空类型、匿名方法和迭代器的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: