一文搞懂C#中类成员的可访问性
公众号「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#中类成员的可访问性的更多相关文章
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂 Prometheus 的直方图
原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
- 一文搞懂 js 中的各种 for 循环的不同之处
一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
随机推荐
- asp.net core之路由
在 ASP.NET Core 中,路由是一个非常重要的概念,它决定了如何将传入的请求映射到相应的处理程序.本文将详细介绍 ASP.NET Core 中的路由系统,包括路由的基本原理.路由模板.路由参数 ...
- 合并两个不同远程仓库的Git命令
一.需求场景描述 远程仓库A:http://XXXA.git 远程gitlab,团队协作开发主仓库,新仓库 远程仓库B:http://XXXB.git 旧仓库 从A仓库和B仓库,都对同一个项目进行过开 ...
- Typescript - 索引签名
1 索引签名概述 在 TypeScript 中,索引签名是一种定义对象类型的方式,它允许我们使用字符串或数字作为索引来访问对象的属性. 1.1 索引签名的定义和作用 索引签名通过以下语法进行定义: { ...
- 架构师必会之-DBA级问题的数据库底层设计思想
大家好,我是sulny_ann,这期想跟大家分享一下我之前在面试里面问过比较难的数据库相关的问题. 大家经常也在调侃后端好像就是技术数据库的增删改查,所以作为后端开发,你对应数据库这一块掌握的怎么样, ...
- vue3 甘特图(二):甘特图时间轴切换
vue3 甘特图(二):gantt时间轴切换 1.固定时间轴缩放级别 gantt.config.scale_unit = "month"; //时间轴单位 gantt.config ...
- KRPano动态热点专用素材图50多个,加动态热点使用方法
KRPano动态热点专用素材是一种特定形式的序列图,该序列图要求帧的水平和垂直的具体位置必须准确,否则图的动作将会出现错乱,KRPano不支持动态图.目前网上比较匮乏动态热点素材,在此亲手整理制作了5 ...
- Java笔记(细碎小知识点)1
1.Dos命令:dir:打出当前目录结构:md:创建文件夹:cd+文件夹地址:跳转到当前目录下的对应文件夹:cd..:跳转到上一目录:rd+文件夹:删除文件夹中东西:del+文件(或 "*. ...
- Llama2-Chinese项目:3.1-全量参数微调
提供LoRA微调和全量参数微调代码,训练数据为data/train_sft.csv,验证数据为data/dev_sft.csv,数据格式如下所示: "<s>Human: &q ...
- 基于Spring事件驱动模式实现业务解耦
事件驱动模式 举个例子 大部分软件或者APP都有会有会员系统,当我们注册为会员时,商家一般会把我们拉入会员群.给我们发优惠券.推送欢迎语什么的. 值得注意的是: 注册成功后才会产生后面的这些动作: 注 ...
- FreeRTOS 和裸机的区别
FreeRTOS 和裸机的区别 01 FreeRTOS 简介 什么是FreeRTOS? 特点:实时性.可移植性.可扩展性 架构:内核.任务.调度器.通信机制 什么是裸机? 特点:无操作系统.直接操作硬 ...