C#访问修饰符学习整理

2017-05-06 02:39

C#访问修饰符

分类

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

访问范围

首先贴出MSDN上关于访问修饰符的访问范围限制说明。
C#访问修饰符学习整理0

上图中的访问修饰修饰的是类的成员,假设类名为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内部
  • 五种方法的访问测试结果如下:
    C#访问修饰符学习整理1
    可以看出,protected internal是protected和internal的并集。

    class, enum, struct, interface修饰符

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

    其余的修饰符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上关于默认修饰符的说明:
    C#访问修饰符学习整理2
    其中,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。