public:
对任何类和成员都公开,无限制访问;
protected:
仅仅对该类以及该类的派生类公开;
private:
仅仅对该类公开;
internal:
只能值包含该类的程序集中访问该类;
protected internal:
只能在本类、派生类或者包含该类的程序集中访问。
关系如下:
private
这个很明显了。
关键是protected和internal的问题。
protected限定的是只有在继承的子类中才可以访问,可以跨程序集
internal限定的是只有在同一个程序集中才可以访问,可以跨类
所以它们是有点交叉的。
当一个class是internal的时候,要求其所有的成员的限定范围不能大于internal。
所以,当一个internal的class写protected的时候,就需要两个限定符了:
internal protected
这样,限定了访问范围是:本程序集、继承的子类。
因此,关系是:
private < internal protected < internal/protected < public
internal和protected的具体范围大小就不能准确的界顶了。
说白了,被 internal 修饰的东西只能在本程序集(当前项目)内被使用。
被 protected internal 修饰的属性/方法 可以在其他项目中,被派生类使用。
例如有两个项目app1和app2,app1是启动项目,而app2只是一个类库:
/*项目app2*/
namespace app2
{
internal class cInternal //该类只能在app2中使用(整个类都internal,相当于所有的属性也全都internal了)
{
public int a;//只有app2中可以使用
internal int b;//同上,只有app2中可以使用
}
public class vInternal //该类可以在app1中使用(只要引用app2即可) 但是在app2之外的其他项目中不能使用此类中被internal修饰的属性/方法
{
internal int a;//只能在app2中使用
protected internal int b;//在app2中任意使用,在app1中不可以直接使用,但是可以被app1中的继承自该类的类使用。
public int c;//app1 app2中任意使用
protected internal void Display()//在app2中任意使用,在app1中不可以直接使用,但是可以被app1中的继承自该类的类使用。
{Console.WriteLine(“Hello protected Internal”);}
}
}//namespace app2
/*项目app1*/
using app2;
namespace app1
{
class app1()
{
app2.cInternal InternalClass = new app2.cInternal();//!!! ERROR !!! – cInternal被internal修饰,只能在app2中使用
app2.vInternal InternalVar = new app2.vInternal ();//OK – vInternal 被public修饰,能在任何地方使用
InternalVar.a = 100;//!!! ERROR !!! – 被internal修饰,只能在app2中使用
InternalVar.b = 100;//!!! ERROR !!! – 被protected internal修饰,不能在外部项目中直接使用。
InternalVar.c = 100;//OK
InternalVar.Display();//!!! ERROR !!! – 被protected internal修饰,不能在外部项目中直接使用。
}//classAPP1
class InheritFromInternal:app2.vInternal//继承了vInternal,于是可以使用vInternal中被protected internal修饰的属性
{
base.a = 100;//!!! ERROR !!! – 被修饰为internal的属性只能在app2中使用.
base.b = 100;//OK – 被修饰为protected internal的属性可以被派生类使用.
base.Display();//OK – 被修饰为protected internal的属性可以被派生类使用.
}//classInheritFromInternal
}//namespace app1
另外:
貌似protected,internal,protected internal只能修饰嵌套类(nested class),下面代码编译错误:
protected class C
{
public int GetC()
{
return 3;
}
}
错误信息:Namespace elements cannot be explicitly declared as private, protected, or protected internal
微软官方解释:不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。
Tips:
命名空间上不允许使用访问修饰符。命名空间没有访问限制。
一个成员或类型只能有一个访问修饰符,使用 protected internal 组合时除外
最后注意:
assembly中的class默认访问修饰符为internal
类中的字段默认为private
类中的方法默认为private,包括构造函数
[转自:http://blog.csdn.net/manmadewind/article/details/6638454]
分类目录
- arch/management (17)
- computer (38)
- java/j2ee (304)
- lnmpa (237)
- mac/iphone/ipad/android (11)
- mysql/oracle/postgresql (126)
- os/software (74)
- other (518)
- python (6)
- redis/memcached/mongo (31)
- sitebuild (143)
随便看看
标签云
程序员 创业 人生箴言 eclipse 快捷键 术语 索引 unix命令 vim wordpress java学习笔记 环境变量 oracle内置函数 index 人生 数据类型 nohup tuxedo mysql学习笔记 MS-DOS命令 servlet spring 职场进阶 职业进阶 服务器选购 服务器选型 apache JPA MongoDB 注解 tomcat 子女教育 jquery maven JVM aix命令 网络营销 java异常 seo 人生规划 关键字 css 网络推广 struts 系统优化 成长 frame iframe bluehost jdbc select 我的信仰 oracle函数 cookie HashMap 站长工具 乱码 ArrayList secureCRT jsp session tail find halt 事务 oracle单记录函数 算法 URL window table javascript操作表单元素 String 字符串处理 健康 http 域名 情感 more google A记录 域名解析 netstat 弹出对话框 弹出窗口 框架集 框架 excel 字符串 javascript函数 showModalDialog nginx number 数组 sql frameset 开源程序 java数组 软件 oracle服务友情链接
收藏链接