[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

前端之家收集整理的这篇文章主要介绍了[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

代码编写风格. 因为Lambda所需篇幅挺大,所以先总结C#3.0智能编译器给我们带来的诸多好处,下一遍会单独介绍Lambda表达式. 这篇主要包括内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法.

自动实现的属性属性时一般会像下面这样去编写代码:

属性 { {name = 属性 { }

生成Name属性.

属性(需要额外验证的属性还是必须采用之前的方式来定义),我们可以使用自动实现的特性来对属性的定义进行简化,此时不再需额外定义一个私有字段了.代码如下:

自动实现的属性来定义属性 属性 Name{; 属性 Age{; }

PS: 这里也有一个快捷键: 打出prop 然后点击两下Tab键就可以生成上面的属性了,不过还需手动改值. 生成Console.WriteLine();了. 类似的还有很多,在这里就不列举了.

属性,主要是因为编译器在编译时会为我们创建一个私有字段. 利用反编译工具可以知道使用自动实现的属性时,C#都会帮我们创建必要的字段.自动属性时,需要注意的是所有构造函数都需要显式地调用无参构造函数this,否则会出现编译错误. 因为只有这样,编译器才能知道所有的字段都已经被赋值.调用无参构造函数,这主要是由C#编译器的设计决定,我们记住就好了.

Name { ; Age { ; 调用无参构造函数this()时,会出现编译时错误 TestPerson( : .Name = }

代码的可读写性. 为了避免这样的问题,C#3.0 引入了隐式类型,即可以使用关键字var来声明变量或数组.

stringValue = stringValue = }

包括以下几点:方法组,也不能为一个匿名函数

函数来完成不同情况下的初始化,C#3.0 提供了对象初始化器,它减少了我们在类中定义的构造函数代码,从而使代码更加简洁.

Main( 代码 Person p = Person(, p.Weight = p.Height = Name { ; Age { ; Weight { ; Height { ; 函数 Person( Person( name, Person( name, age, Person( name, weight, .Name = .Age = .Weight = .Height = }

函数了,前面的代码可以简化为如下的形式:

Main( Person p = Person() {Name = ,Age = ,Weght = ,Height = 代码和上面一行是等价的,只不过下面省略了构造函数的圆括号而已 Person p2 = Person {Name = ,Height = Name { ; Age { ; Weight { ; Height { ; }

生成了一个Person类的临时对象,并调用Person类的默认无参构造函数对其初始化.然后对它的属性逐个赋值.函数. 如果我们自定义了一个有参构造函数而把默认的无参构造函数覆盖了,则需要重新定义一个无参构造函数.

添加元素,在C#3.0 之前我们需要一个个Add 添加,而现在直接可以利用集合初始化器即可,编译器会调用Add方法,一个个地将初始化的内容添加进去.

List<> newNames = List<> ,, }

代码.

Main( person = {Name = ,Age = Console.WriteLine( personCollection = {Name = ,Age = {Name = ,Age = {Name = ,Age = totalAge = ( p 代码证明了Age属性时int类型 totalAge += Console.WriteLine( }

方法方法,首先是一个方法,他可以用来扩展已定义类型中的方法成员.

TestStr( TestInt( i, Console.WriteLine(s + Main( 方法 s = s.TestStr();调用方法1 Extensions.TestStr(s);调用方法2 i = i.TestInt( Extensions.TestInt(i, }

方法都可以用作扩展方法,我们需要考察它是否符合下列扩展方法的定义规则:方法必须在一个非嵌套,非泛型的静态类中定义加上this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展)

方法,需要先引入该命名空间 Main( Person p = Person {Name = p.Print();ExtensionClass.Print(p); p.Print( 自定义类型 Name { ; 方法定义 Print( Console.WriteLine(调用的是当前命名空间下的扩展方法输出,姓名为: {0} 方法定义 Pint( Console.WriteLine(调用的是CustomNameSpace命名空间下扩展方法输出: 姓名为: {0} 方法定义 Pint( Person p, Console.WriteLine(调用的是CustomNameSpace命名空间下扩展方法输出: 姓名为: {0},附加字符串为{1} }

调用的是当前命名空间下的扩展方法输出,姓名为: Barry Wang调用的是CustomNameSpace命名空间下扩展方法输出,姓名为: Barry Wang,附加字符串为Hello

调用方法时,它会首先去该对象的实例方法进行chazhao,如果没有找到与调用方法同名并参数一致的实例方法,方法. 编译器会检查所有导入的命名空间和当前命名空间中的扩展方法,并将变量类型匹配到扩展类型.当前命名空间下的扩展方法-->导入命名空间的扩展方法.

代码打印结果的由来: 在以上代码中存在另个不同的命名空间,它们都定义了带一个参数的扩展方法Print. 根据执行顺序,编译器会首先查看Person类型中是否定义了无参的Print实例方法.方法Print.方法,编译器因此不会再继续查找其他引入命名空间了. 所以p.Print() 调用的是当前命名空间下的Print扩展方法.调用也是一个道理.

猜你在找的C#相关文章