了解C#中类的Access说明符

fs_*_*gre 4 c# class access-specifier

首先让我先说我理解访问说明符我只是没有看到在类中使用它们的意义.它对于限制范围的方法有意义,但对于类,为什么你想要一个私有类,是不是类的目的是能够重用它们?

在C#中声明一个类时访问说明符的目的是什么?你什么时候使用它们?

谢谢

Lea*_*res 6

好吧,假设你想让一个类只能在她自己的程序集中访问:

internal class Test
Run Code Online (Sandbox Code Playgroud)

假设您有两个类,一个在另一个内部(嵌套类):

protected internal class TestA
{
    private TestB _testB;

    private class TestB
    {
    }

    public TestA()
    {
        _testB = new TestB();
    }
}
Run Code Online (Sandbox Code Playgroud)

TestB类可以内部内种皮或她自己的内部方法/属性/ contructors仅访问.

这同样适用于protected修饰符.

// 注意

如果您没有指定访问修饰符,默认情况下它将是private,所以在我的示例中,以下行:

private TestB _testB;
Run Code Online (Sandbox Code Playgroud)

等于

TestB _testB;
Run Code Online (Sandbox Code Playgroud)

这同样适用于班级.

特殊修饰符

然后,有protected internal两个修饰符连接,因此您只能访问同一个程序集中的该类,或者从该类派生的类中访问该类,即使它不在同一个程序集中.例:

大会1:

public class TestA : TestB
{
    public TestB GetBase()
    {
        return (TestB)this;
    }

    public int GetA1()
    {
        return this.a1;
    }
}
protected internal class TestB
{
    public int a1 = 0;
}
Run Code Online (Sandbox Code Playgroud)

程序

TestA _testA = new TestA(); // OK
TestB _testB = new TestB(); // ERROR

int debugA = new TestA().a1 // ERROR
int debugB = new TestA().GetA1(); // OK

TestB testB_ = new TestA().GetBase(); // ERROR
Run Code Online (Sandbox Code Playgroud)

资源

链接(访问修饰符)

类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集访问.

只能通过同一个类或结构中的代码访问类型或成员.

类型或成员只能由同一个类或结构中的代码访问,或者在从该类派生的类中访问.

类型或成员可以由同一程序集中的任何其他代码或引用它的另一个程序集访问.