Click here to Skip to main content
Click here to Skip to main content

C# Access Modifiers Quick Reference

, 21 May 2008 CPOL
Rate this:
Please Sign up or sign in to vote.
A quick description of access modifiers with a diagram showing accessibility limits
IllustrateAccessInCsharp2.png

Introduction

This is a very small article to illustrate C# access modifiers. This article is for beginners but even if you are an expert, this article may be useful as a quick reminder when the brain cells slow down - hey, I will probably need it soon.

Definition

An access modifier is a keyword you can add to your declaration of a class or class member to allow or restrict their accessibility.

The diagram above illustrates how each access modifier affects the accessibility of the class or member.

Using the Code

I kind of doubt you will need any more than the diagram as a reminder, but since I want to make this article more complete for beginners, here is some more content.

Now, a few examples:

    internal class Class1
    {
        private int Member1;
        protected int Member2;
        internal int Member3;
        protected internal int Member4;

        private class NestedClass
        {
            void Test(Class1 foo)
            {
                foo.Member1 = 0; //OK
                foo.Member2 = 0; //OK
                foo.Member3 = 0; //OK
                foo.Member4 = 0; //OK
            }
        }
    }

    public class Class2
    {
        private void Method1()
        {
        }

        private int _Member1;

        protected int Member1
        {
            get
            {
                return _Member1;
            }
            set
            {
                Method1();
                _Member1 = value;
            }
        }

        internal int Member2;
        public int Member3;
        protected internal int Member4;
    }

The above access modifiers prevent direct access as seen by the following access attempts. These attempts produce compilation errors:

From the same assembly as the above classes:

    class Test
    {
        void Test1()
        {
            Class1 c1 = new Class1(); //OK
            c1.Member1 = 0; //Compilation error here
            c1.Member2 = 0; //Compilation error here
            c1.Member3 = 0; //OK
            c1.Member4 = 0; //OK
        }
    }

    internal class DerivedClass : Class1
    {
        private void Test2()
        {
            Member1 = 0; //Compilation error here
            Member2 = 0; //OK
            Member3 = 0; //OK
            Member4 = 0; //OK
        }

        private class NestedClass
        {
            void Test(DerivedClass foo)
            {
                foo.Member1 = 0; //Compilation error here
                foo.Member2 = 0; //OK
                foo.Member3 = 0; //OK
                foo.Member4 = 0; //OK
            }
            void Test(Class1 foo)
            {
                foo.Member1 = 0; //Compilation error here
                foo.Member2 = 0; //Compilation error here
                foo.Member3 = 0; //OK
                foo.Member4 = 0; //OK
            }
        }
    }

From a different assembly from the above classes:

    public class Test
    {
        void Test1()
        {
            Class1 c1 = new Class1(); //Compilation error here

            Class2 c2 = new Class2(); //OK
            c2.Method1(); //Compilation error here
            c2._Member1 = 0; //Compilation error here
            c2.Member1 = 0; //Compilation error here
            c2.Member2 = 0; //Compilation error here
            c2.Member3 = 0; //OK
            c2.Member4 = 0; //Compilation error here
        }
    }

    internal class DerivedClass : Class2
    {
        private void Test2()
        {
            Member1 = 0; //OK
            Member2 = 0; //Compilation error here
            Member3 = 0; //OK
            Member4 = 0; //OK
        }
        private class NestedClass
        {
            void Test(DerivedClass foo)
            {
                foo.Member1 = 0; //Compilation error here
                foo.Member2 = 0; //Compilation error here
                foo.Member3 = 0; //OK
                foo.Member4 = 0; //OK
            }
            void Test(Class2 foo)
            {
                foo.Member1 = 0; //Compilation error here
                foo.Member2 = 0; //Compilation error here
                foo.Member3 = 0; //OK
                foo.Member4 = 0; //Compilation error here
            }
        }
    }

Points of Interest

In the examples above, you restrict direct access to Class2._Member1 but provide a wrapped property called Member1. The requirement is to ensure Method1 is called when _Member1 changes. The access modifiers ensure that we can only change _Member1 via the property.

That concludes the article.

History

  • 9th April, 2008: Initial version
  • 10th April, 2008: Modified to include more detail
  • 14th April, 2008: Modified diagram

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Johan Fourie
Architect
Australia Australia
No Biography provided

Comments and Discussions

 
SuggestionReally useful PinmemberBraj Panda11-Oct-13 0:48 
GeneralMy vote of 5 PinmemberPratik Bhuva26-Aug-13 4:02 
QuestionSummary - "protected" relaxed constraint "internal" and vice versa ("protected internal" = protected OR internal ) Pinmemberdevvvy18-Feb-13 2:32 
GeneralMy vote of 5 PinmemberSathiyanath11-Jun-12 15:13 
GeneralMy vote of 5 Pinmembermani2009it13-Apr-12 3:15 
GeneralMy vote of 5 Pinmemberdevvvy24-Feb-11 20:08 
GeneralDon't think diagram explains this case (access from NestedClass residing in same assembly) ... Pinmemberdevvvy24-Feb-11 16:12 
GeneralRe: Don't think diagram explains this case (access from NestedClass residing in same assembly) ... PinmemberJohan Fourie24-Feb-11 18:05 
GeneralRe: Don't think diagram explains this case (access from NestedClass residing in same assembly) ... [modified] Pinmemberdevvvy24-Feb-11 20:07 
GeneralSuggestion: Properties that are both protected and internal PinmemberDanovich9-Apr-08 3:40 
GeneralRe: Suggestion: Properties that are both protected and internal PinmemberJohan Fourie10-Apr-08 1:08 
GeneralRe: Suggestion: Properties that are both protected and internal PinmemberDanovich11-Apr-08 5:29 
GeneralRe: Suggestion: Properties that are both protected and internal PinmemberJohan Fourie12-Apr-08 1:22 
GeneralRe: Suggestion: Properties that are both protected and internal PinmemberDanovich14-Apr-08 6:51 
GeneralYou are missing the whole aspect of nested classes Pinmember leppie 9-Apr-08 3:29 
GeneralRe: You are missing the whole aspect of nested classes PinmemberJohan Fourie10-Apr-08 1:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.1411023.1 | Last Updated 22 May 2008
Article Copyright 2008 by Johan Fourie
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid