理解C#类中的字段与属性

1. 总结

如果没有使用以下属性的三大特点,可以简单理解属性和字段的功能一致。

数据封装: 可以在访问或修改数据时插入逻辑。

只读或只写属性: 可以通过只实现 get 或 set 访问器来创建只读或只写属性。

增强可维护性: 属性可以在不改变类的接口情况下修改内部实现。
具体例子请看标题3

2. 从一个问题开始

我不理解属性的概念,带上{ get;set; }就是属性吗,我看无论是取值还是修改,下面两个的功能都是一样的。

namespace Test
{
    public class Test
    {
        public bool HaveProperty1 { get;set; }
        public bool HaveProperty2;
    }

    public class Test2
    {
        public static void Main(string[] args)
        {
            var haveProperty1 = new Test().HaveProperty1;
            var haveProperty2 = new Test().HaveProperty2;
        }
    }
}

3. 从一个回答结束

带有 get/set 的成员就是属性。

如果不利用属性的三个好处(数据封装、只读或只写属性、增强的可维护性),在基本的使用场景下,public string Name { get; set; } 和 public string Name; 看起来效果是一样的,因为它们都能公开一个字符串成员并允许读取和写入。

3.1 数据封装:

数据封装: 属性提供了对字段的封装,可以在访问或修改数据时插入逻辑。

public class Person
{
    private string name; // 私有字段

    public string Name // 属性
    {
        get { return name; } // 获取name的值
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                name = value; // 设置name的值并进行验证
            }
            else
            {
                throw new ArgumentException("Name cannot be null or empty");
            }
        }
    }
}

// 使用属性
var person = new Person();
person.Name = "Alice"; // 合法
// person.Name = ""; // 会抛出异常

3.2 读写属性

只读或只写属性: 可以通过只实现 get 或 set 访问器来创建只读或只写属性。

public class Person
{
    private string name; // 私有字段

    public string Name // 只读属性
    {
        get { return name; }
    }

    public Person(string name)
    {
        this.name = name;
    }
}

// 使用只读属性
var person = new Person("Alice");
// person.Name = "Bob"; // 编译错误,无法设置只读属性

3.3 维护性

增强的可维护性: 属性可以在不改变类的接口情况下修改内部实现。

public class Person
{
    private string name; // 私有字段

    public string Name // 属性
    {
        get { return name; }
        set { name = value; }
    }
}

// 以后可以轻松添加逻辑,而不改变类的接口
public class Person
{
    private string name; // 私有字段

    public string Name // 属性
    {
        get { return name; }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                name = value;
            }
            else
            {
                throw new ArgumentException("Name cannot be null or empty");
            }
        }
    }
}
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值