首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化嵌套对象属性

初始化嵌套对象属性
EN

Stack Overflow用户
提问于 2013-08-08 18:28:42
回答 4查看 25.2K关注 0票数 11

我有一个叫雇员的类,它有一个名为保险的字段,它是这样的保险类型。

代码语言:javascript
复制
public class Employee
{
    public string Name;
    public Insurance Insurance;
}

我还有一门课叫保险

代码语言:javascript
复制
public class Insurance
{
    public int PolicyId;
    public String PolicyName;
} 

现在,在主程序中,我想做一些类似的事情

代码语言:javascript
复制
var myEmployee = new Employee();
myEmployee.Name = "Jhon";
myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;

C#在抱怨,我知道如何通过创建保险类的实例来修复它。

我的问题是,我能以我想在主程序中使用的方式分配字段的值吗?

**

代码语言:javascript
复制
myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;

**我试过了

代码语言:javascript
复制
 public class Employee
    {

        public Employee()
        {
            Insurance Insurance = new Insurance();
        }

        public String Name;
        public Insurance Insurance;



        public class Insurance
        {
            public int PolicyId;
            public String PolicyName;
        } 
    }

当我尝试的时候

代码语言:javascript
复制
class Program
    {
        static void Main(string[] args)
        {
            var joe = new Employee();
            joe.Name = "Joe";
            joe.Insurance.

        }

我知道这个错误-

错误2 'ConsoleApplication1.Employee.Insurance‘和'ConsoleApplication1.Employee.Insurance’c之间的歧义:\users\联想\documents\visual studio ConsoleApplication1.Employee.Insurance 15 17 ConsoleApplication1

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-08 18:32:27

您可以在员工的构造函数中实例化保险,以便为您自动完成。您可以提供默认值,以确保在稍后访问时还未定义为有效的默认值。

代码语言:javascript
复制
public class Employee
{
    Insurance Insurance { get; set; }

    public Employee()
    {
        this.Insurance = new Insurance() { PolicyId = -1 };
    }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}

或者将类嵌套起来:

代码语言:javascript
复制
public class Employee
{
    Insurance InsurancePolicy { get; set; }

    public Employee()
    {
        this.InsurancePolicy = new Insurance() { PolicyId = -1 };
    }
    public class Insurance
    {
        public int PolicyId { get; set; }
        public string PolicyName { get; set; }
    }
}
票数 16
EN

Stack Overflow用户

发布于 2013-08-08 18:30:52

不需要更改Employee类,您可以使用对象初始化器:

代码语言:javascript
复制
var myEmployee = new Employee 
{
    Name = "Jhon",
    Insurance = new Insurance
    {
        PolicyId = 123,
        PolicyName = "Life Time"
    }
};

或者,最好是让Employee类在其构造函数(如其他答案)中创建Insurance的一个新实例,或者在Insurance属性getter本身中创建一个新实例,因此只有在使用它时才会实例化它。下面是后者的一个例子:

代码语言:javascript
复制
class Employee 
{
    private Insurance insurance;

    public Insurance Insurance
    {
        get
        {
            if (insurance == null)
            {
                insurance = new Insurance();
            }
            return insurance;
        }
    }
}

最后,我建议您不要构建具有所有公共字段的类,除非您确实知道这是您想要的。相反,我会考虑在字段上使用属性。我已将其他人的建议纳入以下代码,并提供了自己的建议:

代码语言:javascript
复制
public class Employee
{
    public Employee() 
    {
        this.Insurance = new Insurance();
    }

    // Perhaps another constructor for the name?
    public Employee(string name)
        : this()
    {
        this.Name = name;
    }

    public string Name { get; set; }
    public Insurance Insurance { get; private set; }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}
票数 12
EN

Stack Overflow用户

发布于 2013-08-08 18:31:07

当然,但是如何分配属于null对象的东西呢?您需要在Insurance的构造函数中实例化Employee

代码语言:javascript
复制
public Employee()
{
     this.Insurance = new Insurance();
}

编辑有关您的评论:按照这种方法,将能够用两个点访问myEmplyee.Insurance.PolicyID。构造函数在Employee类中,因此一旦实现,您就不必键入任何超出您已经尝试过的操作的内容。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18133392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档