跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 属性基础
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#属性基础 = == 介绍 == 在C#中,'''属性(Property)'''是一种特殊的类成员,它提供了一种灵活的方式来读取、写入或计算私有字段的值。属性是字段(field)的自然扩展,既保持了数据的封装性,又允许通过访问器(accessors)控制对数据的访问逻辑。 属性通常由以下部分组成: * 一个可选的访问修饰符(如 <code>public</code>, <code>private</code>) * 属性类型(如 <code>int</code>, <code>string</code>) * 属性名称 * <code>get</code> 访问器(用于读取值) * <code>set</code> 访问器(用于写入值) == 基本语法 == 属性的标准声明格式如下: <syntaxhighlight lang="csharp"> [access-modifier] [type] [property-name] { get { /* 返回属性值 */ } set { /* 设置属性值 */ } } </syntaxhighlight> === 示例1:简单属性 === <syntaxhighlight lang="csharp"> public class Person { private string _name; // 私有字段 // Name属性 public string Name { get { return _name; } set { _name = value; } // 'value'是隐式参数 } } </syntaxhighlight> == 属性类型 == === 1. 自动实现属性 === C# 3.0引入的简写语法,编译器会自动生成私有字段: <syntaxhighlight lang="csharp"> public class Product { public int Id { get; set; } // 自动属性 public decimal Price { get; set; } } </syntaxhighlight> === 2. 只读属性 === 只有get访问器的属性: <syntaxhighlight lang="csharp"> public class Circle { public double Radius { get; } = 5.0; // 初始化后不可修改 } </syntaxhighlight> === 3. 计算属性 === 基于其他值动态计算的属性: <syntaxhighlight lang="csharp"> public class Rectangle { public double Width { get; set; } public double Height { get; set; } public double Area { get { return Width * Height; } // 计算得出 } } </syntaxhighlight> == 访问器控制 == 可以通过访问修饰符对get/set分别控制: <syntaxhighlight lang="csharp"> public class BankAccount { public decimal Balance { get; private set; } // 外部只读 public void Deposit(decimal amount) { Balance += amount; // 类内部可修改 } } </syntaxhighlight> == 属性 vs 字段 == {| class="wikitable" |- ! 特性 !! 属性 !! 字段 |- | 数据绑定 | 支持 | 不支持 |- | 访问控制 | 可分别控制get/set | 统一访问级别 |- | 计算逻辑 | 可包含 | 不能包含 |- | 默认值 | 必须显式设置 | 有类型默认值 |} == 实际应用案例 == === 数据验证示例 === <syntaxhighlight lang="csharp"> public class Student { private int _age; public int Age { get => _age; set { if (value < 0 || value > 120) throw new ArgumentOutOfRangeException("年龄必须在0-120之间"); _age = value; } } } </syntaxhighlight> === INotifyPropertyChanged 实现 === 在WPF/MVVM中的典型应用: <syntaxhighlight lang="csharp"> public class ObservableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } public class User : ObservableObject { private string _username; public string Username { get => _username; set { _username = value; OnPropertyChanged(); // 通知UI更新 } } } </syntaxhighlight> == 高级主题 == === 索引器属性 === 允许类实例像数组一样被索引: <syntaxhighlight lang="csharp"> public class StringArray { private string[] _array = new string[10]; public string this[int index] { get => _array[index]; set => _array[index] = value; } } </syntaxhighlight> === 表达式体属性 === C# 6+支持的简写语法: <syntaxhighlight lang="csharp"> public class Point { public int X { get; set; } public int Y { get; set; } public string Coordinates => $"({X}, {Y})"; // 表达式体属性 } </syntaxhighlight> == 属性初始化顺序 == <mermaid> graph TD A[声明字段] --> B[字段初始化] B --> C[构造函数执行] C --> D[属性设置器调用] </mermaid> == 最佳实践 == 1. 对公有成员总是使用属性而非字段 2. 简单的get/set操作使用自动属性 3. 需要验证或计算时使用完整属性 4. 考虑对set访问器添加保护 5. 避免在属性getter中执行耗时操作 == 数学关系 == 属性可以看作是两个函数的组合: <math> P(x) = \begin{cases} f_{get}() & \text{当读取时} \\ f_{set}(x) & \text{当写入时} \end{cases} </math> 其中<math>f_{get}</math>和<math>f_{set}</math>分别对应get和set访问器的逻辑。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 属性与事件]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)