C# 在C中的自定义类中使用方法时遇到问题#

C# 在C中的自定义类中使用方法时遇到问题#,c#,class,methods,C#,Class,Methods,我已经创建了一个名为“Person”的类,我正在尝试编写一个名为Birthday的方法,该方法将属性“Age”增加1。我知道尝试使用Age定义变量是愚蠢的,但我不知道如何将一个变量从Main传递到Person.birth。我也可能不需要while循环,但我只是尝试了很多东西。无论如何,我们都会感激你的帮助 class Program { static void Main(string[] args) { Person p1 = new Person();

我已经创建了一个名为“Person”的类,我正在尝试编写一个名为Birthday的方法,该方法将属性“Age”增加1。我知道尝试使用Age定义变量是愚蠢的,但我不知道如何将一个变量从Main传递到Person.birth。我也可能不需要while循环,但我只是尝试了很多东西。无论如何,我们都会感激你的帮助

class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person();
        p1.Name = "Frank";
        p1.Age = 30;
        p1.Gender = "Male";
        p1.Birthday();

        Console.WriteLine(p1.Age);
        Console.ReadLine();
    }

class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }

    public int Birthday()
    {
        int newAge = Age;

        while (Age > 0)
        {
            newAge += 1;
            break;
        }

        return newAge;
    }
}

您正在执行的代码和计算没有意义,但更大的问题是您不应该存储计算字段。而是存储出生日期并计算年龄。有关如何计算,请参见

public class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public DateTime BirthDate { get; set; }


    public int Age 
    { get { 
        // copied from https://stackoverflow.com/a/1404/1260204
        var today = DateTime.Today;
        var age = today.Year - BirthDate.Year;
        if (birthdate > today.AddYears(-age)) {
            age--;
        }
        return age;
    }}
}
调用方法

static void Main(string[] args)
{
    Person p1 = new Person();
    p1.Name = "Frank";
    p1.Age = 30;
    p1.Gender = "Male";
    p1.BirthDate = new DateTime(1986, 5, 12);

    Console.WriteLine(p1.Age);
    Console.ReadLine();
}

您的代码有几个问题

首先,你不应该存储一个人的“年龄”,你应该存储他们的出生日期,这样你就可以随时计算年龄

public DateTime BirthDate { get; set; }
第二;考虑一个人的创造。在代码中创建一个新的人,然后指定他们的
姓名
性别
出生日期
属性。这真的是最好的方法吗?一个人必须有名字、性别和出生日期,对吗?此外,这些属性不会改变(或者至少它们不应该轻易改变)。因此,让您的
Person
类有一个接受这些参数的构造函数,然后将这些属性的设置设置为private:

public string Name { get; private set; }
public string Gender { get; private set; }
public DateTime BirthDate { get; private set; }

public Person(string name, string gender, DateTime birthDate)
{
    Name = name;
    Gender = gender;
    BirthDate = birthDate;
}
然后,要计算某人的年龄,只需比较
GetCurrentAge()
方法中的日期,然后可以使用现有的
Age
属性,但只需从
GetCurrentAge()返回值即可使其成为“只读”:


要将
Age
增加1,请执行以下操作:将
Age
增加1。你这样做:
Age=Age+1
或更短的形式:
Age++。除了return语句,这就是整个方法。不要在类中存储计算数据,如
Age
;存储不可变的数据,如
生日
,并仅在必要时计算年龄。您只需创建
生日
的getter属性
public int birth{get{return age++;}}
否,鉴于其功能的当前含义,生日不应是属性。这个名字有问题,但是把它变成一个财产是自找麻烦的。如果你可以存储出生日期,那么这可能会更好,因为这样您就可以在任何日期计算年龄,而不必依赖于在每年的正确日期调用方法。设计意见:最好将年龄计算转化为一个方法,传入您想要计算年龄的日期,并使年龄属性使用此方法,传递
DateTime.Today
,比如
public-int-AgeToday=>AgeOn(DateTime.Today)
另外,您在比较行中用小写字母
b
d
拼写了“生日”。感谢您(和其他所有人)的帮助!我一直在浏览微软网站上的C#教程,你的建议对我帮助很大。编辑:虽然,老实说,我仍然不太确定构造函数是什么或做什么,或者私有与非私有设置的意义是什么。
public int Age => GetCurrentAge();

private int GetCurrentAge()
{
    DateTime today = DateTime.Today;
    int age = today.Year - BirthDate.Year;
    if (BirthDate > today.AddYears(-age)) 
    {
        age--;
    }
    return age;
}