方法调用导致的堆栈溢出错误

时间:2015-11-06 14:12:22

标签: c# stack-overflow

我正在尝试修复此错误,以便我可以在我的内部声明的列表“school”中的4个实例中启动我的程序。然后我想让用户按照自己的意愿操作列表。一切都在工作,直到我添加方法“Myfour”。如何调用它以便不存在堆栈溢出错误?我是编程和C#的新手,需要今天完成。

主要:

using System;

namespace Lab4
{
    class MainClass
    {
        public static void Main (string[] args)
        {

            Console.WriteLine ("Welcome to the Course Monitoring System v1.0");
            Course myCourse = new Course();
            myCourse.Myfour ();
            myCourse.Print ();
            Course.Menu();
            myCourse.Print ();
            myCourse.Choice();
        }
    }
}

课程类:

using System;
using System.Collections.Generic;

namespace Lab4
{
    public class Course
    {
        private string courseNumber;
        private string courseName;
        private int courseHours;
        public List<Course> school = new List<Course> ();
        private int howmany=0;
        private int totalcourse=0;

        //This section is for returning and adjusting values of private data through the main program.
        public string cn{
            get {return courseNumber; }
            set {if (value != null)
                cn = value;
            }
        }
        public string name{
            get{ return courseName; }
            set{if (value!="")
                name=courseName;
            }
        }
        public int hours{
            get {return courseHours; }
            set {if (value != 0)
                hours = value;
            }
        }

        public Course()
        {
        }
        public Course (string name, string cn, int hours)
        {
            courseNumber = cn;
            courseName = name;
            courseHours = hours;
        }

        //This portion of code overrides the string and allows it to output the information held within the constructor.
        public override string ToString ()
        {
            return courseNumber+" " + courseName + " " +" It is a " + courseHours + " hour course.";
        }
        //The menu application for my program
        public static void Menu()
        {
            Console.WriteLine ("Please choose from one of the following options: ");
            Console.WriteLine ("......................................................................");
            Console.WriteLine ("1.)Start a new Course List.");
            Console.WriteLine ("2.)Delete Course from Current List.");
            Console.WriteLine ("3.)Print Current Course List.");
            Console.WriteLine ("4.)Add Course to Current List.");
            Console.WriteLine ("5.)Shutdown Program");
        }
        //This is the controller for the menu. It allows for functionality to control the tasks requested by the user.
        public void Choice()
        {
            int selection=int.Parse(Console.ReadLine());
            while (selection >5 || selection < 1) {
                Console.WriteLine ("Choice invalid. Please choose between 1 and 5.");
                selection = int.Parse (Console.ReadLine ());
            }
            if (selection == 4) {
                Add ();
                Menu ();
                Choice ();
                Console.WriteLine ();
            }
            if (selection == 2) {
                Delete ();
                Menu ();
                Choice ();
                Console.WriteLine ();
            }
            if (selection == 3) {
                Print ();
                Menu ();
                Choice ();
                Console.WriteLine ();
            }
            if (selection == 1) {
                New ();
                Menu ();
                Choice ();
                Console.WriteLine ();
            }
            if (selection == 5) {
                Console.WriteLine ();
                Console.WriteLine ("Thank you for using this program for your scheduling needs.");
            }
        }
        //This method when called will print a numbered list of courses refrenced by the created List
        public void Print()
        {
            Console.WriteLine ();
            Console.WriteLine ("Course Name.........Course Number.........Course Description........Course Hours");
            Console.WriteLine ("********************************************************************************");
            for (int i = 0; i < totalcourse; i++) {
                int place = i + 1;
                Console.WriteLine (place+".)"+school [i]);
            }
            Console.WriteLine ();
        }
        //This method will add an item to the end of the current list.
        public void Add()
        {
            Console.WriteLine ();
            Console.Write ("How many courses would you like to add at the end of your index?");
            int numberAdded = int.Parse(Console.ReadLine ());
            for (int i = 0; i < numberAdded; i++) {
                Console.WriteLine ("Please use the following templet for your entries...");
                Console.WriteLine ("Course Prefix, Course Name, Course Number, Course Hours, Course Description ");
                school.Add (new Course (courseName = Console.ReadLine (), courseNumber = Console.ReadLine (), courseHours = int.Parse (Console.ReadLine ())));
            }
            totalcourse = totalcourse + numberAdded;
            Console.WriteLine ();
        }
        //This method will delete an Item from the list based on the position 0-x based on x-1, the output that is seen by the user. After each iteration it will
        //also create a list so that further deletions can be managed approiatly.
        public void Delete()
        {
            if (totalcourse < 1) {
                Console.WriteLine ();
                Console.WriteLine ("There is nothing to delete!");
                Console.WriteLine ();
            }else{
                Console.WriteLine ();
                Console.Write ("How many entries do you wish to remove?");
                int removed = int.Parse (Console.ReadLine ());
                for (int i = 0; i < removed; i++) {
                    Console.WriteLine ("Please type the index line number of the item you wish to remove.");
                    int delete = int.Parse (Console.ReadLine ());
                    school.RemoveAt (delete - 1);
                    totalcourse = totalcourse - 1;
                    Print ();
                }
            }
            Console.WriteLine ();
        }
        //This method is called to create a new list of Courses to be created by the user.
        public void New()
        {
            Console.WriteLine ();
            if (howmany > 0) {
                Clear ();
            } else {
                Console.Write ("How many courses do you want to create? ");
                howmany = int.Parse (Console.ReadLine ());
                Console.WriteLine ();
                for (int i = 0; i < howmany; i++) {
                    Console.WriteLine ();
                    Console.WriteLine ("Please use the following templet for your entries...");
                    Console.WriteLine ("Course Prefix, Course Name, Course Number, Course Hours, Course Description ");
                    school.Add (new Course (courseName = Console.ReadLine (), courseNumber = Console.ReadLine (), courseHours = int.Parse (Console.ReadLine ())));
                }
                totalcourse = totalcourse + howmany;
                Console.WriteLine ();
            }
        }
        //If there is already a list in place this method will be called and you will be asked if you wish to delete and start new.
        public void Clear()
        {
            Console.WriteLine ();
            Console.Write ("You want to discard old work and start a new list? Enter True or False...:");
            bool clean=bool.Parse(Console.ReadLine());
            if (clean == true) {
                school.Clear ();
                totalcourse = 0;
                howmany = 0;
                New ();
            } else
                Console.WriteLine ("No changes will be made. Exiting to Main Menu...");
            Console.WriteLine ();
        }
//This is the method to call the 4 predefined Courses
//----->This is the part of my code that is causing the stack overflow error that I cant figure out...
        public void Myfour ()
        {
            Console.WriteLine ("These are four pre loaded courses.");
            Course c1=new Course(name="Programming",cn="1101",hours=3);
            Course c2=new Course(name="Algebra",cn="1101",hours=4);
            Course c3=new Course(name="Chemistry 1",cn="1101",hours=4);
            Course c4=new Course(name="Chemistry 1 Lab",cn="1101",hours=3);
            school.Add (c1);
            school.Add (c2);
            school.Add (c3);
            school.Add (c4);

        }
    }
}

