网站首页 > 博客文章 正文
1.1.1. 为什么我们需要属性?
在 C# 中,属性(Properties)是一种可以用来保护和管理类内部数据的机制。通过使用 get 和 set 方法,我们可以在读取和写入数据时添加额外的逻辑。这使得我们可以更好地控制数据的访问和修改,从而提高代码的安全性和灵活性。属性允许我们在不直接暴露类的内部数据的情况下,让外部代码安全地访问和修改这些数据。
假设一个类就像一个房子,这个房子里面有一些钱。属性就像是房子的门。通过这扇门,你可以拿到钱(读取数据),也可以放钱进去(写入数据)。get 方法 就像是透过门的窗户看里面有多少钱。set 方法就像是通过门把钱放进去。
在门上你可以装一个密码锁(自定义逻辑),只有输入正确的密码才能打开门(访问或修改数据)。这就确保了只有符合条件的人才能看到或改变房子里面的钱(数据)。
1.1.2. 什么是的属性?
C# 中的属性是类、结构或接口的成员,用于提供对私有字段的受控访问。属性类似于字段,但它们是通过 get 和 set 访问器定义的。属性可以包括额外的逻辑来控制数据的读取和写入,而不仅仅是简单的存取。
1.1.3. 访问器是什么?
访问器是属性的一部分,用于定义对属性值的访问和修改。C# 中有两种访问器:get 访问器和 set 访问器。get 访问器用于返回属性的值,set 访问器用于设置属性的值。
1.1.4. 什么是 Set 访问器?
set 访问器用于分配属性的值。它包含在属性定义中,并定义如何设置私有字段的值。set 访问器可以包含逻辑以验证新值或触发其他操作。value 关键字在 set 访问器中表示正在分配给属性的值。
private int _age;
public int Age
{
get { return _age; }
set
{
if (value >= 0)
{
_age = value;
}
else
{
throw new ArgumentException("Age cannot be negative");
}
}
}
1.1.5. 什么是get访问器?
get 访问器用于返回属性的值。它包含在属性定义中,并定义如何获取私有字段的值。get 访问器通常用于返回存储在私有字段中的值。
private int _age;
?
public int Age
{
get { return _age; }
}
类型 | 描述 |
读写属性 | 包含 get 和 set 访问器 |
只读属性 | 仅包含 get 访问器 |
只写属性 | 仅包含 set 访问器(非常少见) |
自动属性 | 不需要显式定义私有字段,编译器自动生成 |
1.1.6. 什么是只读属性?
只读属性只有 get 访问器,没有 set 访问器。它们通常用于返回在构造函数或初始化过程中设置的值,并且在类的生命周期内不会更改。
public class Student
{
private int _id;
private string _name;
?
public int Id
{
get { return _id; }
}
?
public string Name
{
get { return _name; }
}
?
public Student(int id, string name)
{
_id = id;
_name = name;
}
}
1.1.7. 什么是“只写”属性?
只写属性只有 set 访问器,没有 get 访问器。它们很少使用,通常用于需要外部设置值但不允许外部读取值的情况。
private string _password;
?
public string Password
{
set { _password = value; }
}
1.1.8. 什么是 Read Write 属性?
读写属性包含 get 和 set 访问器,允许对属性的值进行读取和写入。
ublic class Student
{
private int _id;
private string _name;
?
public int Id
{
get { return _id; }
set { _id = value; }
}
?
public string Name
{
get { return _name; }
set { _name = value; }
}
}
1.1.9. 访问器的默认辅助功能修饰符
C# 中访问器的默认访问修饰符与属性相同。例如,如果属性是 public 的,那么 get 和 set 访问器也是 public 的。如果需要,可以单独为 get 或 set 访问器指定不同的访问修饰符。
public class Student
{
public int Id { get; private set; }
public string Name { get; private set; }
?
public Student(int id, string name)
{
Id = id;
Name = name;
}
}
在上述示例中,Id 和 Name 属性的 set 访问器是 private,因此它们只能在类的内部设置。
1.1.10. 对称访问器和非对称访问器?
类型 | 描述 |
对称访问器 | 指属性的 get 和 set 访问器具有相同的访问修饰符 |
非对称访问器 | 指属性的 get 和 set 访问器具有不同的访问修饰符 |
对称访问器示例:
public int Id { get; set; }
非对称访问器示例:
public int Id { get; private set; }
1.1.11. 什么是自动实现属性?
自动实现属性(Auto-Implemented Properties)允许在不显式定义私有字段的情况下声明属性。编译器会自动生成一个私有的匿名字段来存储属性的值。自动属性简化了属性的声明,使代码更加简洁。
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
1.1.12. 属性有哪些优点?
优点 | 描述 |
数据保护 | 通过封装私有字段,防止外部直接访问和修改,提高数据安全性 |
数据验证 | 在设置属性值之前进行验证,确保数据的完整性和有效性 |
代码简化 | 使用自动属性减少代码量,提高代码可读性和可维护性 |
事件触发 | 在属性值变化时触发事件,适用于数据绑定和通知机制 |
1.1.13. 应用示例
假设我们有一个用户管理系统,需要管理用户的年龄并确保年龄值在合理范围内,同时在年龄变化时进行一些业务逻辑处理。
public class User
{
private int _age;
?
public int Age
{
get { return _age; }
set
{
if (value < 0 || value > 120)
{
throw new ArgumentOutOfRangeException("Age must be between 0 and 120.");
}
_age = value;
OnAgeChanged();
}
}
?
public event Action AgeChanged;
?
protected virtual void OnAgeChanged()
{
AgeChanged?.Invoke();
}
}
?
class Program
{
static void Main(string[] args)
{
User user = new User();
user.AgeChanged += () => Console.WriteLine("User's age has changed!");
user.Age = 30; // This will trigger the AgeChanged event
}
}
在这个例子中,我们使用属性来管理用户的年龄,并确保年龄值在合理范围内。当年龄发生变化时,会触发 AgeChanged 事件,从而允许我们执行额外的业务逻辑。
猜你喜欢
- 2024-10-15 Python 速度慢,试试这个方法提高 1000 倍
- 2024-10-15 C# 文件操作浅析(c#代码文件)
- 2024-10-15 从零开始自学C#基础的第十五天——数组的基本用法
- 2024-10-15 浅谈C#取消令牌CancellationTokenSource
- 2024-10-15 总结了才知道,原来channel有这么多用法
- 2024-10-15 面向对象(8-15)异常类-C#编程零基础到入门学习
- 2024-10-15 .NET 6 中 LINQ 的改进(.net 调优)
- 2024-10-15 Log4net配置文件 C#(c# log4j)
- 2024-10-15 C# BIN文件读取以及CRC校验(匹配STM32F103)
- 2024-10-15 C#如何对String中的Contact/Join方法进行优化的
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)