none
Конструктор экземпляра класса, в котором есть подклассы - в C# RRS feed

  • Вопрос

  • Допустим, есть такой класс с его конструктором:

    public class MyClass
    {
        String Svoystvo1;
        String Svoystvo2;
        PodClass Svoystvo3;
    
        public class Podclass
        {
            String Svoystvo31;
            String Svoystvo32;
        }
    
        public MyClass(svoystvo31, svoystvo32)
        {
            Svoystvo1 = "Znachenie1";
            Svoystvo2 = "Znachenie2";
            Svoystvo3.Svoystvo31 = svoystvo31;
            Svoystvo3.Svoystvo32 = svoystvo32;
        }
    }


    Проблема в том, что строки

    Svoystvo3.Svoystvo31 = svoystvo31;

    Svoystvo3.Svoystvo32 = svoystvo32;


    Приводят к исключению System.NullReferenceException. По всей видимости, из-за того, что не был инициализирован объект класса Podclass.

    Но, когда меняю код класса на такой:

    public class MyClass
    {
        String Svoystvo1;
        String Svoystvo2;
        PodClass Svoystvo3;
        public class Podclass
        {        
            String Svoystvo31;
            String Svoystvo32; 
        }
        public MyClass(svoystvo31, svoystvo32)
        {
            Svoystvo1 = "Znachenie1";
            Svoystvo2 = "Znachenie2";
    
            Podclass svoystvo3 = new Podclass();
            svoystvo3.Svoystvo31 = svoystvo31;
            svoystvo3.Svoystvo32 = svoystvo32;
        }
    }

    исключение, конечно, пропадает, но по итогам если создать объект, к примеру,

    MyClass myObject = new MyClass("31", "32")

    , то myObject.Svoystvo3.Svoystvo31 и myObject.Svoystvo3.Svoystvo32 не будут равны "31" и "32", соответственно, поскольку myObject.Svoystvo3 вообще будет null.

    Вопрос - как в конструкторе класса задать свойства его подклассам? Именно ещё в конструкторе, а не создавая где-то вовне объект подкласса, задав ему нужные свойства.

    19 апреля 2015 г. 7:30

Ответы

  • Вы в конструкторе создали локальный объект подкласса, а не проинициализировали поле основного класса. Напишите так:

    Svoystvo3 = new Podclass();

    Svoystvo3.Svoystvo31 = ...

    Svoystvo3.Svoystvo32 = ...


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Eugene Razmanov 19 апреля 2015 г. 8:05
    • Предложено в качестве ответа Liliya Muray 19 апреля 2015 г. 8:05
    19 апреля 2015 г. 7:56

Все ответы

  • Вы в конструкторе создали локальный объект подкласса, а не проинициализировали поле основного класса. Напишите так:

    Svoystvo3 = new Podclass();

    Svoystvo3.Svoystvo31 = ...

    Svoystvo3.Svoystvo32 = ...


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Eugene Razmanov 19 апреля 2015 г. 8:05
    • Предложено в качестве ответа Liliya Muray 19 апреля 2015 г. 8:05
    19 апреля 2015 г. 7:56
  • Помогло! Спасибо!
    19 апреля 2015 г. 8:05