我可以从C#中另一个类的构造函数中调用构造函数吗?

时间:2018-03-16 07:40:59

标签: c# constructor

我是C#的新手,想知道在同一个命名空间中有两个类,我可以在另一个构造函数中调用一个构造函数吗?

例如:

class Company
{
    // COMPANY DETAILS
    Person owner;
    string name, website;

    Company()
    {
        this.owner = new Person();
    }
}

由于其保护级别,上述返回“Person.Person()”无法访问。 Person类看起来像这样:

class Person
{
    // PERSONAL INFO
    private string name, surname;

    // DEFAULT CONSTRUCTOR
    Person() 
    {
        this.name = "";
        this.surname = "";
    }
}

这里有什么我想念的吗?不应该从同一名称空间的任何地方访问构造函数吗?

2 个答案:

答案 0 :(得分:10)

您将构造函数定义为私有,因此您无法访问它。

编译器甚至会为您提供hint

error CS0122: 'Person.Person()' is inaccessible due to its protection level

C# 6.0 specificationaccess modifiers州:

  

如果 class_member_declaration 不包含任何访问修饰符,则假定私有

class_member_declaration指定为

class_member_declaration
    : ...
    | constructor_declaration
    | ...
    ;

默认情况下,当定义为抽象时,只有default constructors是公开的。

因此改变

Person() { }

public Person() { }

答案 1 :(得分:2)

在C#中我们有访问修饰符。目前的选项是

Public - everyone has access
Internal - can only access from same assemnly
Protected - only the class and classes derived from the class can access members marked as protected
Protected Internal - accessible from any class in the same assembly or from any class derived from this class in any assembly
Private protected - only accessible from a class that is derived from this class AND in the same assembly 
Private - only accessible in the declaring class

有一个新的,但让我们离开。

对于您的问题,重要的是代码中的内容是什么。没有指定访问修饰符的类将默认为internal。所以同一个组件中的任何人都可以看到它。类成员,因此字段,属性,方法或构造函数将默认为private,仅表示该类可以访问它。

所以对你来说,如果你的两个类都在同一个程序集中,那么你可以保留你的类声明(而不是Namespace对访问修饰符无关紧要),所以默认的内部访问修饰符很好。

您需要将构造函数更改为具有明确的内部或公共修饰符,以便您可以访问它。如果您的类是内部的,那么您可以将方法等标记为公共,但它们仍然只能从该程序集内部访问,因为encapsulatong类是内部的。