C#访问自定义类字段对应属性抛空异常,能否通过属性获取字段对象?
问题原因说明
你遇到的空引用异常是因为属性和你声明的私有字段没有建立关联,二者是完全独立的两个变量:
- C#中
public AAA A { set; get; }属于自动实现属性,编译器会自动为该属性生成一个隐藏的后台存储字段,和你手动声明的private AAA a = new AAA();没有任何关系。 - 你仅为手动声明的私有字段
a做了初始化,从未给自动属性A赋值,所以A的默认值就是null,执行b.A.a时访问空对象的成员自然会抛出空引用异常。 isNull()方法判断的是你手动声明的私有字段a,这个字段确实已经初始化不为空,所以返回false,和属性A的值互不影响。
修复方案
方案1:手动实现属性访问器,绑定自定义私有字段
如果需要保留单独的私有字段a,手动实现属性的get/set访问器关联到该字段即可:
class BBB { private AAA a = new AAA(); // 手动实现访问器,所有对A的操作都会映射到私有字段a public AAA A { get { return a; } set { a = value; } } public bool isNull() { return a == null; } }
方案2:直接给自动属性设置初始值(无需额外私有字段)
如果没有单独维护私有字段的需求,可以直接给自动属性赋初始值,简化代码:
class BBB { // 直接初始化自动属性,编译器生成的后台字段会被赋值为新的AAA实例 public AAA A { set; get; } = new AAA(); public bool isNull() { return A == null; } }
两种修改方式执行后,b.A.a = 3都不会再触发空引用异常。
补充说明
C#完全支持通过属性获取对应字段的对象引用,只要保证属性的访问器正确绑定到目标字段即可。
内容的提问来源于stack exchange,提问作者Gaoxiang Liu
相关产品推荐
相关产品推荐

