首页 > 解决方案 > 私有类的公共实例 - 在 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 的答案(无论是什么),这似乎是一件严格的事情,对某些人来说没有意义或出于某种原因是危险的——“内部" 创建了私有类

有没有办法在 c# 中实现这种访问级别?

标签: c#

解决方案


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

但是,关于如何使类只能在内部实例化有一个技巧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 系列,第 5 部分:私有保护):

私人保护

Private Protected:使用此可访问性声明的成员可以在从包含程序集中的此包含类型派生的类型中可见。对于不是从包含类型派生的任何类型或在包含程序集之外的任何类型,它都是不可见的。即,访问仅限于包含程序集中的派生类型。


推荐阅读