8.1 自动实现的属性
公开可见的静态成员通常应该是线程安全的,编译器在这方面帮不上什么忙,得自己去实现
public class InstanceCountingPerson { public string Name { get; private set; } public int Age { get; private set; } private static int InstanceCounter { get; set; } private static readonly object counterLock = new object(); public InstanceCountingPerson(string name, int age) { Name = name; Age = age; lock (counterLock) { InstanceCounter++; } } }
作者见过的使用静态自动属性的唯一情况是,取值方法是公共的,赋值方法是私有的,并且赋值方法只能在类型初始化程序中使用。
(以下代码无法通过编译)
public struct Foo { public int Value { get; private set; } public Foo(int value) { this.Value = value; } }
只有加上this 才可以
public struct Foo { public int Value { get; private set; } public Foo(int value) :this() { this.Value = value; } }
8.2 隐式类型的局部变量
8.2.1 用var声明局部变量
8.2.2 隐式类型的限制
- 被声明的变量是一个局部变量,而不是静态字段和实例字段。
- 变量在声明的同时被初始化;
- 初始化表达式不是方法组,也不是匿名函数。
- 初始化表达式不是null
- 语句中只声明了一个变量。
- 你希望变量拥有的类型是初始化表达式的编译时类型
- 初始化表达式不包含正在声明的变量。
8.2.3 隐式类型的优缺点
8.2.4 建议
8.3 简化的初始化
8.3.1定义示例类型
public class Person { public int Age { get; set; } public string Name { get; set; } List<Person> friends = new List<Person>(); public List<Person> Friends { get { return friends; } } Location home = new Location(); public Location Home { get { return home; } } public Person() { } public Person(string name) { Name = name; } } public class Location { public string Country { get; set; } public string Town { get; set; } }
8.3.2 设置简单属性
C#3.0可以用一个表达式来设置对象的所有属性
8.3.3 为嵌入对象设置属性
8.3.4 集合初始化程序
时间: 2024-11-07 03:40:06