zoukankan      html  css  js  c++  java
  • 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; // 正确
        }
    }
  • 相关阅读:
    第一次博客作业
    编辑器、编译器、文件、IDE等常见概念辨析
    树、二叉树、查找知识点总结
    二叉排序树
    线性表知识点总结
    c语言文件
    第二次博客作业: 函数+进制转换器v1.0beta
    python作业1
    c语言知识
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/sy-liu/p/13801847.html
Copyright © 2011-2022 走看看