C#:类的访问修饰符和类成员的访问修饰符
关于类的访问修饰符常见的有两个:公开的(public)、私有的(internal)
- public修饰符修饰的类:在任何地方都能访问到他
- internal修饰符修饰的类:只可以在当前程序集中访问,在其他程序集不可见,即:不可访问
- internal修饰符修饰类的时候,可以省略;即internal是一种默认的类的访问级别。
新建一个解决方案,在该解决方案下新增两个项目,我们称一个项目为一个程序集,类的访问控制,就由下面的例子展开。
1) 在MyClassLibrary中新增一个public修饰的MyLibrary类和Student类(由于没有使用任何修饰符,所以编译器默认它是internal,即私有的)
namespace MyClassLibrary
{
public class MyLibrary
{
Student stu = new Student();
}
class Student
{
MyLibrary my = new MyLibrary();
}
}
分析:无论类是公开的还是私有的,在MyClassLibrary程序集中,对于其他类都是可见的
- 为了验证上述,我又在MyClassLibrary项目中,新增了一个文件夹,在该文件夹下新增了一个类,在该类中访问私有的Student
namespace MyClassLibrary.NewFolder1
{
internal class ThirdClass
{
Student stu = new Student();
}
}
说明私有类型,在程序集内部的访问是不受限制的。
2) 在另外一个程序集FirstApp中添加对MyClassLibrary程序集的引用,然后访问MyClassLibrary程序集中的类
分析:public的MyLibrary类型,对于其它程序集是可见的;而internal(我们称它为显示私有的)ThirdClass类型和(隐式私有的)Student类型对于其它程序集是不可见的;
3) 通过简单的图例展示一下,公开和私有类型的类,访问权限是怎么样的
对图例的说明:
- 为了形象表示公开和私有,上图将私有的类框在了程序集内部,将公开的类暴露出程序集;
- 由于私有的类型是我们声明类的时候默认的访问级别,它对于本程序集处处可见,所以就不再展示程序及内部各类之间的访问;
关于类的成员的访问修饰符常见的有五个:public、internal、proteced、private;
- public修饰的类成员,在本程序集或引用本程序集合的其它程序集中都可以访问该成员;
- internal修饰的类成员,在本程序集内可以访问到该成员;
- protected修饰的类成员,只能在本类中或者派生自该类的子类中访问该成员;
- private修饰的成员,只能在本类中访问该成员。
1) 下面通过代码示例展示在同一程序集中访问修饰符的使用:
namespace A
{
public class A1
{
public string Name { get; set; }
internal string hobby { get; set; }
private int accountId;
public A1()
{
A2 a2 = new A2();
//internal修饰的成员 在本程序集中 都是可以访问的
Console.WriteLine(a2.Adress + "" + a2.Name);
}
}
class A2
{
public string Name { get; set; }
internal string Adress { get; set; }
private int size;
public A2()
{
A1 a1 = new A1();
Console.WriteLine(a1.Name + "" + a1.hobby);
}
}
}
在同一程序集中,internal、public修饰的成员的访问是不受限制的
2)在引用该程序集的另一程序集中观察访问修饰符的使用:
程序集B中声明父类型Shape
namespace B
{
public class Shape
{
protected int Height { get; set; }
protected int Width { get; set; }
decimal cost;
public int Area { get; set; }
}
class Car
{
public Car()
{
Shape shape = new Shape();
Console.WriteLine(shape.Area);//只能访问到public的Aera,其余都不可访问
}
}
}
在程序集A中,先添加B程序集的引用,然后添加如下代码
namespace A
{
public class A1
{
public string Name { get; set; }
internal string hobby { get; set; }
private int accountId;
public A1()
{
Shape shape = new Shape();
Console.WriteLine(shape.Area);//也是只有一个public成员能够被访问
}
}
class Square : Shape
{
public Square()
{
A1 a1 = new A1();
//hobby是internal类型在本程序集中都可以访问;Name是public,在任何地方都可以被访问到
Console.WriteLine(a1.hobby+""+a1.Name);
//由于Height、Width是protected,所以在Shape的派生类中,可以访问到这两个程序
Console.WriteLine(Height + "" + Width + "" + Area);
}
}
}
3) 通过图例来理解一下成员访问修饰符
4) 我们还可以通过一个表格来总结一下,成员访问修饰符的范围:
以上便是对类的访问控制和类成员访问控制修饰符的一个总结;记录下来以便以后查阅。