Я разрабатываю консольную игру на C# и столкнулся с проблемой при использовании метода AddItemInInventory в конструктореInventory. У меня есть конструктор, который принимает готовый список предметов и успешно добавляет их в инвентарь, обновляя при этом общие параметры защиты. Однако, когда я пытаюсь добавить предмет в уже существующий инвентарь с помощью метода AddItemInInventory, общие параметры защиты не обновляются.
Вот код моего конструктора:
public Inventory(List<Item> items)
{
_items = new List<Item>();
foreach (var item in items)
{
_items.Add(item);
_totalProtection += item.Protection;
_totalProtectionQuality += item.ProtectionQuality;
}
}
И вот код метода AddItemInInventory:
public void AddItemInInventory(Item item)
{
_items.Add(item);
_totalProtection += item.Protection;
_totalProtectionQuality += item.ProtectionQuality;
}
Я добавляю предметы в инвентарь так:
Item item = new("Новый предмет", 10000, 456, 987, ItemType.Weapon, ItemSize.Large);
_player.Inventory.PrintInventory();
Console.WriteLine();
_player.Inventory.AddItemInInventory(item);
_player.Inventory.PrintInventory();
Console.WriteLine($"Protection { _player.Inventory.TotalProtection}");
Console.WriteLine($"ProtectionQuality { _player.Inventory.TotalProtectionQuality}");
Вот вывод в консоль, который я получаю
Name New Item For Test
Cost 500
Protection 12
Protection Quality 34
Size Small
Type Weapon
Name New Item For Test
Cost 500
Protection 12
Protection Quality 34
Size Small
Type Weapon
Name Новый предмет
Cost 10000
Protection 456
Protection Quality 987
Size Large
Type Weapon
Protection 12
ProtectionQuality 34
Я думаю, что Protection и ProtectionQuality будут иметь значения 468 и 1021 соответственно.
Я ожидаю, что общие параметры защиты будут обновляться при добавлении предмета в инвентарь независимо от способа - при создании инвентаря с готовым списком предметов или при добавлении предмета в уже существующий инвентарь. Однако, обновление общих параметров защиты происходит только при использовании конструктора.
Пожалуйста, помогите мне разобраться, как обновить общие параметры защиты при добавлении предмета в уже существующий инвентарь с помощью метода AddItemInInventory.
Заранее благодарю за помощь и рекомендации!
_totalProtectionи почему потом вдруг вызываетсяTotalProtection? Если это свойство с приватным полем, то используйте свойство напрямую, а не поле. Далее, как "инвентарь" инициализируется, где? Наверно в классе "игрок", где его код в вопросе? Повторю, весь код воспроизводящий вопрос должен быть в вопросе. – EvgeniyZ Jan 02 '24 at 15:17struct Obj { int value; public void Change(int newVal) => value += newVal; } .. obj.Change(5);", все... – EvgeniyZ Jan 02 '24 at 16:31public struct Inventoryменяем наpublic class Inventory. Почему так, читайте про структуры (зачем вы из тут используете, не пойму), а если не поймете сами, то приведите вопрос в нормальный вид, тогда мб кто-то даст ответ (если такого дубликата нет конечно). – EvgeniyZ Jan 02 '24 at 16:31getсвойства вы получаете постоянно копию структуры, ибо это структура... Об этом кстати написано в Для чего нужны свойства. – EvgeniyZ Jan 02 '24 at 16:49