公众号「DotNet学习交流」,分享学习DotNet的点滴。

文末有总结,想快速浏览的朋友可直接看文末。

1、成员访问修饰符

在C#中类成员访问修饰符一共有5个,分别是public、private、protected、internal、protected internal。

类B能否访问一个类A的成员,取决于类B的两个特征:

1、类B是否派生自类A

2、类B和类A是否在同一程序集

2、成员的可访问性

准备

在第一个命名空间ClassMemberAccessibility_Demo中定义一个类ClassA,ClassA有5个属性分别被public、private、protected、internal、protected internal访问修饰符修饰,定义一个ClassB,再定义一个ClassC继承自ClassA,如下所示:

namespace ClassMemberAccessibility_Demo
{
   public class ClassA
  {
       public int Member1 { get; set; }
       private int Member2 { get; set; }
       protected int Member3 { get; set; }
       internal int Member4 { get; set; }
       protected internal int Member5 { get; set; }
  }
   public class ClassB
  {
       
  }
   public class ClassC : ClassA
  {

  }
   internal class Program
  {
       static void Main(string[] args)
      {
           
      }
  }
}

在第二个命名空间中添加对第一个命名空间的引用,然后在第二个命名空间,定义类ClassD,再定义一个ClassE,ClassE继承自ClassA,如下所示:

using ClassMemberAccessibility_Demo;
namespace ClassMemberAccessibility_Demo2
{
   public class ClassD
  {

  }
   public class ClassE : ClassA
  {

  }
   internal class Program
  {
       static void Main(string[] args)
      {
       
      }
  }
}

在同一程序集但不继承ClassA

ClassB与ClassA在同一程序集,但是不继承自ClassA,ClassA类成员对ClassB的可见性如下所示:

在ClassB内可访问Member1、Member4、Member5,修饰符分别是public、internal、protected internal。

在同一程序集且继承自ClassA

ClassC与ClassA在同一程序集,并且继承自ClassA,ClassA类成员对ClassC的可见性如下所示:

创建一个ClassC实例,可访问Member1、Member3、Member4、Member5,修饰符分别是public、protected、internal、protected internal。

不在同一程序集且不继承自ClassA

在ClassD内只能访问由public修饰的Member1。

不在同一程序集,但是继承自ClassA

可访问Member1、Member3、Member5,分别由public、protected、protected internal。

3、总结

5个修饰符的含义总结如下:

修饰符 含义
public 对任何类可访问
private 只在类的内部可访问
protected 对所有继承该类的类可访问
internal 对该程序集内所有类可访问
protected internal 对所有继承该类或在该程序集内声明的类可访问

要注意protected internal是protected和internal的并集而不是交集!!!

5个修饰符的可访问级别如下:

成员可访问性的总结如下:

  同一程序集非派生 同一程序集派生
public
private    
protected  
internal
protected internal
  不同程序集非派生 不同程序集派生
public
private    
protected  
internal    
protected internal  

表示可访问

参考

《C#图解教程(第4版)》——Daniel M. Solis

摘要

C#中类成员的访问修饰符有public、private、protected、internal、protected internal共5种,本文介绍了这5种修饰符的用法与可访问性。

一文搞懂C#中类成员的可访问性的更多相关文章

  1. 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质

    一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...

  2. 基础篇|一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  3. 一文搞懂 Prometheus 的直方图

    原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...

  4. Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!

    本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...

  5. 一文搞懂vim复制粘贴

    转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...

  6. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

  7. 三文搞懂学会Docker容器技术(下)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...

  8. 一文搞懂所有Java集合面试题

    Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...

  9. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  10. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

随机推荐

  1. redis集群:MASTER aborted replication with an error: NOAUTH Authentication required.

    发现个问题:redis集群所在服务器,磁盘空间很快就被占满,使用 "du -sh *"查看每个文件夹的大小,发现redis集群三个从节点的日志文件占用空间很大. 下面记录问题排查及 ...

  2. 为什么 API 治理需要内部倡导

    API 治理旨在帮助人们通过 API 实现最大价值.但是,只有了解 API 是什么以及 API 的重要性,并且认识到 API 治理是在帮助他们而不是监管他们,才能实现这一目标.这就是为什么在任何 AP ...

  3. 反汇编ARM程序的技术靠谱吗?——揭秘ARM架构二进制程序的反汇编技术现状

    ​  本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 参考发表在2020年软工顶会ISSTA的论文&l ...

  4. 入门篇-其之二-Java基础知识

    目录 对第一个Java程序的思考 外层结构--类 内层结构--main方法 输出语句 注释 单行注释 多行注释 文档注释 文档注释常用标签 使用javadoc命令生成网页风格的文档 阿里巴巴Java开 ...

  5. C# API复制/拷贝到剪辑板

    备忘 昨天在做一个程序的时候需要用到"剪辑板"功能, 可是死活引用不了"windows.forms"- (忘记添加引用了) 无奈只好去找了一个易语言的" ...

  6. T-SQL——关于数据合并(Merge)

    目录 0. 背景说明及测试数据 1. 直接清空,重新插入 2. 单条记录执行插入.更新操作 3. Merge函数 3.1 准备测试数据 3.2 测试Merge 3.3 关于Merge 4.参考 sha ...

  7. Hugging News #0912: Hugging Face 2 人入选时代周刊全球百大 AI 人物

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  8. Python 列表操作指南3

    示例,将新列表中的所有值设置为 'hello': newlist = ['hello' for x in fruits] 表达式还可以包含条件,不像筛选器那样,而是作为操纵结果的一种方式: 示例,返回 ...

  9. Llama2-Chinese项目:4-量化模型

    一.量化模型调用方式   下面是一个调用FlagAlpha/Llama2-Chinese-13b-Chat[1]的4bit压缩版本FlagAlpha/Llama2-Chinese-13b-Chat-4 ...

  10. 【Unity3D】消融特效

    1 前言 ​ 选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢 ...