如何解决下面的 C# 代码中属性 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) 的布尔值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。