公众号「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. Proxmox VE软件防火墙的配置

    1 软件防火墙的基本概念 防火墙是计算机网络中用于保护网络安全的关键技术.防火墙可以是硬件设备部署在网络出口,也可以是软件部署在终端设备出口.本文主要介绍软件防火墙. 软件防火墙可以根据网络流量的方向 ...

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

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

  3. Elasticsearch 保姆级入门篇

    Elasticsearch 是一个分布式的.面向生产规模工作负载优化的搜索引擎. Kibana 可以将 Elasticsearch 中的数据转化为直观的图表.图形和仪表盘. 这篇文章,您将学习本地安装 ...

  4. 微服务集成redis并通过redis实现排行榜的功能

    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...

  5. 8、Spring之基于注解的自动装配

    8.1.场景模拟 8.1.1.UserDao接口及实现类 package org.rain.spring.dao; /** * @author liaojy * @date 2023/8/5 - 18 ...

  6. Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法

    这两天给我们开发的Chrome插件:Youtube中文配音增加了账户注册和登录功能,其中有一步是邮箱验证,所以这边会在Spring Boot后台给用户的邮箱发个验证信息.如果发邮件,之前的文章教程里就 ...

  7. MySQL高级9-锁

    一.简介 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除了传统的计算资源(CPU.RAM.i/O)的挣用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性,有效性 ...

  8. 在线问诊 Python、FastAPI、Neo4j — 创建药品节点

    目录 前提条件 创建节点 Demo 准备数据 创建药品标签节点 在线问诊 Python.FastAPI.Neo4j - 创建节点 Neo4j 节点的标签可以理解为 Java 中的实体. 根据常规流程: ...

  9. MySQL系列2:InnoDB存储引擎

    1. 架构回顾 上一篇我们讲解了MySQL的逻辑架构,重新回顾一下,用一张新的图来认识一下该架构. 整体架构分为service层与存储引擎层,请求交给连接池后,由后台线程处理,并将请求转发给SQL接口 ...

  10. 每日一题:AJAX进度监控(附可运行源码)

    1.什么是AJAX AJAX(Asynchronous JavaScript and XML)是一种用于在网页上进行异步通信的技术.它允许在不刷新整个页面的情况下,通过在后台与服务器进行数据交换来更新 ...