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

摘要:
类有两个常见的访问修饰符:public和private public修饰符修改类:由其他内部修饰符修改的类可以在任何地方访问:它们只能在当前程序集中访问,当其他程序集不可见时,也就是说,当内部修饰符修改类无法访问时,可以省略;也就是说,internal是默认类的访问级别。

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

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

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

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

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#:类的访问修饰符和类成员的访问修饰符第2张
namespace MyClassLibrary.NewFolder1
{
    internal class ThirdClass
    {
        Student stu = new Student();
    }
}

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

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

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

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

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

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

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

关于类的成员的访问修饰符常见的有五个: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#:类的访问修饰符和类成员的访问修饰符第5张
程序集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#:类的访问修饰符和类成员的访问修饰符第6张

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

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

免责声明:文章转载自《C#:类的访问修饰符和类成员的访问修饰符》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]oracle11g数据库导入导出方法教程最大熵模型和EM算法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

docker安装宝塔

主机的/home/www文件夹映射到docker容器的/www(注意:如果文件目录不存在,特权意味着在运行容器时,容器被授予特权,容器有权写入文件。然后问题来了……安装完成后,如果重新启动容器,容器宝塔会丢失吗?不,让我们试试:...

【转】Kettle集群

本文转自:http://blog.csdn.net/dqswuyundong/article/details/5952009KettleCluster Kettle是一个开源ETL工具,以其效率和可扩展性而闻名于业界。其高效的一个重要原因是其多线程和集群功能。Kettle的多线程采用了管道并发机制,这在另一篇文章中专门介绍。本文主要介绍水壶集群。群集允许转换...

ZFS文件系统及Freenas介绍

作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布。它被Sun称为终极文件系统,已经积极开发了10年。ZFS的最大优点之一是,当将其他磁盘添加到池中时,现有文件系统可以自动增长。ZFS使用快照来跟踪文件系统中的更改。5.数据完整性验证和自动修复当新数据写入ZFS时,将创建数据的校验和,从而允许文件系统分叉到新数据集中。...

通过 java的 esl 连接 freeswitch

--所有ip都能通过esl连接到freeswitch--˃4.reloadmod_event_socket5.通过java的esl连接fs服务器三、报错[WARNING]mod_event_socket.c:2641IPx.x.x.xRejectedbyacl"loopback.auto"四、以前版本按照步骤二操作完就可以了,现在报错了。世界变化的太快。--...

如何让 ESLint 同时检测 js 和 ts

但是ESLint默认使用Espree作为其解析器,在某些情况下不支持TypeScript语法。另外,TypeScript是JavaScript超集,有更多的语法,ESLint本身提供的规则无法满足。ESLint有一项overrides的配置,可以为某个文件或者某组文件进行覆盖配置。因此,我们可以设置ts文件使用@typescript-eslint/parse...

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!

最近,基于C#的拖缆的发展并不理想。最后,经过不懈的努力,我取得了一些成绩。这是一张便条;本文重点介绍如何将ffmpeg用于简单的流式传输。如果没有官方文档WithFilter.WithField,简单的代码行似乎很难。拉动();以上是流和获取流的核心代码,保存在本地=TargetType。Live){thrownewApplicationException...