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

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

1、成员访问修饰符

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

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

1、类B是否派生自类A

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

成员的可访问性

准备

在第一个命名空间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的可见性如下所示:

image-20231120103627661

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

在同一程序集且继承自ClassA

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

image-20231120134924013

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

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

image-20231120135439199

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

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

image-20231120135753911

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

总结

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

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

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

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

image-20231120141244927

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

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

🎉表示可访问

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值