Access Modifiers in C#

 

Access modifiers are an integral part of object-oriented programming. They support the concept of encapsulation, which promotes the idea of hiding functionality. Access modifiers allow you to define who does or doesn't have access to certain features.

 

  • Public
  • Private
  • Protected
  • Internal
  • Protected Internal

 

Public:

 

The public keyword is an access modifier for types and type members. Public access is the most permissive access level.

Accessibility:

Can be accessed by objects of the class

Can be accessed by derived classes

 

using System;

namespace AccessModifiers

{

    class Sample

    {

        class AccessMod

        {

            public int num1;

        }

        static void Main(string[] args)

        {

            AccessMod obj1 = newAccessMod();

            //Direct access to public members

            obj1.num1 = 100;

            Console.WriteLine("Number one value in main {0}", obj1.num1);

            Console.ReadLine();

        }

    }

}

 

Private

 

Private access is the least permissive access level.

Private members are accessible only within the body of the class or the struct in which they are declared.

Accessibility:

Cannot be accessed by object

Cannot be accessed by derived classes

using System;

namespace AccessModifiers

{

    class Sample

    {

        classAccessMod

        {

            public int num1;

            int num2;

        }

        static void Main(string[] args)

        {

            AccessMod obj1 = newAccessMod();

            //Direct access to public members

            obj1.num1 = 100;

            //Access to private member is not permitted

            obj1.num2 = 20;

            Console.WriteLine("Number one value in main {0}", ob1.num1);

            Console.ReadLine();

        }

    }

}

The above snippet will give compilation error, because access to private is not allowed.

 

Protected

A protected member is accessible from within the class in which it is declared, and from within any class derived from the class that declared this member.

A protected member of a base class is accessible in a derived class only if the access takes place through the derived class type.

Accessibility:

Cannot be accessed by object

By derived classes

 

using System;

namespace AccessModifiers

{

    class Sample

    {

        class Base

        {

            protected int num1;

        }

        class Derived : Base

        {

            public int num2;

            static void Main(string[] args)

            {

                Base ob1 = new Base();

                Derived ob2 = new Derived();

                ob2.num1 = 20;

                // Access to protected member as it is inhertited by the Derived class

                ob2.num2 = 90;

                Console.WriteLine("Number2 value {0}", ob2.num2);

                Console.WriteLine("Number1 value which is protected {0}", ob2.num1);

                Console.ReadLine();

            }

        }

    }

}

 

Internal

The internal keyword is an access modifier for types and type members. We can declare a class as internal or its member as internal. Internal members are accessible only within files in the same assembly (.dll).

In other words, access is limited exclusively to classes defined within the current project assembly.

Accessibility:

In same assembly (public)

Can be accessed by objects of the class and also by derived classes

In other assembly (internal)

Cannot be accessed by object

Cannot be accessed by derived classes

 

Protected internal

The protected internal accessibility means protected OR internal, not protected AND internal.

In other means, a protected internal member is accessible from any class in the same assembly, including derived classes.

The protected internal access modifier seems to be a confusing but is a union of protected and internal in terms of providing access but not restricting.

It allows: Inherited types, even though they belong to a different assembly, have access to the protected internal members.

Types that reside in the same assembly, even if they are not derived from the type, also have access to the protected internal members.