Мой переход по ссылке не делает то, что должен делать - PullRequest
2 голосов
/ 29 февраля 2012

Я чешу голову здесь ... У меня есть большая программа, которую я написал на C #, и в ней есть небольшая ошибка, которая не имеет для меня никакого смысла.

Очень быстрый фон:

У меня есть класс с именем CompoundSet, который содержит DataSet (не System.Data.DataSet, это мой собственный определенный класс), который определяется следующим образом:

public class CompoundSet
{
  private DataSet dataSet;
  public  DataSet { get { return dataSet; } }

  //...
}

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

DataWindow dw = new DataWindow(compoundSet.DataSet);

Конструктор для DataWindow выглядит так:

public DataWindow(DataSet dataSet)
{
  // ...

  this.dataSet = dataSet;
}

и DataWindow перечисляет содержимое DataSet в различных элементах управления GUI.

Это окно показывает, что в данный момент находится в наборе данных. Пользователь может изменять данные по своему усмотрению. Когда они закрывают dw, изменения данных ДОЛЖНЫ быть в CompoundSet, так как мы только передаем указатели. DataSet в compoundSet и DataSet в dw ДОЛЖНЫ быть одинаковыми, однако это не так.

Если я установлю точку останова в классе DataWindow в событии закрытия, я вижу, что локальные dw.dataSet и WorkFlow.compoundSet.DataSet не имеют одинаковую информацию.

Учитывая, что я передал указатель на compoundSet.DataSet классу DataWindow в конструкторе и нигде не использовал ключевое слово new в DataWindow, это не имеет никакого смысла для меня?

Почему мой compoundSet.DataSet отличается от моего dw.dataSet?

Редактировать : Я попытался создать DataWindow, например:

DataSet ds = compoundSet.DataSet;
DataWindow dw = new DataWindow(ds);
dw.ShowDialog(this); // breakpoint on dw.FormClosing shows the dataset has new data
return; // breakpoint here shows ds is different from dw.dataSet

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Ваши теги немного отклонены (потому что ваша терминология немного отклонена), но вы понимаете концепции правильно.Размещенный вами код не является источником проблемы.

В частности: вы не передаете по ссылке, вы передаете ссылочный тип.Поскольку это ссылочный тип, вы передаете не сам объект, а ссылку на объект (не «указатель» - да, ссылка реализована в виде указателя, но это деталь реализации и слово «указатель»)."имеет конкретное, другое значение в c #).Поскольку вы не использовали ключевое слово «ref», вы передаете эту ссылку по значению (но это может не относиться к вашей проблеме).

Я думаю, что существует некоторая проблема с привязкой, вызывающая изменения вПользовательский интерфейс не должен передаваться объекту dataSet.Но согласно опубликованному вами коду, DataWindow и CompoundSet действительно должны работать с одним и тем же объектом.

Также возможно, что вы переназначаете переменную dataSet в коде elided и ожидаете этого переназначенияприменить к свойству componentSet.DataSet, но ваш вопрос подразумевает, что это не так.

0 голосов
/ 29 февраля 2012

Убедитесь, что вы используете ключевое слово ref .В зависимости от ситуации вы можете получить дублированные объекты вместо ссылки на этот объект (что вы и видите).Чтобы избежать этого, ref заставляет объект проходить по ссылке, гарантируя, что вы просматриваете (и модифицируете) один и тот же объект.

...