Во время defineMapCellPositions () и defineMapCellWalls () значения map.cols и map.rows меняются с таких значений, как 4 и 5, на 0 только для пошагового выполнения методов. Шаг через отладчик подтверждает это. Почему это?

Любая помощь оценена, спасибо!

Весь класс карты

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public class Map
{
    public Map()
    {
    }
    public int rows { get; set; }
    public int cols { get; set; }
    public int boardXPos { get; set; }
    public int boardYPos { get; set; }
    public int squareSize { get; set; }

    private List<List<int>> m_cellPositions = new List<List<int>>();
    public List<List<int>> cellPositions
    {
        get
        {
            return m_cellPositions;
        }
        set
        {
            m_cellPositions = value;
        }
    }

    private List<List<int>> m_cellWalls = new List<List<int>>();
    public List<List<int>> cellWalls
    {
        get
        {
            return m_cellWalls;
        }
        set
        {
            m_cellWalls = value;
        }
    }
}

Начало класса MapController

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public class MapController
{
    public MapController()
    {
    }

    Map map = new Map();

Метод установки map.cellWalls

public void defineCellWallsList()
{
    //map.cellWalls.Clear();
    for (int row = 0; row < (map.rows * map.cols); row++)
    {
        map.cellWalls.Add(new List<int> { 0, 0 });
    }
}

Метод установки map.cellPositions

public void defineCellPositionsList()
{
    //map.cellPositions.Clear();
    for (int row = 0; row < map.rows; row++)
    {
        for (int col = 0; col < map.cols; col++)
        {
            map.cellPositions.Add(new List<int> { col, row });
        }
    }
}
1
user2602079 14 Сен 2013 в 08:32
Map.cols и map.rows на короткое время устанавливаются в 0, пока выполняется defineCellPositionsList () и defineCellWallsList (). Мне решать, почему на самом деле.
 – 
user2602079
14 Сен 2013 в 08:54
Где вы устанавливаете строки / столбцы на 4 и 5?
 – 
Corak
14 Сен 2013 в 09:12
Является ли map.CellPositions наблюдаемой коллекцией? Какие-нибудь триггеры срабатывают, когда вы добавляете в него предметы?
 – 
Ed S.
14 Сен 2013 в 09:13
Строки и столбцы устанавливаются пользователем в форме. Я покажу эту часть сейчас.
 – 
user2602079
14 Сен 2013 в 09:19
Я жестко запрограммировал строки и столбцы, и он прошел через цикл создания двух зубчатых списков, и у них было, например, счетчик 25, а затем после завершения метода счет был 0
 – 
user2602079
14 Сен 2013 в 09:20

1 ответ

Лучший ответ

Чтобы предоставить экземпляр Map в вашем MapController, сделайте его общедоступным полем или поместите в свойство. пример:

public class MapController
{
    public MapController()
    {
    }

    //here you make it "public" so it is visible to outside classes
    public Map map = new Map();

    // the rest of your code for this class...

Затем для доступа к этому экземпляру (при условии, что вы держитесь за экземпляр контроллера)

var controller = new MapController();
controller.map.rows = 5; // now you can access that instance of map.
controller.map.rows = 123;

Теперь, чтобы внедрить карту в контроллер (это означает, что она добавлена ​​где-то еще в вашем коде, и один и тот же экземпляр затем может использоваться несколькими классами с использованием аналогичных процедур инъекции), вы должны сделать что-то вроде этого ...

public class MapController
{
    //here you make it "private" cause it doesn't need to be public anymore, 
    //you also don't new it up here, you are passing in a new on during construction.
    private Map map;
    public MapController(Map map)
    {
        this.map = map
    }

    // the rest of your code for this class...

Теперь в коде, где вы обновляете объекты и прочее ...

var map = new Map();
var controller = new MapController(map);
map.rows = 5; // now you can access that instance of map.
map.rows = 123;
// and you can easily share that same instance with other classes
var otherClass = new SomeOtherClassThatNeedsTheMap(map);
1
Caleb 14 Сен 2013 в 12:53
Спасибо! Как мне установить экземпляр карты в переменную в других классах в качестве этого экземпляра, чтобы мне не приходилось каждый раз писать контроллер? Упоминается много. например, Map map = controller.Map ();
 – 
user2602079
14 Сен 2013 в 12:24
Это действительно будет зависеть от структуры кода, но есть несколько способов сделать это. Мне кажется, что вы в основном хотите использовать одну и ту же карту повсюду в своем коде. Я бы посоветовал создавать его не в контроллере, а injecting в контроллере. Я обновлю свой ответ, чтобы показать вам, как это работает.
 – 
Caleb
14 Сен 2013 в 12:27
Но если вы действительно хотите оставить конструкцию в контроллере и просто затем записать этот экземпляр в переменную в другом месте для простоты использования, вы просто делаете это var map = controller.map; (при условии, что вы оставили код с map публично на контроллере)
 – 
Caleb
14 Сен 2013 в 12:42
Спасибо. Ему не нравилась "частная карта"; но я понял, что вы просто получили тип, и сделал частную карту карты ;. Мне не нравится "var", не знаю, что с этим делать
 – 
user2602079
14 Сен 2013 в 12:46
Я думаю, что планировал определить карту и контроллер вне любого метода, чтобы я мог использовать его во всем классе, а var для этого не работает
 – 
user2602079
14 Сен 2013 в 12:54