это связано с использованием памяти и указателями. У вас есть стек и куча при выделении памяти для объектов, эта память - одна куча. Ваша переменная saleItems определена в стеке и указывает на адрес памяти в куче. Ваш словарь также находится в стеке, указывая на кучу.
когда вы говорите:
saleItems = new List<SaleItem>()
переменная saleItems помещается в стек и содержит адрес в памяти, указывающий на расположение данных в куче. Скажем 0x0100
. Теперь вы добавляете новый DictionaryItem
в свой словарь. DictionaryItem
помещается в кучу с двумя свойствами: ключ и значение. В этом случае вы добавили saleItems
как Value
, поэтому Value
также имеет адрес 0x0100
. Теперь DictionaryItem.Value
указывает на ту же память, что и saleItems. Когда вы звоните saleItems.Clear, вы говорите, найдите список по адресу 0x0100
и удалите все элементы. Таким образом, словарь и переменная становятся пустыми, потому что они указывают на одну и ту же память. Что вы хотите сделать, это сказать saleItems = new List<SaleItem>();
снова. Теперь saleItems будет указывать на новый адрес в куче (скажем, 0x0200
). DictionaryItem.Value
по-прежнему указывает на адрес памяти 0x0100
, поэтому вы можете воздействовать на переменную saleItems
, не затрагивая данные в вашем словаре.
Для получения дополнительной информации о стеках и кучах в c # попробуйте эту статью: http://www.c -sharpcorner.com / UploadFile / rmcochran / csharp_memory01122006130034PM / csharp_memory.aspx? ArticleID = 9adb0e3c-b3f6-40b5-624484 *