При попытке перезаписать поля объекта класса возникает ошибка: "Ссылка на объект не указывает на экземпляр объекта"
У меня есть класс с магазинами.
Есть такие сеттеры (модифицировал их с учетом предыдущих ответов):
public string SetName(string InitName)
{
name = InitName;
return name;
}
public string SetPlace(string InitPlace)
{
place = InitPlace;
return place;
}
public int SetTurnover(int InitTurnover)
{
turnover = InitTurnover;
return turnover;
}
public double SetAward(double InitAward)
{
award = InitAward;
return award;
}
Пытаюсь обновить информацию в полях объектов следующим образом:
public void EditShop()
{
if (RowNumber == 0)
{
// 0 - Сильпо
Form2.ShopName = Silpo.SetName(ShopName);
Form2.ShopPlace = Silpo.SetPlace(ShopPlace);
Form2.ShopTurnover = Silpo.SetTurnover(ShopTurnover);
Form2.ShopAward = Silpo.SetAward(ShopAward);
}
if (RowNumber == 1)
{
// 1 - АТБ
Form2.ShopName = ATB.SetName(ShopName);
Form2.ShopPlace = ATB.SetPlace(ShopPlace);
Form2.ShopTurnover = ATB.SetTurnover(ShopTurnover);
Form2.ShopAward = ATB.SetAward(ShopAward);
}
if (RowNumber == 2)
{
// 2 - Варус
Form2.ShopName = Varus.SetName(ShopName);
Form2.ShopPlace = Varus.SetPlace(ShopPlace);
Form2.ShopTurnover = Varus.SetTurnover(ShopTurnover);
Form2.ShopAward = Varus.SetAward(ShopAward);
}
if (RowNumber == 3)
{
// 3 - Апельмон
Form2.ShopName = Apelmon.SetName(ShopName);
Form2.ShopPlace = Apelmon.SetPlace(ShopPlace);
Form2.ShopTurnover = Apelmon.SetTurnover(ShopTurnover);
Form2.ShopAward = Apelmon.SetAward(ShopAward);
}
if (RowNumber == 4)
{
// 4 - Ашан
Form2.ShopName = Ashan.SetName(ShopName);
Form2.ShopPlace = Ashan.SetPlace(ShopPlace);
Form2.ShopTurnover = Ashan.SetTurnover(ShopTurnover);
Form2.ShopAward = Ashan.SetAward(ShopAward);
}
}
Постоянно сталкиваюсь с ошибкой, которая указана в заголовке. Формально, ругань (отладчик) идет на эту строку:
Form2.ShopName = Silpo.SetName(ShopName);
Но, насколько я понимаю, проблема живет и в последующих строчках кода тоже.
Как это можно исправить?
Ответы (1 шт):
Если Вы привели весь основной код, то ошибка очень проста:
при вызове функции EditShop()
в строке Form2.ShopName = Silpo.SetName(ShopName); у Вас объект Silpo равен NULL.
Убедиться в этом легко: во всех трех более-менее поппулярных средах разработки для C# (Visual Studio, Visual Studio Code и Rider) есть отладчики, в котрых можно поставить брейкпоинт на эту строку и потом просто водвести мышку к объекту и увидеть его значение.
Но вообще, глядя на код, я считаю, что там есть еще нескоклько проблем.
Давайте посмотрим на них по очереди.
я еще раз смотрю на строчку Form2.ShopName = Silpo.SetName(ShopName);. Если это код, написанный "снаружи" формы, то, видимо, Form2 - это экземпляр формы. Традиционно, чтобы никого не путать, принято, что имена классов пишутся с большой буквы, а имена экземпляров - с маленькой.
Вторая часть присваивания: Silpo.SetName(ShopName). Во первых, то ж самое замечание насчет имен классов и экземпляров.
Потом, не очень понятно, к какому типу относится Silpo. Вы потом у этого типа вызываете метод SetName(), и само имя этого метода вводит в заблуждение: Set ассоцируется с сеттером, а сеттер не должен возвращать значение.
Исправить это можно примерно так: переписать в "кассической ООП-парадигме":
у Вас появится класс Shop:
public class Shop
{
publis string Name {get; set;}
public string Place {get;set;}
public int Turnover {get;set;}
public double Award {get;set;}
}
Здесь используются автоматические геттеры - сеттеры.
После этого можно создавать экземпляры:
Shop atb = new Shop();
и работать с его свойствами
atb.Name = "ATB";
atb.Place = "Площадь Ильича";
atb.Turnover = 120;
и т.п.
Если Вам нужно, чтобы использовались init - значения, то сделать это можно в конструкторе класса, котрый как раз и выполнится при создании экземпляра:
public class Shop
{
public Shop(){
Name = initName;
Place = intPlace;
... // имейте в виду, что в этом слeчае где то должны быть определены переменные initName, initPlace и т.п.
}
publis string Name {get; set;}
public string Place {get;set;}
public int Turnover {get;set;}
public double Award {get;set;}
}
Вы замечаете, насколько проще стал код и насколько меньше нужно функций? А это еще только самый тривиальный случай.