C# Вложенные свойства инициализируются - PullRequest
0 голосов
/ 07 января 2020

У меня есть следующее простое объявление вложенных свойств (упрощенное):

public class standardMessage
{
    public messageProperties message { get; set; }
    public messageFlags flag { get; set; }
}

public class messageProperties
{
    public string messageSubject { get; set; }
    public string messageBody { get; set; }
}

public class messageFlags
{
    public Boolean flagImportant { get; set; }
    public Boolean flagPersonal { get; set; }
}

При инициализации я пытаюсь ввести значения, но мне кажется, что-то не хватает:

public class Program
{
    static void Main(string[] args)
    {
        standardMessage myMessage = new standardMessage();
        messageProperties myMsgProperties = new messageProperties();

        myMsgProperties.messageSubject = "Hey!";
        myMsgProperties.messageBody = "Howdy";

        //below code throws error System.NullReferenceException: 'Object reference not set to an instance of an object.'
        //MyMessage.message.messageSubject = "Greetings";
        //MyMessage.message.messageBody = "Happy weekend";

        //error - how do I print the values?
        Console.WriteLine(myMessage.message.messageSubject.ToString());
        Console.ReadLine();
    }
}

Не могли бы вы помочь мне с вышеуказанным? Как бы я ни пытался, это не работает

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вам необходимо изменить определение класса standardMessage, чтобы использовать встроенные инициализаторы или добавить конструктор по умолчанию (в зависимости от используемой языковой версии).

public class standardMessage
{
    public standardMessage()
    {
        message = new messageProperties();
        flag = new messageFlags();
    }

    public messageProperties message { get; set; } = new messageProperties();
    public messageFlags flag { get; set; } = new messageFlags();
}
1 голос
/ 07 января 2020

Вы должны инициализировать экземпляр messageProperties, прежде чем обращаться к свойствам экземпляра

myMessage.message = new messageProperties
{
    messageBody = "Happy weekend",
    messageSubject = "Greetings"
};

вместо этого

//below code throws error System.NullReferenceException: 'Object reference not set to an instance of an object.'
//MyMessage.message.messageSubject = "Greetings";
//MyMessage.message.messageBody = "Happy weekend";

Затем вы сможете распечатать его успешно

Console.WriteLine(myMessage.message.messageSubject);

печатает

Привет

Другой вариант - инициализировать вложенные свойства в конструкторе, например

public class standardMessage
{
    public standardMessage()
    {
        message = new messageProperties();
        flag = new messageFlags();
    }

    public messageProperties message { get; set; }
    public messageFlags flag { get; set; }
}

Затем вы можете присвоить значения так, как вы хотите

myMessage.message.messageSubject = "Greetings";
myMessage.message.messageBody = "Happy weekend";

Или вы можете закончить sh свой фрагмент кода и напрямую установить вложенное свойство

standardMessage myMessage = new standardMessage();
messageProperties myMsgProperties = new messageProperties();

myMsgProperties.messageSubject = "Hey!";
myMsgProperties.messageBody = "Howdy";

myMessage.message = myMsgProperties;

Console.WriteLine(myMessage.message?.messageSubject);

Prints

Привет!

Нулевой оператор ? поможет вам избежать NullReferenceException, если есть

...