C#, не получается присвоить значение полю объекту (вместо значения - null)
Я начал разработку простой игры на C# Windows Forms (.NET Framework 4.7.2). Столкнулся с проблемой присвоения значения полю. Для удобства выделил проблему и перенес на отдельный проект (чтобы не нагружать никого лишним кодом).
Есть 3 локации, у каждой свой NPC (неигровой персонаж, бот) записанный как поле класса GameLocation ввиде объекта класса NPC.
namespace GameProject
{
class NPC
{
//NPC type
public bool sex_male;
//NPC constructor
public NPC(bool isMale)
{
sex_male = isMale;
}
}
}
namespace GameProject
{
class GameLocation
{
//Location number
public int LocationNumber;
//Location's NPC
public NPC npc_1;
public GameLocation(NPC ncp, int num)
{
npc_1 = ncp;
LocationNumber = num;
}
}
}
Также я создал класс GameDefault, в котором я храню "дефолтные" экземпляры (объекты) NPC и локаций.
namespace GameProject
{
//This class contains object of default game content, like locations and NPC
class GameDefault
{
/*Default game locations (in this case Locationnumber doesn't matter, it has the meaning only for modding,
to put additional locations in the correct order*/
public static GameLocation loc_start_obj = new GameLocation(null, 0);
public static GameLocation loc_survival_obj = new GameLocation( survivorm_obj, 1);
public static GameLocation loc_village_obj = new GameLocation(villagerm_obj, 2);
//Default game NPC types (of each group)
public static NPC survivorm_obj = new NPC(true);
public static NPC villagerm_obj = new NPC(true);
}
}
Как видите, у локации loc_start_obj объектов NPC быть не должно, поэтому аргумент в конструкторе null, а у loc_survival_obj и loc_village_obj они присутствуют и параметры в конструкторе есть. Но после запуска программы у всех локаций поле npc_1 равно null.
Вот форма которая продемонстрирует результат:
namespace GameProject
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = (GameDefault.loc_survival_obj.npc_1 == null).ToString();
}
}
}
Программа выводит true при проверки поля npc_1 на null, хотя значение было присвоино через конструктор для этой локации.
Я попробовал убрать параметр NPC из конструктора GameLocation, и присвоил значение полю npc_1 через класс (то есть теперь для всех объектов GameLocation).
class GameLocation
{
//Location number
public int LocationNumber;
//Location's NPC
public NPC npc_1 = GameDefault.survivorm_obj;
public GameLocation(int num)
{
LocationNumber = num;
}
}
Результат тот же - при запуске и во время работы программи (с использованием label1.Refresh) поле равно null. Почему?
Присвоить значение получилось лишь так:
public NPC npc_1 = new NPC(true);
Результат проверки - false (то есть npc_1 не равно null). Или тоже самое через конструктор:
public GameLocation(int num, NPC ncp)
{
npc_1 = ncp;
LocationNumber = num;
}
public static GameLocation loc_start_obj = new GameLocation(0, new NPC(true));
public static GameLocation loc_survival_obj = new GameLocation(1, new NPC(true));
public static GameLocation loc_village_obj = new GameLocation(2, new NPC(true));
А вот так тоже не выходит, все равно null:
public NPC npc_1 = new NPC(true);
public static GameLocation loc_start_obj = new GameLocation(0, survivorm_obj);
public static GameLocation loc_survival_obj = new GameLocation(1, survivorm_obj);
public static GameLocation loc_village_obj = new GameLocation(2, survivorm_obj);
Почему не получается присвоить полю npc_1 значение уже существующего объекта? В чем ошибка?
Ответы (1 шт):
public static NPC survivorm_obj = new NPC(true);
public static NPC villagerm_obj = new NPC(true);
public static GameLocation loc_start_obj = new GameLocation(null, 0);
public static GameLocation loc_survival_obj = new GameLocation( survivorm_obj, 1);
public static GameLocation loc_village_obj = new GameLocation(villagerm_obj, 2);