You need to enable JavaScript to run this app. C#类属性set方法null报错、赋值校验失效求修复
优惠活动
大模型
产品
解决方案
定价
更多

C#类属性set方法null报错、赋值校验失效求修复

两类错误的核心根因
  • 错误1(运行时第14行提示name为null):
    Name属性的set访问器校验逻辑对象错位。代码判断长度时取的是私有字段name本身的属性,而非待赋值的value。C#中string类型私有字段的默认值为null,第一次给Name赋值时,代码会直接访问null对象的Length属性,必然触发空引用异常。即便字段非空,该判断也是拿旧值的长度当校验依据,完全没有校验即将存入的新值长度,逻辑从根源上不成立。
  • 错误2(范围外的成绩仍被正常存储):
    Grade1、Grade2属性的set访问器存在和Name完全一致的逻辑错位:校验范围时取的是私有字段grade1、grade2的当前值,而非待赋值的value。int类型私有字段的默认值为0,本身就在0-100的合法区间内,因此无论传入的成绩是-30还是150,判断条件拿默认值0做参照永远满足要求,会直接把非法值存入字段,根本不会触发错误提示。
修复方案
  • 修正Name属性的set校验逻辑:优先判断传入的value是否为空白值,避免空引用,同时用value的长度做合法性校验,替换原有对旧字段name的长度判断。
  • 修正Grade1、Grade2属性的set校验逻辑:将判断条件中的旧字段grade1、grade2全部替换为传入的value,真正校验新传入数值的合法范围。
  • 修正Average属性的整数截断问题:原代码两个int值相加后除以整数2,会直接丢失小数精度,改为除以2.0触发浮点除法即可。

修正后的核心属性代码参考:

// 修正后的Name属性
public string Name
{
    get => name;
    set
    {
        if (!string.IsNullOrWhiteSpace(value) && value.Length <= 15)
        {
            name = value;
        }
        else
        {
            Console.WriteLine("姓名长度不能超过15字符,请检查输入");
        }
    }
}

// 修正后的Grade1属性,Grade2的逻辑完全一致
public int Grade1
{
    get => grade1;
    set
    {
        if (value is >= 0 and <= 100)
        {
            grade1 = value;
        }
        else
        {
            Console.WriteLine("成绩必须在0-100范围内,请检查输入");
        }
    }
}

// 修正后的Average属性
public double Average
{
    get => (grade1 + grade2) / 2.0;
}

内容的提问来源于stack exchange,提问作者john555

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 05:15:09