访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类、类成员变量进行访问控制。同时,访问控制符也是语法保留关键字,用于封装组件。
Public,Privater,Protected at Class Level
在创建类时,我们要考虑类的作用域范围,如谁可访问该类,谁可访问该类成员变量,谁可访问该类成员函数。换而言之,我们需要约束类成员的访问范围。一个简单的规则,类成员函数、类成员变量之间可以自由访问不受约束,这里主要说的是外部访问约束。在创建Class的时候,默认的访问控制符是private。
下面做一个小实验,打开VS,创建一个C#的Console应用,命名为ACCESSMODIFIERS。添加一个类,命名为Modifiers,拷贝如下代码:
using System;
namespace AccessModifiers
{
class Modifiers
{
static void AAA()
{
Console.WriteLine("Modifiers AAA");
}
public static void BBB()
{
Console.WriteLine("Modifiers BBB");
}
}
class Program
{
static void Main(string[] args)
{
Modifiers.BBB();
}
}
}
上面的代码创建了一个类Modifiers,它有2个static函数:AAA,BBB。其中BBB是public访问修饰符,在Main中调用BBB结果如下:
Modifiers BBB
BBB被标记为public,即任何函数皆可访问和运行。AAA被标记为private,即AAA仅能被其类内函数访问,外包是无法访问的。
修改代码如下:
class Program
{
static void Main(string[] args)
{
Modifiers.AAA();
Console.ReadKey();
}
}
则运行报错:
‘AccessModifiers.Modifiers.AAA()’is inaccessible due to its protection level
下面我们对AAA进行重构,修改如下:
using System;
namespace AccessModifiers
{
class Modifiers
{
protected static void AAA()
{
Console.WriteLine("Modifiers AAA");
}
public static void BBB()
{
Console.WriteLine("Modifiers BBB");
AAA();
}
}
class Program
{
static void Main(string[] args)
{
Modifiers.AAA();
Console.ReadKey();
}
}
}
运行结果:
‘AccessModifiers.Modifiers.AAA()’is inaccessible due to its protection level
即protected修饰符成员变量,仅能被其同类、子类访问,外部无法访问。
继承修改
我们接着添加子类,来扩展这个实例:
using System;
namespace AccessModifiers
{
class Modifiers
{
static void AAA()
{
Console.WriteLine("Modifiers AAA");
}
public static void BBB()
{
Console.WriteLine("Modifiers BBB");
}
protected static void CCC()
{
Console.WriteLine("Modifiers CCC");
}
}
class ModifiersDerived:ModifiersBase
{
public static void XXX()
{
AAA();
BBB();
CCC();
}
}
class Program
{
static void Main(string[] args)
{
ModifiersDerived.XXX();
Console.ReadKey();
}
}
}
运行结果:
‘AccessModifiers.ModifiersBase.AAA()’is inaccessible due to its protection level
原因是AAA默认为private访问控制符,仅可在基类中访问,子类无法访问。
1.Class成员的默认修饰符为private
2.class 被标记为internal仅能被当前程序集访问.
3.Namespace默认为public修饰符,且不能添加修饰符。
4.class可以使用public 或 internal修饰符.不能使用修饰符 protected 、 private. class默认的修饰符为internal.
5.类成员可使用所有修饰符,默认为 private.
6.Protected internal修饰符约定了仅在继承类内有效.
7.在public 与 internal修饰符之间,public通常有更大的访问权限.
8.基类必须必子类有更大的修饰符访问权限,才可被子类继承.
9.函数返回值的修饰符要有能访问返回值的权限.
10.sealed Class无法被子类继承.
11.const变量,需要在声明时完成初始化,在编码阶段不能初始化.
12.类的const变量,可以彼此引用,但是不能形成循环引用.
13.const变量在编译器进行初始化,故const的运算可被执行.
14.const变量不能被标记为static.
15.Static 变量在类首次被加载时候初始化. int类型默认初始化为0,bool被初始化为False.
16.static readonly 字段无法被赋值,static构造函数或者变量初始化时刻除外.