放一张图: 和匿名方法还有迭代器一样

时间:2021-12-06 04:10:03

用智能的编译器来防错

本章的主要内容:

自动实现的属性:编写由字段直接撑持的简单属性, 不再显得痴肥不堪;

隐式类型的局部变量:按照初始值揣度类型,简化局部变量的声明;

东西和调集初始化措施:用一个表达式就能创建和初始化东西;

隐式类型的数组:按照内容揣度数组的类型,从而简化数组的创建过程;

匿名类型:允许创建新的姑且类型来包罗简单的属性;

自动实现的属性

这个特性简单的我都不想描述,但是为了连结内容的完整性,放一张图:

放一张图: 和匿名方法还有迭代器一样

和匿名要领还有迭代器一样,它在编译器的辅佐下会生成一个后备字段。

自动实现的属性是赋值和取值要领都是共有的,固然你还可以继续使用C#2私有赋值要领。

在实现本身的布局(struct)时,所有结构函数都必需显式的挪用一下无参的结构函数,只有这样,编译器才知道所有的字段都被明确赋值了。因为这里有个类型初始化的挨次:

类或布局在初始化时的执行挨次,依次如下:

1: 子类静态变量

2: 子类静态结构函数

3: 子类非静态变量

4: 父类静态变量

5: 父类静态结构函数

6: 父类非静态变量

7: 父类结构函数

8: 子类结构函数

可以看到除了结构函数以外其他对象都是先初始化自己在初始化基类的。

隐式类型的局部变量

首先需要说明一点的时隐式类型只能用于局部变量,不能用于字段变量。

第二点是,C#仍然是一门静态的语言,只是要求编译器为你来揣度变量的类型,在编译时仍然是类型静态的。

用var关键字来声明一个隐式类型的局部变量。

小小的总结:不是在所有情况下都能为所有变量使用隐式类型, 只有在以下情况下才华用它:

被声明的变量是一个局部变量, 而不是静态字段和实例字段;

变量在声明的同时被初始化;

初始化表达式不是要领组, 也不是匿名函数( 如果不进行强制类型转换);

初始化表达式不是 null;

语句中只声明了一个变量;

你但愿变量拥有的类型是初始化表达式的编译时类型;

初始化表达式不包罗正在声明的变量 。

隐式类型的局部变量也有一些欠好的处所,有的时候你不得不仔细的判断它的类型。例如:

var a = 2147483647;

var b = 2147483648;

var c = 4294967295;

var d = 4294967296;

var e = 9223372036854775807;

var f = 9223372036854775808;

上面的这些变量的类型都欠好在第一时间就判断出来。但是,有的时候你不得不用,好比要返回一个匿名的类型,只能这样写:var a=new {name="pangjianxin",age=10};这样的表达式你要用什么类型来引用呢?

简化的初始化

直接上代码。

public class Person { public string Name { get; } public int Age { get; set; } public List<Person> Persons { get; } = new List<Person>(); public Location Location { get; } = new Location(); public Person() { } public Person(string name) { this.Name = name; } } public class Location { public string City { get; set; } public string Street { get; set; } }

上面界说两个类,一个Person类,一个Location类。Person类中维护两个自动属性Name和Age,,此外,还维护了两个只读属性Persons和Location。还有一个无参的结构函数和一个有参数的结构函数。

前面已经说过,类会在静态的和非静态的字段初始化后才会执行结构函数,属性素质上来说是一对get/set要领,不存在初始化。

看一下挪用情况:

static void Main(string[] args) { Person p = new Person("pangianxin") { Age = 18, Location = { City = "baotou", Street = "gangtiedajie" } }; Console.WriteLine(p.Location.City); //p.Location=new Location();无法对Location进行初始化,因为他是只读的。

p.Location.City = "baotou ";
              p.Location.Street = "gangtiedajie ";

Console.ReadKey(); }

上面使用了东西初始化措施来对东西进行初始化。