• 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) 我们还可以通过一个表格来总结一下,成员访问修饰符的范围:


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

  • 相关阅读:
    [ python ] 线程的操作
    [ python ] 进程的操作
    RabbitMQ 集群
    RabbitMQ 实践及使用
    RabbitMQ 基础知识
    [ python ] FTP作业进阶
    [ python ] 项目一:FTP程序
    [ python ] 网络编程(2)
    [ python ] 网络编程(1)
    Linux 日志系统及分析
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13856697.html
Copyright © 2020-2023  润新知