1

使用递归方法调用时出现问题。
我知道这里的问题setInfo(ref name, ref age, ref address, ref country);,但我不知道如何解决它。

class person{
        private string name;
        private short age;
        private string address;
        private string country;

        public person(){
            Console.Write("Hi i'm constructor \n\n");
        }

        public void setInfo(ref string name, ref short age, ref string address, ref string country){
            if (name != "" || address != "" || country != "" || age != 0) {
                this.name = name;
                this.age = age;
                this.address = address;
                this.country = country;
            } else {
                setInfo(ref name, ref age, ref address, ref country); // Here is what I doubt.
            }
        }

        public void getInfo(){
            Console.Clear();
            Console.WriteLine("---- The information ----\nName: {0}\nAge: {1}\nAddress: {2}\nCountry: {3}", this.name, this.age, this.address, this.country);
        }

    }


// When usage


static void Main(string[] args){
            string name, address, country;
            short age; 

            person one = new person();

            Console.Write("Name: ");
            name = Console.ReadLine();

            Console.Write("Age: ");
            Int16.TryParse(Console.ReadLine(), out age);

            Console.Write("Address: ");
            address = Console.ReadLine();

            Console.Write("Country: ");
            country = Console.ReadLine();

            one.setInfo(ref name, ref age, ref address, ref country);
            one.getInfo();
        }
4

2 回答 2

1

检查值是否为“” ,setInfo如果是,则再次调用该方法而不进行任何更改。

在这种情况下,您setInfo一遍又一遍地调用,直到堆栈已满,然后抛出异常

如果你要打电话setInfo,你需要改变价值观......否则你只是陷入无限调用setInfo

例如,可能给出默认值:

    public void setInfo(ref string name, ref short age, ref string address, ref string country){
            this.name    = name.Equals("")    == false? name : "abe";
            this.address = address.Equals("") == false ? address : "hevean";
            this.country = country.Equals("") == false ? country : "USA";
            this.age     = age > 0 ? age : 18;
    }
于 2013-09-17T11:52:30.823 回答
0

根据您的代码,您不想在那里进行递归。

您会出现堆栈溢出,因为您在不更改任何数据的情况下进行了递归调用,这首先导致了递归调用。您需要允许此人重新输入丢失的数据。那有意义吗?

尝试使用 do/while 循环包装您的输入。这有效:

    static void Main(string[] args)
    {
        string name, address, country;
        short age;

        person one = new person();

        do
        {
            Console.Write("Name: ");
            name = Console.ReadLine();

            Console.Write("Age: ");
            Int16.TryParse(Console.ReadLine(), out age);

            Console.Write("Address: ");
            address = Console.ReadLine();

            Console.Write("Country: ");
            country = Console.ReadLine();
        } while (name == "" || address == "" || country == "" || age < 1);

        one.setInfo(ref name, ref age, ref address, ref country);
        one.getInfo();

        Console.ReadKey();
    }

几点:

1)您可能想要摆脱 ref,因为您没有更改 setInfo 中的任何数据。您使用 ref 的唯一原因是将更改的值返回给调用者。

2)您可能应该创建一个构造函数,该构造函数接受所有四个值并在收集数据后构造您的人。

希望有帮助。干杯。

于 2013-09-17T12:06:09.460 回答