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


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

  • 相关阅读:
    React元素渲染
    初识JSX
    微信小程序复制文本到剪切板
    微信小程序报错request:fail url not in domain list
    小程序,通过自定义编译条件,模拟推荐人功能
    积分抵扣逻辑
    微信小程序 switch 样式
    tomcat 配置开启 APR 模式
    tomcat8 传输json 报错 Invalid character found in the request target. The valid characters are defined in RFC 3986
    c++数组初始化误区
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13856697.html
Copyright © 2011-2022 走看看