访问限制符总结

时间:2021-08-25 09:49:03
总的来说, 

C#中使用访问修饰符 public、protected、internal 或 private 可以为成员指定以下声明的访问级别之—,声明的可访问性含义如下:
1、public
访问不受限制。
2、protected
访问仅限于包含类或从包含类派生的类型。
3、internal
访问仅限于当前程序集。
4、protected internal
访问仅限于从包含类派生的当前程序集或类型。
5、private
访问仅限于包含类型。


一个成员或类型只能有一个访问修饰符,但使用 protectedinternal 组合时除外。命名空间上不允许使用访问修饰符。命名空间没有访问限制。根据出现成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。
不嵌套在其他类型中的*类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。嵌套类型是其他类型的成员,它们可以具有下表所示的声明的可访问性。


internal,英文含义是“内部的”,这时候基础不扎实的同学,可能就混淆了这个“内部的”的确切含义,到底是指“同一命名空间”的内部,还是“同一程序集”的内部,本人就是突然被问到这个问题的时候,真的就犹豫了,而且曾经一度以为就是“同一命名空间”的内部(话外:我们太多时候都自以为了,其实只要自己稍微MSDN查一下,就很清楚了)。

  第一部分已经摘抄了微软MSDN官方的解释,其实这个内部就是“同一程序集”的内部,也就是说,internal修饰的方法或者属性,只要是在同一个程序集的中的其他类都可以访问,如果二者不在同一命名空间,只要使用using引用上相应的命名空间即可,这里,从另外一个方面也间接看出命名空间并不是界定访问级别的,而是保证全局的类唯一性的,


程序集:在.NET 中,新引入了一个程序集的概念,就是指经由编译器编译得到的,供CLR进一步编译执行的那个中间产物,在WINDOWS系统中,它一般表现为.dll,或者是.exe的格式,但是要注意,它们跟普通意义上的WIN32可执行程序是完全不同的东西,程序集必须依靠CLR才能顺利执行。之所以要编译为程序集然后由.NET FRAMEWORK解析执行,就是为了实现跨平台的功能。并且由CLR解析执行可以针对不同的具体平台生成具体针对性的优化代码,对执行效率也有好处。也可以理解为包含了很多类的集合,比如一个类也可以作为程序集、一个类库也可以作为一个程序集。只要在能够引用的都可以理解为程序集。


  java中4中修饰符分别为public、protect、default、private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高。

    下面详细讲述下它们的访问权限问题。(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况。)

    首先在这里把它们的访问权限表示出来:

    访问权限   类   包  子类  其他包

    public     ∨   ∨   ∨     ∨

    protect    ∨   ∨   ∨     ×

    default    ∨   ∨   ×     ×

    private    ∨   ×   ×     ×