Проблема с объектными ссылками - PullRequest
0 голосов
/ 07 июня 2011

Мой вопрос будет довольно последовательным.

У меня есть общий класс Cell<T>.И у меня есть клиентский класс, который работает с двумерным массивом Cell<T>:

public sealed class Environment
{
    private Cell<YUV>[,] primaryLayer;        

    public Colorizator(Cell<YUV>[,] layer)
    {
        // initialization...
    }
// ...
}

В классе Environment я вызываю метод, который делает следующее:

for(var ix = 1; ix < this.Width - 1; ix++)
{
    for(var iy = 1; iy < this.Height - 1; iy++)
    {
        this.primaryLayer[ix, iy].Window[0] = this.primaryLayer[ix - 1, iy + 1];
        this.primaryLayer[ix, iy].Window[1] = this.primaryLayer[ix, iy + 1];
        this.primaryLayer[ix, iy].Window[2] = this.primaryLayer[ix + 1, iy + 1];
        this.primaryLayer[ix, iy].Window[3] = this.primaryLayer[ix + 1, iy];
        this.primaryLayer[ix, iy].Window[4] = this.primaryLayer[ix + 1, iy - 1];
        this.primaryLayer[ix, iy].Window[5] = this.primaryLayer[ix, iy - 1];
        this.primaryLayer[ix, iy].Window[6] = this.primaryLayer[ix - 1, iy - 1];
        this.primaryLayer[ix, iy].Window[7] = this.primaryLayer[ix - 1, iy];
    }
}

Он заполняет каждую ячейкуСоседство Мура с соседом.

Затем я использую алгоритм, аналогичный заливке, в другом методе:

foreach(var cell in some_list)
{
    Parent = cell;
    Parent.Conquer(Parent);
    Parent.ViabilityRatio = this.ViabilityTresholds.Max;

    lr[Parent.X, Parent.Y] = Parent;

    while(true)
    {
        if(null == (Child = Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsMarked) as Cell<YUV>))
        {
            break;
        }
        else
        {
            Parent.Mark(Child);               

            var wt = default(Double);
            foreach(Cell<YUV> ch in Child.Window)
            {
                // Operation fails   
                // NullReferenceException occurs: there's no cells in `Child` neighbourhood
                wt += ch.ViabilityRatio;
            }

            Parent = Child;
        }
    }
} 

Когда я пытаюсь перебрать Child.Window, я обнаружил, что элементов соседства нет.Сначала я подумал, что Parent и Child, особенно Child, не сохраняют ссылки на объекты, которые я им назначил.Я имею в виду, что cell переменная in the foreach loop имеет ненулевое соседство.Но Parent не имеет.

Решение 1. Помогло с родительской ячейкой

Я реализовал метод Copy в Cell<T> классе:

public Cell<T> Copy()
{
    return (Cell<T>)this.MemberwiseClone();
} 

С тех пор Parent сохраняет свойство not-null Window.

foreach(var cell in some_list)
{
    Parent = cell.Copy();

Но if(null == (Child = Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsConquered) as Cell<YUV>).Copy()) пробная версия, к сожалению, не проходит.

Child не имеет свойства not-null Window.

Пожалуйста, помогите !!Спасибо!

Редактировать

Я пытался сделать следующее:

var ActiveWindow = (from ch in Parent.Window select (Cell<YUV>)ch).ToList(); ActiveWindow коллекция поддерживает инициализацию всех соседей.Более того, все соседи, как я ожидал, инициализировали своих соседей.

Но когда я отлаживал это: Child = ActiveWindow[0] ... Child не хранит соседей ..

Редактировать2

Child ячейка не равна нулю.Я получаю исключение внутри else предложения.

Это то, что я получил с моей Child ячейкой: enter image description here

И вот что я получил с Parent ячейкой:

enter image description here

1 Ответ

0 голосов
/ 07 июня 2011

Надеюсь, я ничего не поняла, эти утверждения причиняют мне боль: P

Скажем, Parent.Window не содержит ни одного Window, который не был завоеван, тогда

Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsConquered) as Cell<YUV>

Поскольку ни один элемент не соответствует шаблону, нет First, а default(Cell<YUV>) возвращает null.

Пересмотреть это утверждение:

if (null == (Child = Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsConquered) as Cell<YUV>).Copy())

даст:

if (null == (Child = null).Copy())

Или:

if (null == null.Copy())

Поскольку для метода Copy() нет ссылки на объект, возникает исключение.

...