CSharpThinkingC#3 革新(附加二)

  本章主要讨论C#3较C#2的一些革新,其中大多数革新所体现的新特性是为Linq服务的,但本章不打算单独讨论,会在后面详细说明。

  一,自动实现的属性

    1.1 意义:是开发者不必再写出由字段直接提供的简单属性。

    1.2 优缺点:使用自动属性可以简洁那些不做内部校验的属性,C#编译器支持简洁的{get;set;}表达方式。不足之处是:不能方便的设置初始值。

1 public string Name
2 {
3     get;
4     private set;
5 }

  二,隐式类型的局部变量

    2.1 意义:根据初始值判断变量的类型,从而简化局部变量的声明。重点在于隐式类型并没有使C#称为动态或者弱类型的语言。

        var在使用时完全是编译器在编译前已“明确的”,“唯一的”生成相应的类型变量,而不是可变的。

    2.2 隐式类型的限制:

        1) 被声明的变量时一个局部变量。

        2) 变量在声明的同时被初始化。

        3) 初始化表达式不是一个方法组,也不是一个匿名函数。

        4) 初始化表达式不是Null。

        5) 语言中值声明了一个变量。

        6) 你希望变量拥有的类型是初始化表达式的编译时的类型。

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

    2.3 优缺点:

        优点---减少屏幕上的代码量及改变了代码重心(更多的关注右侧类型)。

        缺点---可读性变差。

  三,对象和集合初始化程序

    3.1 意义:用简单的表达式来初始化对象。

    3.2 支持集合初始化及嵌套类型的集合初始化,如内部嵌套类型不在另外使用的话(不关注初始化的数据另外使用),则此初始化更清晰的表达了数据及初始化过程。

 1 Person tom = new Person
 2 {
 3     Name = "Tom",
 4     Home = { Town = "Reading",Country = "UK" }, // 初始化嵌入对象
 5     Friends =                                                        // 更进一步的对象初始化器
 6     {
 7             new Person{ Name = "Alberto"},
 8             new Person{ "Max"},
 9             new Person("Alice")
10             {
11                     Home = { Town = "Twyford", Country = "UK"},
12             }
13      }
14 }
15 ...
16 
17 public class Person
18 {
19     public string Name{get;set;}
20     private Loaction _Home = new Location();
21     public Location Home{get {return _Home;}}
22     private List<Person> _Friends = new List<Person>();
23     public List<Person> Friends { get { return _Friends;}}
24     
25     public Person(string n)
26     {
27         Name = n;
28     }
29 }
30 ...
31 public class Loaction
32 {
33     public string Country{get;set;}
34     public string Town{get;set;}
35 }

  四,隐式类型的数组

    5.1 意义:代码简洁,前提是编译器得知道要初始化什么样的数组。

1 public void MyMethod(string[] name)
2 {
3     ...
4 }
5 ...
6 MyMethod({"Lily","Holly","Tom"}); // 错误:编译器不知道什么类型
7 MyMethod(new string[] {"Lily","Holly","Tom"}); // 正确:编译器确切的知道类型
8 MyMethod(new[] {"Lily","Holly","Tom"}); // 正确:编译器能清楚的推断出类型,大多数时候参数类型要相同,否则要进行强制转换。
原文地址:https://www.cnblogs.com/cuiyansong/p/3108438.html