C#:类的访问修饰符和类成员的访问修饰符

关于类的访问修饰符常见的有两个:公开的(public)、私有的(internal)

  • public修饰符修饰的类:在任何地方都能访问到他
  • internal修饰符修饰的类:只可以在当前程序集中访问,在其他程序集不可见,即:不可访问
  • internal修饰符修饰类的时候,可以省略;即internal是一种默认的类的访问级别。

新建一个解决方案,在该解决方案下新增两个项目,我们称一个项目为一个程序集,类的访问控制,就由下面的例子展开。

C#:类的访问修饰符和类成员的访问修饰符

1) 在MyClassLibrary中新增一个public修饰的MyLibrary类和Student类(由于没有使用任何修饰符,所以编译器默认它是internal,即私有的)

namespace MyClassLibrary
{
    public class MyLibrary
    {
        Student stu = new Student();
    }

    class Student
    {
        MyLibrary my = new MyLibrary();
    }
}

分析:无论类是公开的还是私有的,在MyClassLibrary程序集中,对于其他类都是可见的

  • 为了验证上述,我又在MyClassLibrary项目中,新增了一个文件夹,在该文件夹下新增了一个类,在该类中访问私有的Student
    C#:类的访问修饰符和类成员的访问修饰符
namespace MyClassLibrary.NewFolder1
{
    internal class ThirdClass
    {
        Student stu = new Student();
    }
}

说明私有类型,在程序集内部的访问是不受限制的。

2) 在另外一个程序集FirstApp中添加对MyClassLibrary程序集的引用,然后访问MyClassLibrary程序集中的类

C#:类的访问修饰符和类成员的访问修饰符

分析:public的MyLibrary类型,对于其它程序集是可见的;而internal(我们称它为显示私有的)ThirdClass类型和(隐式私有的)Student类型对于其它程序集是不可见的;

3) 通过简单的图例展示一下,公开和私有类型的类,访问权限是怎么样的

C#:类的访问修饰符和类成员的访问修饰符
对图例的说明:

  • 为了形象表示公开和私有,上图将私有的类框在了程序集内部,将公开的类暴露出程序集;
  • 由于私有的类型是我们声明类的时候默认的访问级别,它对于本程序集处处可见,所以就不再展示程序及内部各类之间的访问;

关于类的成员的访问修饰符常见的有五个: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)在引用该程序集的另一程序集中观察访问修饰符的使用:

C#:类的访问修饰符和类成员的访问修饰符
程序集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) 通过图例来理解一下成员访问修饰符

C#:类的访问修饰符和类成员的访问修饰符

4) 我们还可以通过一个表格来总结一下,成员访问修饰符的范围:

C#:类的访问修饰符和类成员的访问修饰符
以上便是对类的访问控制和类成员访问控制修饰符的一个总结;记录下来以便以后查阅。