一文搞懂C#中类成员的可访问性

简介: 一文搞懂C#中类成员的可访问性

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种修饰符的用法与可访问性。

目录
相关文章
|
7月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
76 0
|
API C#
C#反射与特性(三):反射类型的成员
C#反射与特性(三):反射类型的成员
284 0
|
6月前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
42 2
|
7月前
|
C# 开发者 索引
C# 11.0中的所需成员:强化接口与抽象类的约束
【1月更文挑战第24天】C# 11.0引入了所需成员(Required members)的概念,这一新特性允许在接口和抽象类中定义必须被实现的成员,包括方法、属性、索引器和事件。通过所需成员,C# 强化了对接口实现和抽象类继承的约束,提高了代码的一致性和可维护性。本文将详细探讨C# 11.0中所需成员的工作原理、使用场景及其对现有编程模式的影响。
|
7月前
|
C# 开发者 索引
C# 11.0中的静态抽象成员:接口中的新变革
【1月更文挑战第25天】C# 11.0引入了接口中的静态抽象成员,这一新特性为接口设计带来了更大的灵活性。静态抽象成员允许在接口中定义静态方法和属性,并要求实现类提供具体的实现。本文将详细探讨C# 11.0中静态抽象成员的工作原理、优势及其对现有编程模式的影响,旨在帮助读者更好地理解和应用这一新特性。
|
缓存 IDE API
C#反射与特性(五):主类型成员操作
C#反射与特性(五):主类型成员操作
401 0
C#反射与特性(五):主类型成员操作
|
缓存 算法 C#
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(下)
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(下)
104 0
|
缓存 算法 编译器
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(上)
【C#本质论 十】合式类型(一)重写Object成员及操作符重载(上)
85 0
C#(十六)之C#类中的成员属性 构造函数 析构函数
本篇内容记录了成员属性、构造函数、析构函数的一些基本用法。
309 0
C#(十六)之C#类中的成员属性 构造函数 析构函数
|
C#
C# 成员默认访问权限(public、private、protected、internal)
1.C#五个修饰符的权限修饰符    级别    适用成员        解释public    公开    类及类成员的修饰符   对访问成员没有级别限制private    私有    类成员的修饰符     只能在类的内部访问protected   受保护的  类成员的修饰符     ...
2842 0