C#调用属性Set方法后对应字段是否更新?类内部应使用属性还是字段?
C# 属性相关问题解答
为什么调用属性Set方法后,你声明的_data、_next字段没有同步更新?
核心原因是你代码里的Data和Next是自动实现属性,C#编译器会为这类属性自动生成一个不可见的匿名后台存储字段,你手动声明的private T _data、private Node<T> _next和这两个属性没有任何绑定关系,所以给属性赋值的时候,你手动写的这两个字段自然不会更新,你观察到的调试现象是完全正常的。
如果需要让属性和你手动声明的字段关联,需要把自动属性改成自定义实现的属性:
// 绑定自定义后台字段的属性写法 public T Data { get => _data; set => _data = value; } public Node<T> Next { get => _next; set => _next = value; }
改成上述写法后,再给Data赋值时_data就会同步更新。如果你坚持用自动属性,完全可以删掉你手动声明的_data和_next字段,这两个属于冗余代码,没有任何作用。
构造函数里的写法疑问
你构造函数里的this.可以省略,只要当前作用域没有和属性同名的局部变量、参数,就不需要加this.区分。
如果你用的是自动属性,只能给属性赋值,不要碰你自己写的_data、_next;如果是自定义实现的属性,给属性赋值或者直接给后台字段赋值都可以生效。
同一个类内部访问成员,应该用属性还是字段?
两种方案的选择逻辑很清晰:
- 优先选属性:只要属性的get/set里有额外逻辑(比如值校验、属性变更通知、懒加载、计数统计等),不管是类内部还是外部访问,都必须走属性,否则会漏掉这些逻辑导致bug。
- 可选直接访问字段的场景:确认属性没有任何额外逻辑,就是简单的读写字段,且需要规避属性访问的极微小编译开销(这种场景极少,99%的业务开发不需要考虑性能差异)。
- 通用最佳实践:如果用自动属性,就不要手动声明后台字段,所有场景都直接访问属性;如果用自定义后台字段,只在属性的get/set方法里直接访问字段,其他所有场景都走属性访问,避免后续给属性加逻辑时出现遗漏。

内容的提问来源于stack exchange,提问作者androidvango
相关产品推荐
相关产品推荐