2 个答案:

答案 0 :(得分:2)

您拥有自行设置的属性:

$createResult = $transcoder->createJob($jobData);
$jobId = $createResult->get('Job')['Id'];

$readResult = $transcoder->readJob(['Id' => $jobId]);
$readResult->get('Job')['Status'];

这将无限循环。您应该分配一些私人字段:

public string cn
{
    get { return courseNumber; }
    set
    {
        if (value != null)
            cn = value;
    }
}

答案 1 :(得分:2)

堆栈溢出是通过递归分配属性引起的。你不应该这样写:

''' <summary>
''' Used to order the given array alphanumerically
''' </summary>
''' <typeparam name="T">the type</typeparam>
''' <param name="source">the source object</param>
''' <param name="selector">the item being used as the selector</param>
''' <returns>the sorted list</returns>
<System.Runtime.CompilerServices.Extension>
Public Function OrderByAlphanumeric(Of T)(source As IEnumerable(Of T), selector As Func(Of T, [String])) As IEnumerable(Of T)
    Try
        Dim max As Int32
        Try
            max = source.SelectMany(Of Int32)(Function(i) Regex.Matches(selector(i), "\d+").Cast(Of Match)().Select(Of Int32)(Function(m) m.Value.Length)).Max()
        Catch ex As Exception
            max = 0
        End Try

        Return source.OrderBy(Function(i) Regex.Replace(selector(i), "\d+", Function(m) m.Value.PadLeft(max, "0"c)))
    Catch exMain As Exception
        Return source
    End Try
End Function

看到再次分配cn?您应该使用私有变量更改该行,如下所示:

public string cn{
    get {return courseNumber; }
    set {if (value != null)
        cn = value;
    }
}

对其他属性执行相同操作。另请注意课程名称中的错误。你应该使用value而不是courseName。这应该是它。

public string cn{
    get {return courseNumber; }
    set {if (value != null)
        courseNumber = value;
    }
}