一文搞懂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通信部份进行实践记录. 本文分享自 ...
随机推荐
- [pytest]基础
简介 The pytest framework makes it easy to write small, readable tests, and can scale to support compl ...
- [python]enumerate迭代
Python中有个内置的函数叫做 enumerate,可以在迭代时返回元素的索引. # 示例代码01 warframe = ["saryn", "wisp", ...
- 干了这么多年C#,后悔没早点用这种“分页”,简单/高效/易维护
[前言] 干了这么多年C#,后悔没早点用这种"分页",简单/高效/易维护,比其它的分页方式强多了,不信你自己看. [正文] 支持.Net Core(2.0及以上)与.Net Fra ...
- Nessus 10.5.3 漏洞扫描器的下载安装与卸载
测试环境 Kali 2023.2 本教程使用脚本进行自动化安装.破解 文章地址:https://www.iculture.cc/software/pig=25546#wznav_7 偶然发现,特别好用 ...
- centos7.X安装mysql5.7 – 东凭渭水流
1.下载mysql5.7 可以使用windows下载好后上传至Linux.网络条件好的推荐使用 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/m ...
- K8S集群中使用JD KMS服务对敏感数据安全加密
基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密.以保护敏感数据, 驱动和插件需要使用者 ...
- 重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!
引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face! Falcon 180B ...
- Antd Form表单中Input输入框 在IE9下按下任何按键都会报校验失败
antd Form表单中Input输入框 在IE9下按下任何按键都会报校验失败,导致输入框输入不了任何内容! 可能你的react及react-dom版本由于过高导致antd组件不能兼容,需要对reac ...
- PivotGridControl自定义行数据的统计公式
我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明 数据源: 注意:此时数据列指定的SummaryT ...
- 在 Mac 上撰写和格式化备忘录-添加提醒-添加日历
在 Mac 上撰写和格式化备忘录 您可以撰写备忘录以及更改备忘录的格式,例如,更改字体大小或对齐方式,或者使文本变为粗体.如果您使用的是升级后的 iCloud 备忘录或者储存在您 Mac 上的备忘录, ...