You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:54:05