Особенность цикла foreach

229
09 февраля 2018, 17:54

Объясните, пожалуйста, как это работает?

foreach (var productModel in productModels)
        {
            foreach (var barCode in productModel.BarCodes)
            {
                if (uniqueBarCodes.Contains(barCode))
                {
                    productModel.BarCodes = productModel.BarCodes.Where(b => b != barCode).ToArray();
                }
             }
        }

Почему изменяя productModel, меняется и изначальная коллекция?

Answer 1

Будет или не будет изменяться объект в коллекции productModels зависит от того, каким типом является ее элемент: ссылочным или значимым, если первым, то в переменную productModel попадает только ссылка на элемент, в коллекции также хранится только ссылка (это, по сути, указатель на область памяти, где хранится сам объект), естественно, что в этом случае Вы просто меняете объект, находящийся по ссылке. Если же тип значимый, то в productModel попадет копия объекта, тогда элемент коллекции productModels изменяться не будет. Изучите систему типов .NET, тогда таких вопросов у Вас не будет.

Про типы можно почитать здесь: https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/types/

Про ссылочные типы: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/reference-types

Также, есть две неплохих статьи на Хабре: https://habrahabr.ru/sandbox/68552/ https://habrahabr.ru/post/113586/

READ ALSO
Создание новой кнопки Button [требует правки]

Создание новой кнопки Button [требует правки]

Как создать кнопку Button, при нажатии на которую форма будет создавать новые экземпляры?

178
Работы с событиями

Работы с событиями

В своей программе, для упрощения кода, создал класс, куда запихнул все однотипные функцииТак вот, в этом классе есть свои объекты, у которых...

175
Automapper exception: needs to have a constructor with 0 args or only optional args

Automapper exception: needs to have a constructor with 0 args or only optional args

Добрый деньС помощью automapper пытался проецировать функции разных типов моделей

416
Создание dll с внешними библиотеками

Создание dll с внешними библиотеками

Есть 10 внешних библиотек, которые я подключаю к своему классуМожно ли как-нибудь сделать, чтобы при компиляции у меня получился 1 общий dll

226