下面的 C# 代码中属性 Adult 的堆栈溢出异常

问题描述

代码用于接收用户的输入,例如姓名和出生日期,并返回姓名和年龄以及是否为儿童的详细信息

除了 Adult 属性之外,其余代码都可以正常工作

using System;
using System.IO;

public class Person
{
    //Fill code here
    private string firstName;
    private string lastName;
    private DateTime dob;
    //private string adult;

    public string FirstName
    {
        set { firstName = value; }
        get { return firstName; }
    }

    public string LastName
    {
        set { lastName = value; }
        get { return lastName; }
    }

    public DateTime dob
    {
        set { dob = value; }
        get { return dob; }
    }
}

在下面的属性中,它必须检查年龄,如果年龄大于或等于 18 岁,则返回“成人”,否则返回“儿童”。

根据问题,我不能为此声明该字段。

public string Adult
{
    get
    {
        return Adult;
        throw (stackoverflow)
    }
    set
    {
        if (GetAge(dob) >= 18)
        {
            Adult = "Adult";
        }
        else
        {
            Adult = "Child";
        }
    }
}

帮助我进行上述属性所需的更正,使其不抛出任何异常以及抛出异常的原因

public void displayDetails()
{
    Console.WriteLine("First Name: {0}",firstName);
    Console.WriteLine("Last Name: {0}",lastName);
    int age = GetAge(dob);
    Console.WriteLine("Age: {0}",age);
    Console.WriteLine(Adult);
    }
    
    public int GetAge(DateTime dob)
    {
        int age = 0;
        age = DateTime.Now.Year - dob.Year;
        return age;    
    }
}

public class Program
{
    public static void Main(String[] args)
    {
        //Fill code here
        Person p = new Person();
        Console.WriteLine("Enter first name");
        p.FirstName = Console.ReadLine();
        Console.WriteLine("Enter last name");
        p.LastName = Console.ReadLine();
        Console.WriteLine("Enter date of birth in yyyy/mm/dd/ format");
        p.dob = Convert.ToDateTime(Console.ReadLine());
        
        p.displayDetails();
    }
}

解决方法

您有一个 Adult 属性,在该属性中您手动定义了 getter 和 setter,但它们都使用完全相同的属性,而不是像您在其他属性中那样使用字段。

请注意,您的其他属性中使用的字段名称为小写,而属性以大写字母开头(这意味着它们是单独的实体)。

所以您确实像这样声明了成人,但已将其注释掉:

//private string adult;

所以你需要先取消注释,然后在你的 getter & setter 中使用它。

public string Adult
    {
        get
        {
            return adult;
        }  
        set
        {
            if (GetAge(dob) >= 18)
            {
                adult = "Adult";
            }
            else
            {
                adult = "Child";
            }
        }
    }

但这也没有意义,因为您的 setter 没有使用您传递给它的值!因此,虽然这可能有效,但这并不是真正的最佳方法。如果每次都是成人或儿童,只需使用 Getter 返回即可。

 public string Adult
  {
        get
        {
            if (GetAge(dob) >= 18)
                     return "Adult";
            else
                return "Child";
        }
}

(您还应该包括处理 dob 值无效的情况(例如默认值)

顺便说一句:最好使用 Enum 而不是字符串,或者只是一个指示它是成人 (true) 还是儿童 (false) 的布尔值。