3.4 属性与索引器
3.4.1 属性的定义与使用
属性的基本概念
属性(Property)是C#中封装字段访问的一种机制,它通过get和set访问器控制对私有字段的读写操作。属性提供了数据绑定的支持,并允许在访问字段时添加逻辑验证。
属性的语法
private string _name; // 私有字段
public string Name // 公共属性
{
get { return _name; }
set { _name = value; }
}
自动实现属性(Auto-Property)
C# 3.0引入的简化语法:
public string Name { get; set; } // 编译器自动生成私有字段
属性访问器控制
- 只读属性:仅包含
get访问器 - 只写属性:仅包含
set访问器(较少使用) - 访问修饰符:可为
get或set单独设置访问级别
3.4.2 索引器的定义与使用
索引器的基本概念
索引器(Indexer)允许对象像数组一样通过索引访问,常用于封装集合类。语法类似于属性,但使用this关键字和方括号。
索引器的语法
class StringCollection
{
private string[] _items = new string[10];
public string this[int index]
{
get => _items[index];
set => _items[index] = value;
}
}
// 使用示例
var collection = new StringCollection();
collection[0] = "Hello"; // 调用set访问器
Console.WriteLine(collection[0]); // 调用get访问器
多参数索引器
索引器可以接受多个参数:
public int this[int x, int y]
{
get { return _grid[x, y]; }
}
3.4.3 属性与索引器的比较
| 特性 | 属性 | 索引器 |
|---|---|---|
| 声明方式 | 使用属性名 | 使用this关键字 |
| 访问语法 | 对象.属性名 | 对象[索引参数] |
| 参数 | 无参数 | 可以有一个或多个参数 |
| 典型用途 | 封装字段访问 | 使对象支持类似数组的访问 |
3.4.4 高级特性
表达式体属性
C# 6.0引入的简化语法:
public string FullName => $"{FirstName} {LastName}";
初始化属性
C# 6.0允许属性初始化:
public List<int> Numbers { get; set; } = new List<int>();
索引器重载
可以定义多个索引器(参数类型不同):
public string this[int index] { ... }
public string this[string name] { ... }
3.4.5 最佳实践
属性选择原则:
- 优先使用自动属性
- 需要验证逻辑时使用完整属性
- 避免在属性getter中抛出异常
索引器使用场景:
- 集合类
- 多维数据访问
- 字典式访问
性能考虑:
- 简单属性会被JIT内联优化
- 复杂逻辑考虑使用方法替代属性
线程安全:
- 多线程环境下考虑属性访问的同步机制
- 可以使用
Lazy<T>延迟初始化
