私有类的公共实例-在C#中永远不允许

时间:2018-07-14 18:37:01

标签: c#

显然,这适用于Java:

class BigClass
{
    public SecretClass not_so_secret = new SecretClass();

    public class SecretClass
    {
        // Methods and stuff
    }
}

但是C#中没有等效项吗?在哪里可以创建BigClass的实例,但不能创建子类SecretClass

class testing_class
{
    BigClass BIG_CLASS_SHOULD_BE_ALLOWED = new BigClass();
    BigClass.SecretClass SUB_CLASS_SHOULD_NOT = new BigClass.SecretClass();
}

我已经尝试了内部(听起来不错...),私有,受保护的组合-现在基本上只使用了所有这些:D

在C#中,总是有这条单向街道作为访问修饰符是基本的双向原则吗?

通过这种方式,我确实找到了一个关于Kotlin(无论是什么)的答案here,这似乎是一件很严格的事情,对某些人来说毫无意义或出于某种原因是危险的-“内部”创建的私有类的公共实例

是否无法在c#中实现这种访问级别?

1 个答案:

答案 0 :(得分:2)

如果要使成员(字段,属性,方法,事件,委托或嵌套类型)公开,则此成员公开的所有类型都必须是公开的。

但是,有一个技巧可以使类仅在BigClass中可实例化:使类abstract,并且如果需要编写构造函数,则使它protected或者,因为C#7.2 private protected(请参见下文)。然后从中派生出嵌套的private class

public class BigClass
{
    public SecretClass not_so_secret = new VerySecretClass();

    public abstract class SecretClass
    {
    }

    private class VerySecretClass : SecretClass
    {
    }
}

还将所有您不想公开的东西设为私有或受保护。您甚至可以为设置者提供更多限制性访问修饰符。

public string Text { get; private set; } // or: protected set;

如果您正在编写类库,它也有助于使事情internal。它使其他装配体看不见东西。


自C#7.2起,可访问性也有了新的提高(来自C# 7 Series, Part 5: Private Protected):

  

受私有保护

     

受保护的私有对象:在具有这种可访问性的情况下,声明的成员可以在从此包含类型派生的类型中看到   包含的程序集。对于任何未派生的类型均不可见   从包含类型,或在包含程序集之外。即   该访问仅限于包含程序集内的派生类型。