专业的编程技术博客社区

网站首页 > 博客文章 正文

一篇文章搞懂C#中的属性(属性 c#)

baijin 2024-10-15 08:30:15 博客文章 7 ℃ 0 评论

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; }
}

类型

描述

读写属性

包含 getset 访问器

只读属性

仅包含 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. 对称访问器和非对称访问器?

类型

描述

对称访问器

指属性的 getset 访问器具有相同的访问修饰符

非对称访问器

指属性的 getset 访问器具有不同的访问修饰符


对称访问器示例:

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 事件,从而允许我们执行额外的业务逻辑。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表