2017年7月14日 星期五

[C#] Access Modifier: public, protected, private, internal, protected internal

  • Modifiers
    • private
      • 僅供類別內部存取
    • internal 
      • 開放給專案內的其他程式
    • protected
      • 開放給予子類別存取成員
    • public 
      • 沒有存取限制
  • Code
    • LibraryA
      • ClassA
    
    namespace ClassLibraryA
    {
        public class ClassA
        {
            /// 
            /// String Variable declared as public
            /// 類型或成員可由相同組件或參考該組件的另一個組件中的任何其他程式碼存取。
            /// 
            public string sCasePublic { get; set; }
            /// 
            /// String Variable declared as private
            /// 類型或成員只能由相同類別或結構中的程式碼進行存取。
            /// 
            private string sCasePrivate { get; set; }
            /// 
            /// String Variable declared as protected
            /// 類型或成員只能由相同類別或結構中或衍生自該類別之類別中的程式碼進行存取。
            /// 
            protected string sCaseProtected { get; set; }
            /// 
            /// String Variable declared as internal
            /// 類型或成員可由相同組件中的任何程式碼存取,但是不包括其他組件中的程式碼。
            /// 
            internal string sCaseInternal { get; set; }
            /// 
            /// String Variable declared as protected internal
            /// 類型或成員可以由宣告它的組件中的任何程式碼或從其他組件中的衍生類別進行存取。
            /// 從其他組件中的存取必須在衍生自宣告 protected internal 項目之類別的類別宣告中進行,
            /// 而且必須透過衍生類別類型的執行個體進行。
            /// 
            protected internal string sCaseProtectedInternal { get; set; }
    
            public void function()
            {
                // sCasePublic
                // sCasePrivate
                // sCaseProtected
                // sCaseInternal
                // sCaseProtectedInternal
            }
        }
    }
    
    • LibraryA
      • ClassB
    
    namespace ClassLibraryA
    {
        class ClassB
        {
            public void function()
            {
                ClassA classA = new ClassA();
                //classA.sCasePublic
                //classA.sCaseInternal
                //classA.sCaseProtectedInternal
            }
        }
    }
    
    • LibraryA
      • ClassC
    
    namespace ClassLibraryA
    {
        class ClassC : ClassA
        {
            public void function()
            {
                //sCasePublic 
                //sCaseProtected
                //sCaseInternal
                //sCaseProtectedInternal
            }
        }
    }
    
    • LibraryB
      • ClassD
    
    using ClassLibraryA;
    
    namespace ClassLibraryB
    {
        public class ClassD
        {
            public void function()
            {
                ClassA classA = new ClassA();
                //classA.sCasePublic
            }
        }
    }
    
    • LibraryB
      • ClassE
    
    using ClassLibraryA;
    
    namespace ClassLibraryB
    {
        class ClassE : ClassA
        {
            public void function()
            {
                //sCasePublic
                //sCaseProtected
                //sCaseProtectedInternal
            }
        }
    }
  • Sealed
    • 套用至類別時,sealed 修飾詞可防止其他類別繼承自它
  • Ref: 
    • http://blog.darkthread.net/post-2013-09-19-friend-assembly.aspx
    • https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/accessibility-levels
    • http://unicorntudo.blogspot.tw/2013/07/c3-public-protected-private-internal.html


沒有留言:

張貼留言