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; // 正確 } }
