0

У меня есть класс с магазинами.

Есть такие сеттеры (модифицировал их с учетом предыдущих ответов):

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);

Но, насколько я понимаю, проблема живет и в последующих строчках кода тоже.

Как это можно исправить?

EvilBDSM
  • 111

1 Answers1

2

Если Вы привели весь основной код, то ошибка очень проста:

при вызове функции 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;}
    }

Вы замечаете, насколько проще стал код и насколько меньше нужно функций? А это еще только самый тривиальный случай.

S.H.
  • 11,065
  • 1
  • 24
  • 46