C#字段和属性的区别

本文介绍了C#中的属性概念,包括如何使用属性来替代字段以实现更灵活的数据访问控制。通过实例展示了属性如何进行读写操作、值的有效性检查以及状态更新。

在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

程序代码 程序代码
//私有字段
private int _a;
private bool _b;
private int _c;
private int _d;

//属性:

//可读写
public int a
{
    set { _a = value; }
    get { return _a; }
}
//只读
public bool b
{
    get { return _b; }
}
//可检测赋值是否正确
public int c
{
    set
    {
        if (value >= 1 && value <= 10)
            _c = value;
        else
            throw new Exception("c的赋值范围[1,10]");
    }
}
//赋值时更改其他状态
public int d
{
    set
    {
        _d = value;
        _b = true;//改变了_b的值
    }
    get { return _d; }
}

从例子中可看到属性其实就是对私有字段的读取和写入,以便做些公有字段无法完成的任务,他的使用方式和公有字段完全一样,所以可以理解成属性是为了满足对公有字段的特殊需求而产生的附属品。因而当我们选择使用属性还是使用字段时,主要看需求,如果不需设置访问权限、不需在赋值时检测值是否满足要求、不需要在赋值时修改对象其他一些状态等特殊的需求时,使用公有字段即可,否则就使用属性。

### 字段属性区别 #### 定义与用途 字段是类或结构体中用于存储数据的成员变量,通常被声明为 `private` 或 `protected` 以限制外部直接访问。字段主要用于内部状态的维护,并不提供对数据访问的额外控制[^3]。 属性则是类或结构体的成员,提供了一种控制对字段访问的方式。通过 `get` `set` 访问器,属性允许在读取写入数据时执行额外逻辑,例如数据验证、触发事件等。这使得属性不仅能够封装字段,还能增强数据的安全性灵活性[^2]。 #### 封装性 字段通常用于类内部的数据存储,而属性提供了一种机制来控制这些字段的访问,从而实现更好的封装。即使是最简单的数据存取操作,推荐使用自动属性(auto-implemented properties)而非公共字段,因为这样可以提高代码的可维护性安全性[^4]。 ```csharp public class Person { // 字段 private string _name; // 属性 public string Name { get { return _name; } set { _name = value; } } } ``` #### 控制逻辑 通过属性的 `get` `set` 访问器,可以在读写数据时添加特定的逻辑,比如验证输入数据或修改其他字段的值。相比之下,字段并不具备这种控制机制,任何对字段的操作都是直接且无条件的[^5]。 ```csharp public class Person { private string name; private int age; public string Name { get { return name; } set { if (string.IsNullOrEmpty(value)) throw new ArgumentException("Name cannot be null or empty."); name = value; } } public int Age { get { return age; } set { if (value < 0) throw new ArgumentException("Age cannot be negative."); age = value; } } } ``` #### 数据绑定支持 在某些情况下,如数据绑定方面,通常需要使用属性而不是字段,因为许多框架库是通过属性进行数据绑定的。这意味着如果希望某个类支持数据绑定,则必须将相关成员定义为属性形式。 #### 设计原则 按照 C# 的设计原则,公共数据成员应该被声明为属性而不是公共字段。即使是简单的数据存取操作,也建议使用自动属性来提供更好的封装效果。这样做有助于保持良好的编程实践,并确保未来的扩展性兼容性[^4]。 ```csharp // 自动实现的属性示例 public class Person { public string Name { get; set; } public int Age { get; set; } } ``` #### 使用方式 当创建一个对象并对其进行初始化时,可以通过属性来进行赋值获取值的操作。由于属性提供了额外的安全检查功能,因此它们比直接操作字段更加安全可靠[^1]。 ```csharp internal class Program { static void Main(string[] args) { People people = new People(); // 对私有字段赋值,就是调用属性Age的set方法 people.Age = 20; // 对私有字段取值,就是调用属性Age的get方法 Console.WriteLine(people.Age); } } internal class People { private int _age; public int Age { get { return _age; } set { _age = value; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值