Поведение ключевых слов в C # 2.0 - PullRequest
1 голос
/ 15 июня 2011

В методе я получаю пользовательский объект, который я повторно использую. позже, чтобы уступить снова.

private IEnumerable<DistributorMonthlyComparisonData> ExtractMonthlyAggregate(String CSVFilepath)
{
    DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
    while (!reader.EndOfStream)
        {
            if(something){
                // fill unitData
                }
            else{
                 yield return unitData;
                }
        }
}

В другом объекте в моей программе я вызываю указанный метод следующим образом:

List<DistributorMonthlyComparisonData> distribList = new List<DistributorMonthlyComparisonData>();
foreach (DistributorMonthlyComparisonData result in ExtractMonthlyAggregate(percorso))
  {
    distribList.Add(result);
  }

Если я не создаю в методе урожайности, после каждого выхода, новый объект

unitData = new DistributorMonthlyComparisonData();

Все, что я получаю, это список идентичных объектов.

Мне интересно: это потому, что unitData передается как ссылка, и, таким образом, список - это просто список ссылок на один и тот же идентичный объект? Создание нового unitData () каждый раз, когда изменяется хеш передаваемого объекта unitData?

Пожалуйста, просветите меня. :)

РЕДАКТИРОВАТЬ Меня интересует почему это происходит. Раньше я считал, что фреймворк должен выполнять копирование при записи на объекты, поэтому, по сути, создание одного объекта с последующим изменением его свойств и повторным получением должно приводить к добавлению двух разных объектов в список.

Ответы [ 4 ]

3 голосов
/ 15 июня 2011

C # имеет семантику ссылок для типов классов, так что вы правы относительно возвращаемых ссылок.

Сказка об отдыхе:

yield return / yield break продолжит цикл, в который вы их поместили. Поэтому код перед вашим циклом выполняется только один раз, прежде чем цикл будет введен. Вам нужно будет new ваши возвращенные объекты внутри цикла.

То есть, вам придется заменить

DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
while (!reader.EndOfStream) {
    ...

с

while (!reader.EndOfStream) {
    DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
    ...
2 голосов
/ 15 июня 2011

Мне интересно: это потому, что unitData передается как ссылка, и, таким образом, список - это просто список ссылок на один и тот же идентичный объект?

Точно.

Создание нового unitData () каждый раз, когда изменяется хеш передаваемого объекта unitData?

Это зависит от реализации GetHashCode () в DistributorMonthlyComparisonData.

1 голос
/ 15 июня 2011

Инициализация объекта произойдет только один раз.Выполнение возобновится с цикла while со второй итерации и далее.Вот почему коллекция объектов имеет одинаковые экземпляры объекта.

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

Создание нового unitData () каждый раз, когда изменяется хеш передаваемого объекта unitData?

Нет реализации GetHashCode (), DistributorMonthlyComparisonData - это просто набор свойств.

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

Когда вы определяете равенство для типа (переопределяя Equals), вы также должны переопределить GetHashCode,и гарантировать, что сравниваемые объекты имеют одинаковый хэш-код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...