C#访问修饰符学习整理

C#访问修饰符


分类

C#访问修饰符一共有五种,分别为private, internal, protected, protected internal, public
它们都可以用来修饰类中的成员,如字段,属性,方法,事件等。对于修饰class,enum,struct,嵌套类,及其各自默认修饰符的情况,我们稍后讨论,先来看类内部成员的访问范围。

访问范围

首先贴出MSDN上关于访问修饰符的访问范围限制说明。

上图中的五种访问修饰符修饰的是类的成员,假设类名为TestClass,并且这5种修饰符分别在类TestClass中以下修饰了5种方法:

class TestClass
    {
        private void Foo_Private()
        {
            
        }
        internal void Foo_Internal()
        {

        }
        protected void Foo_Protected()
        {
            
        }
        protected internal void Foo_ProtectedInternal()
        {
            
        }
        public void Foo_Public()
        {
            
        }
    }

那么访问修饰符的解释如下:

  • public : 访问无限制。
  • protected : 访问限制为包含此成员的类TestClass内部,或者TestClass派生类内部。
  • internal : 访问限制为当前程序集内。
  • protected internal : 访问限制为当前程序集,或者TestClass的派生类。
  • private : 访问限制为TestClass内部

五种方法的访问测试结果如下:

可以看出,private的访问范围最小,访问范围只限于类的内部。public的访问范围最大,无限制。internal的访问范围限制为当前程序集,在当前类内部,派生类内部,程序集内其它类内部都可以访问。protected的访问范围是当前类内部和派生类内部,无论是当前程序集还是其它程序集,只要是它的派生类,那么就可以访问。protected internal是protected和internal的并集,它们是或的关系,即符合protected或者internal的访问范围,都是protected internal的访问范围。

class, enum, struct, interface修饰符

在命名空间下,可以用于修饰class, enum, struct, interface的修饰符只有internalpublic,指定该结构的访问范围是程序集内,还是无限制。

其余的修饰符private, protected, protected internal不能用来修饰命名空间下的class, enum, struct, interface。为什么这样呢?举个例子,使用private修饰class之后,这个类对于程序集内其它类不可见,那么这个类就没有办法使用,也就毫无意义了。

class, enum, struct, interface默认修饰符

在命名空间下,class, enum, struct, interface的默认修饰符为internal,即:

internal class TestClass
{
    
}

class TestClass
{
    
}

这两种定义等价。

class, enum, struct, interface内部成员默认修饰符

先贴MSDN上关于默认修饰符的说明:

其中,enum和interface内部成员默认访问修饰符为public,而class和struct内部成员的默认访问修饰符为private。在class中,五种访问修饰符都可以使用,在struct中,由于不存在继承关系,protected和protected internal都不能使用。

嵌套类修饰符

嵌套类可以看做是类的内部成员,因此,其访问修饰符和类的字段,属性,方法一样。来看一段代码示例:

class TestClass1
    {
        public class TestClass2
        {

        }
        internal class TestClass3
        {
            
        }
        protected class TestClass4
        {
            
        }
        protected internal class TestClass5
        {
            
        }
        private class TestClass6
        {
            
        }
        class TestClass7
        {
            
        }
    }

这样定义嵌套类没有任何问题,相当于定义了类的普通成员。嵌套类的默认修饰符为private

原文地址:https://www.cnblogs.com/dst5650/p/6813364.html