访问修饰符
什么是访问修饰符
访问修饰符就是用来设置控制封装的这个目标的权限范围
权限范围:这个目标可以被哪些对象在什么地方可以访问到这个目标的数据
访问修饰符都有哪些
public
public访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。所有类或成员,任何代码均可访问该项
访问权限最大意味着最不安全
范围:类自己、同一个程序集、同一个项目中、和自己有血缘关系的类
private
private访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它 的私有成员。即使是类的实例也不能访问它的私有成员。
类的成员的默认访问修饰符是private
访问权限最小
意味着针对于对象自己而言最安全
范围:类自己
protected
protected访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。类和内嵌类的成员,只有派生类可以访问该项
范围:类自身、具有血缘关系的类
internal
internal访问修饰符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有
internal访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
类的默认访问修饰符是internal
范围:类自身、同一程序里面的所有类
protected internal/internal protected
protected internal访问修饰符允许一个类将其成员变量和成员函数对同一应用程序内的子类以外的其他的类对象和函数进行隐藏。这也被用于实现继承。类和内嵌类的所有成员,只能包含它的程序集和派生类型的任何代码中访问该项
其他修饰符
new
作用:
1.用作于实例新对象
2. 用于继承中函数的隐藏
static
- static可以修饰类、以及类成员(类中的全局成员)
- static修饰类,则类中的成员也全部是static
- 静态类不允许实例化
- 静态类中的公开成员直接使用类名点进行访问
- 非静态类中的公开静态成员通过类名点访问,非静态成员通过实例化对象点访问
virtual
设置虚拟成员,放在正常类中,这个类可以直接实例对象进行使用,也可以在其派生类中对虚拟成员进行重写使用
abstract
抽象成员,必须放在抽象类中,抽象成员只有成员的声明不允许有成员的实现,抽象类不能实例成对象,抽象成员在其派生 类中实现之后方可被使用
override
派生类中的成员可以使用override,前提是基类中的相同命名成员必须是virtual或者abstract
sealed
密封类,最终类,不允许被继承类、方法或属性,对于类代表密封,不允许继承该类,对于属性和方法,成员重写已继承的虚拟成员,但任何派生类中的任 何成员都不能重写该成员。该修饰符必须和override一起使用。
this
在一个类的成员内部,this关键字代表对象自身,也可以使用this关键字对类自身的成员进行访问
用于引用类的当前实例,也包括继承而来的方法,通常可以隐藏this。 MSDN中的小结功能主要包括:
(1)限定被相似的名称隐藏的成员 (2)将对象作为参数传递到其他方法 (3)声明索引器 this指代类对象本身,用于访问本类的所有常量、字段、属性和方法成员,而且不管访问元素是任何访问级别。因为,this仅仅局限于对象内部,对象外部是无法看到的,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能在静态方法中引用this。
base
在一个类中代表其父类,可以使用base访问父类的类成员
用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。 MSDN中小结的具体功能包括: (1)调用基类上已被其他方法重写的方法。 (2)指定创建派生类实例时应调用的基类构造函数。
base常用于,在派生类对象初始化时和基类进行通信。 base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。 在多层继承中,base可以指向的父类的方法有两种情况:一是有重载存在的情况下,base将指向直接继承的父类成员的方法;而没有重载存在的情况下,base可以指向任何上级父类的公有或者受保护方法。
通用规则:
1、尽量少用或者不用base和this。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this 的使用容易引起不必要的结果。 2、在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。 3、base是为了实现多态而设计的。 4、使用this或
base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。 5、简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。 6、除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。