C# 嵌套属性初始化

C# Nested Properties initialize

我有以下嵌套属性的简单声明(简化):

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

你能帮我解决以上问题吗?枯萎的方式我试过了,它没有 运行

您应该先初始化 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);

打印

Greetings

另一种选择是在构造函数中初始化嵌套属性,就像那样

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

或者您可以完成代码片段并直接设置嵌套 属性

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

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

myMessage.message = myMsgProperties;

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

打印

Hey!

空条件 operator ? 将帮助您避免 NullReferenceException 如果有

您需要修改 standardMessage class 的定义以使用内联初始化程序或添加默认构造函数(取决于您使用的语言版本)。

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