C# Internal 和 protected internal 关键字

Internal

  internal(内部)关键字是类型(Type)和成员(member)的访问修饰符。

  Internal types or members(内部类型和成员)只能被在同一程序集(Assembly)中的文件访问

内部访问的常见用法是在基于组件的开发中,因为它使一组组件能够以私有方式进行协作,而不会暴露给其余的应用程序代码。例如,用于构建图形用户界面的框架可以提供Control和Form类,这些类通过使用具有内部访问权限的成员进行协作。由于这些成员是内部成员,因此它们不会暴露给使用框架的代码

  外部程序集引用具有内部访问权限的类型或成员(a type or member)是错误的

Protected Internal

  受保护的内部(protected internal)关键字组合是成员(member)访问修饰符。可从类当前程序集或从包含类派生的类型访问受保护的内部成员。

  基类的受保护内部成员可以通过其包含的程序集中的任何类型进行访问。仅当通过派生类类型的变量进行访问时,也可以在位于另一个程序集中的派生类访问它

例子

/*************************************************************************
 *  File                        :  InternalA.cs
 *  Author                 :  DavidLiu
 *  Date                     :  2020-10-12
 *  Description        :  
 *************************************************************************/
/// <summary>
/// 该文件在Assembly在AssemblyA程序集中
/// </summary>

internal class AssemblyA1
{
    
}
public class AssemblyA2
{
    internal float a;
    protected bool c;
    protected internal bool b;
}
public class AssemblyA3: AssemblyA2
{
   public void Get()
    {
        float d = this.a;//错误因为a成员时internal关键字修饰的内部成员
        bool c = this.b;// 正确
    }
}

public class AssemblyA4
{
    public void Get()
    {
        AssemblyA2 assemblyA2 = new AssemblyA2();// 正确
        assemblyA2.a = 1;// 正确
        assemblyA2.b = true;// 正确
        assemblyA2.c = false;// 错误因为c是protected修饰的只能被子类访问
    }
}
/*************************************************************************
 *  File                        :  InternalB.cs
 *  Author                 :  DavidLiu
 *  Date                     :  2020-10-12
 *  Description        :  
 *************************************************************************/
using UnityEngine;
/// <summary>
/// 该文件在AssemblyB程序集中
/// </summary>
public class AssemblyB1
{
    public void Get()
    {
        AssemblyA1 assemblyA1 = new AssemblyA1();// 错误因为AssemblyA1类型是用internal修饰的类
        AssemblyA2 assemblyA2 = new AssemblyA2();
        float a = assemblyA2.a;//错误因为a成员时internal关键字修饰的内部成员
        bool b = assemblyA2.b;// 错误因为a成员时protected internal关键字修饰的受保护的内部成员
        bool c = assemblyA2.c;// 错误因为c是protected修饰的只能被子类访问
    }
}

public class AssemblyB2: AssemblyA2
{
    public void Get()
    {
        float a = this.a;//错误因为a成员时internal关键字修饰的内部成员
        bool b = this.b;// 正确
        bool c = this.c; // 正确
    }
}
原文地址:https://www.cnblogs.com/sy-liu/p/13801847.html