跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 自动属性
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#自动属性 = == 介绍 == '''自动属性'''(Auto-Implemented Properties)是C# 3.0引入的一项功能,它允许开发者以更简洁的方式声明属性,而无需显式定义私有字段。编译器会自动生成一个隐藏的私有字段(称为"后备字段")来存储属性值。自动属性极大地减少了样板代码,使代码更清晰易读。 == 语法 == 自动属性的基本语法如下: <syntaxhighlight lang="csharp"> public datatype PropertyName { get; set; } </syntaxhighlight> == 传统属性 vs 自动属性 == === 传统属性 === 传统属性需要显式声明一个私有字段来存储值: <syntaxhighlight lang="csharp"> private string _name; // 私有字段 public string Name // 属性 { get { return _name; } set { _name = value; } } </syntaxhighlight> === 自动属性 === 自动属性简化了这一过程: <syntaxhighlight lang="csharp"> public string Name { get; set; } // 自动属性 </syntaxhighlight> 编译器会自动生成类似以下代码: <syntaxhighlight lang="csharp"> private string <Name>k__BackingField; // 编译器生成的字段 public string Name { get { return <Name>k__BackingField; } set { <Name>k__BackingField = value; } } </syntaxhighlight> == 访问修饰符 == 可以为get和set访问器设置不同的访问级别: <syntaxhighlight lang="csharp"> public string Name { get; private set; } // 只能在类内部设置 public string Id { private get; set; } // 只能在类内部获取 </syntaxhighlight> == 只读自动属性 == 从C# 6开始,可以创建真正的只读自动属性(只能在构造函数中设置): <syntaxhighlight lang="csharp"> public string Id { get; } // 只读自动属性 </syntaxhighlight> == 初始化器 == C# 6引入了自动属性初始化器: <syntaxhighlight lang="csharp"> public string Category { get; set; } = "Uncategorized"; public DateTime Created { get; } = DateTime.Now; </syntaxhighlight> == 实际应用示例 == 以下是一个使用自动属性的完整类示例: <syntaxhighlight lang="csharp"> public class Product { // 自动属性 public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int Stock { get; private set; } // 只能在类内部修改 public DateTime LastUpdated { get; } = DateTime.Now; // 只读,初始化后不可修改 // 方法 public void ReduceStock(int quantity) { if (quantity <= Stock) Stock -= quantity; } public override string ToString() => $"{Id}: {Name} - ${Price} (Stock: {Stock})"; } // 使用示例 var product = new Product { Id = 1, Name = "Laptop", Price = 999.99m, // Stock = 10 // 编译错误,因为set是private的 }; product.ReduceStock(5); Console.WriteLine(product); </syntaxhighlight> 输出: <pre> 1: Laptop - $999.99 (Stock: 5) </pre> == 编译器行为 == 编译器处理自动属性时会: 1. 自动生成一个私有后备字段 2. 为属性生成get和set方法 3. 为字段和方法添加适当的元数据 可以使用反射查看这些生成的成员: <syntaxhighlight lang="csharp"> var props = typeof(Product).GetProperties( BindingFlags.Instance | BindingFlags.Public); foreach (var prop in props) { Console.WriteLine($"{prop.Name}: {prop.PropertyType.Name}"); Console.WriteLine($" Can read: {prop.CanRead}"); Console.WriteLine($" Can write: {prop.CanWrite}"); } </syntaxhighlight> == 性能考虑 == 自动属性的性能与传统属性相同,因为: * 访问自动属性与访问字段一样快 * JIT编译器通常会内联简单的get/set方法 * 没有额外的内存开销 == 限制 == 自动属性不适合以下情况: 1. 需要在get或set中添加逻辑 2. 需要实现自定义验证 3. 需要触发事件 4. 需要与旧代码交互操作 在这些情况下,应该使用传统属性。 == 最佳实践 == 1. 优先使用自动属性,除非需要特殊逻辑 2. 对于不可变数据,使用只读自动属性 3. 考虑使用初始化器简化代码 4. 合理设置访问修饰符以控制封装性 5. 在团队项目中保持一致的属性风格 == 高级主题 == === 序列化 === 自动属性与序列化完全兼容: <syntaxhighlight lang="csharp"> [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } </syntaxhighlight> === 接口实现 === 自动属性可以用于实现接口属性: <syntaxhighlight lang="csharp"> public interface IEntity { int Id { get; set; } } public class Product : IEntity { public int Id { get; set; } // 实现IEntity.Id } </syntaxhighlight> === 表达式体属性 === C# 7.0允许更简洁的属性定义: <syntaxhighlight lang="csharp"> private string _firstName; private string _lastName; // 表达式体属性 public string FullName => $"{_firstName} {_lastName}"; public string FullName2 { get => $"{_firstName} {_lastName}"; set => (_firstName, _lastName) = value.Split(' '); } </syntaxhighlight> == 总结 == C#自动属性是简化属性声明的强大功能,它: * 减少样板代码 * 提高代码可读性 * 保持与传统属性相同的性能 * 支持各种访问控制模式 * 可以与现代C#功能(如初始化器、只读属性)结合使用 对于大多数简单属性场景,自动属性是最佳选择。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 属性与事件]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)