Ich habe eine Konsolenanwendung, bei der beim Starten der Anwendung ein Stapelüberlauffehler angezeigt wird.

Hauptprogramm

class Program
{
    public static void Main(string[] args)
    {
        Town town = new Town();

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}

Mein Problem ist, dass ich alle Gebäude in der foreach-Schleife mit der Liste aller Gebäudenamen benennen möchte, aber es funktioniert vermutlich nicht, weil es einen Stapelüberlauf verursacht und ich nicht weiß warum. Gibt es einen besseren Weg, dies zu tun, oder mache ich doch irgendwo anders etwas falsch?

public class Town
{
    public Town town = new Town();
    public List<Buildings> buildings = new List<Buildings>();

    private List<string> buildingNames = new List<string>() {"Town_Hall", "Market", "Residences", "Mortician", "Bank", "Hotel", "Tailor", "Gunsmith", "General_Store", "Sheriff", "Well", "Gate", "Wall"};

    public void ResetTown()
    {
        foreach (Buildings building in town)
        {
            int i = 0;
            i++;
            building.Name = buildingNames[i].ToString();
            building.Level = 0;
        }
    }

    public IEnumerator<Buildings> GetEnumerator() 
    { 
        return buildings.GetEnumerator(); 
    } 
}


public class Buildings
{
    public string Name {get; set;}
    public int Level {get; set;}
}
0
Dennis 18 Jän. 2019 im 06:13

3 Antworten

Beste Antwort

Sie können dies auch verwenden. Markieren Sie Building als Klasse anstelle von Buildings. Entkoppeln Sie die Gebäude von der Stadt und injizieren Sie sie über einen Konstrukteur:

Außerdem weist Ihr int i = 0; i++ Fehler auf und kann IndexOutOfRangeException verursachen.

public class Town
{
    private List<Building> buildings;
    private List<string> buildingNames = new List<string>() {"Town_Hall", "Market", "Residences", "Mortician", "Bank", "Hotel", "Tailor", "Gunsmith", "General_Store", "Sheriff", "Well", "Gate", "Wall"};

    public Town(List<Building> buildings)
    {
       this.buildings = buildings;
    }

    public void ResetTown()
    {
        int i = 0;
        foreach (Building building in buildings)
        {
            building.Name = buildingNames[i].ToString();
            building.Level = 0;
            i++;
        }
    }

    public IEnumerator<Building> GetEnumerator() 
    { 
        return buildings.GetEnumerator(); 
    } 
}

public class Building
{
    public string Name {get; set;}
    public int Level {get; set;}
}
0
Gauravsa 18 Jän. 2019 im 03:30

Wenn Sie sich den Konstruktor von Town ansehen, werden Sie sehen, dass er eine Town-Instanz erstellt, die sich selbst erneut aufruft und so in eine Endlosschleife eintritt.

Mit anderen Worten, jede Stadtinstanz enthält eine Stadtvariable, die wiederum eine Stadtvariable enthält. Es wird eine Milliarde Jahre und eine Milliarde GigaByte dauern, bis eine einzelne Stadtinstanz erstellt ist.

public Town town = new Town(); 

Ist im Wesentlichen das gleiche wie

Public Town town;
Public Town()
{
    town = new Town(); //constructor calls itself
 }
1
kennyzx 18 Jän. 2019 im 03:54

Es ist rekursiv, jedes Mal, wenn Sie eine Stadt erschaffen, wenn Sie eine Stadt erschaffen, geht es für immer weiter, das Universum bricht in eine Singularität zusammen

public class Town
{
    public Town town = new Town()
    ...

Was Sie wahrscheinlich wollen, ist dies

public class Town
{
    // when you auto initialise a property, 
    // it gets created when your create the class
    // this is your recursion, lets get rid of it as its completely
    // unneeded 
    //public Town town = new Town();
    public List<Buildings> buildings = new List<Buildings>();

    private List<string> buildingNames = new List<string>() {"Town_Hall", "Market", "Residences", "Mortician", "Bank", "Hotel", "Tailor", "Gunsmith", "General_Store", "Sheriff", "Well", "Gate", "Wall"};

    public void ResetTown()
    {
        // notice now we dont need a reference to town
        // we "are" the town
        foreach (Buildings building in this)
        {
            int i = 0;
            i++;
            building.Name = buildingNames[i].ToString();
            building.Level = 0;
        }
    }

    public IEnumerator<Buildings> GetEnumerator() 
    { 
        return buildings.GetEnumerator(); 
    } 
}

Die Verwendung ist die gleiche

public static void Main(string[] args)
{
    Town town = new Town();
}
0
Michael Randall 18 Jän. 2019 im 03:42