[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

前端之家收集整理的这篇文章主要介绍了[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<p style="background: gray; color: #ffffff; font-size: 18pt;">前言

方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法方法和迭代器3个优美的特性。

1,泛型1.1 泛型是什么方法就可以操作多种数据类型的目的。泛型是将方法实现行为与方法的数据类型分离,实现了代码重用。

Main( List<> intList = List<> 添加元素3 intList.Add( List<> stringList = List<> 添加元素 stringList.Add( }

代码中,List 是.Net 类库中实现的泛型类型,T是泛型参数(可理解为形参), 如果想实例化一个泛型类型,必须传入实际的参数类型。

代码重用外,还提供了更好的性能和类型安全特性. 前面关于拆箱装箱讲过. 应用类型和值类型间存在着相互转换,转换的过程称为装箱和拆箱. 这对过程会引起一定的性能损失. 而泛型是避免性能损失的有效方法.

代码中,T就是类型参数. 无论调用类型方法还是初始化泛型实例,都需要用真实类型来替换T. 可以将T理解为类型的一个占位符,即告诉编译器,在调用泛型时必须为其指定一个实际类型.

DictionaryStringKey : Dictionary<,T> Main( 是一个开放类型,它有两个类型参数 Type t = (Dictionary<,> 是一个封闭类型 t = (DictionaryStringKey<> }

函数问题

TypeWithStaticField 函数 Console.WriteLine(field + + Main( TypeWithStaticField<>.field = TypeWithStaticField<>.field = TypeWithStaticField.field = NoGenericTypeWithStaticField.field = NoGenericTypeWithStaticField.field = NoGenericTypeWithStaticField.field = TypeWithStaticField<> TypeWithStaticField<> TypeWithStaticField }

内容还会继续补充.

类型,即可空类型. C# 2.0 提供和的可空类型是Nullable和Nullable. (可控类型的定义是public struct Nullable where T:struct,T只能为值类型)

Nullable value = 1;

代码函数,提高了代码的可读性:功能差不多,类似于: x = nullHasValue.HasValue ? b.value : 12;

获取值,并对该值进行装箱操作.

Nullable<> nullable = ? nullableWithoutValue = ,这一点需要特别注意 nullable.GetType(); 调用方法时将出现异常,所以一般引用类型调用方法前,最好先检查下它是否为null obj = obj.GetType(); value = ( nullable = (?)obj;

调用函数时会抛出空引用异常,但是仍然可以访问HasValue属性.属性.

方法方法就是没有名字的方法. 因为没有名字,匿名方法只能在函数定义的时候被调用,在其他任何情况下都不能被调用.方法和委托有着莫大的关系. 下面用代码来说明二者之间的关系. 首先回顾委托的使用方法.

VoteDelegate( Main( 方法来实例化委托对象 VoteDelegate voteDelegate = VoteDelegate( 方法直接赋给了委托对象 调用委托来回调Vote()方法,这是隐式调用方式 voteDelegate( 方法 Vote( Console.WriteLine( }

方法的类类型,既然委托方法也是方法,当然可以被委托类型包装了,所以我们还可以用匿名方法的方式去实现前面的代码:

VoteDelegate( Main( 方法来实例化委托对象 VoteDelegate voteDelegate = ( Console.WriteLine( 调用委托来回调Vote()方法,这是隐式调用方式 voteDelegate( }

代码可以看出,若使用了匿名方法,就不再需要单独定义一个Vote方法了,这减少了代码行数,更有利于程序阅读. 方法也有缺点: 不能再其他地方被调用,即不具有重复性. 所以如果委托包装的方法相对简单,并且该方法在其他地方的调用频率较低,我们就可以考虑用匿名方法来实例化委托对象了.

接口. 自定义迭代器变得容易了很多.

方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象,如下面代码所示:

[DispId(- }

实现方法:

Name { ; Age { ; Person[] personList = Person[ personList[] = Person() { Name = ,Age = personList[] = Person() { Name = ,Age = personList[] = Person() { Name = ,Age = personList[] = Person() { Name = ,Age = Main( People p = (Person person Console.WriteLine( IEnumerator i = Person person = Console.WriteLine( }

属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象是一个访问器。那至少应该有一个Current属性,来获取当前集合中的项吧。MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?

自定义迭代器

PS: 这两天比较闲 便更新的比较频繁. 写完这个系列也等于把这本书又重新读了一遍,仍有不少的收获.  勉励自己多读书,多记录,加油! 2016/01/20

猜你在找的C#相关文章