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

Age属性未生效:输入16未返回预期的Invalid Age结果

问题:Age属性校验逻辑未生效

当前程序输出Age :: 16,但按照属性的校验规则,输入16应该输出Age :: Invalid Age。核心问题是构造函数直接给字段赋值,完全跳过了属性的校验逻辑。

原始代码

Main.cs

//File Main.cs

using BasicClasses;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Profile p = new Profile("16");
            p.PrintProfile();
        }
    }
}

Profile.cs

//File Profile.cs

namespace BasicClasses
{
    class Profile
    {
        //Fields
        public string age;

        //Constructors
        public Profile(string age)
        {
            this.age = age;
        }

        //Properties
        private string Age
        {
            get { return this.age; }
            set 
            {
                if (value.Length > 0)
                {
                    if (Int32.Parse(value) >= 18)
                    { Age = value; }
                    else
                    { Age = "Invalid Age"; }
                }
                else
                { Age = "Not Defined"; }
            }
        }

        //Methods
        public void PrintProfile()
        {
            Console.WriteLine($"Age :: {Age}");
        }
    }
}

实际输出

Age :: 16

问题分析

  • 构造函数绕开属性校验:你在构造函数里直接给public字段age赋值,根本没调用Age属性的setter方法,所以校验逻辑从头到尾没执行过。
  • 属性setter藏着递归陷阱:原代码里Age = value会反复调用自身的setter,运行时会直接抛出StackOverflowException,这是个隐藏bug。
  • 字段权限设计不合理:把age设为public,意味着任何地方都能直接修改字段,完全违背了用属性做校验的初衷。

修复方案

修改Profile.cs,做以下3处调整:

  1. 把字段age改成私有,禁止直接访问;
  2. 构造函数里赋值给Age属性,触发校验逻辑;
  3. 修正属性setter的递归问题,直接给私有字段赋值。

修改后的Profile.cs

//File Profile.cs

namespace BasicClasses
{
    class Profile
    {
        //Fields:改为私有,仅通过属性操作
        private string age;

        //Constructors:赋值给属性,触发校验
        public Profile(string age)
        {
            Age = age;
        }

        //Properties:修正递归,直接操作私有字段
        private string Age
        {
            get { return this.age; }
            set 
            {
                if (value.Length > 0)
                {
                    if (int.Parse(value) >= 18)
                    { 
                        this.age = value; 
                    }
                    else
                    { 
                        this.age = "Invalid Age"; 
                    }
                }
                else
                { 
                    this.age = "Not Defined"; 
                }
            }
        }

        //Methods
        public void PrintProfile()
        {
            Console.WriteLine($"Age :: {Age}");
        }
    }
}

修正后输出

Age :: Invalid Age

额外优化建议

  • 可以把Age属性设为public,这样外部也能通过属性合法修改年龄,同时保留校验逻辑;
  • 解析字符串转整数时用int.TryParse,避免非法格式导致的异常:
    if (int.TryParse(value, out int parsedAge) && parsedAge >= 18)
    {
        this.age = value;
    }
    else
    {
        this.age = "Invalid Age";
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:01:45