Well, since we started talking about classes in C#, we can't escape access modifiers.
What is access modifiers?
In C#, access modifiers specify the accessibility of types (classes, interfaces, etc) and type members (fields, methods, etc). For example:
class Student
{
   private int age = 12;
   public string name = "Bob";
}
age - private field can only be accessed within the Student class
name - public field that can be accessed from anywhere.
Types of Access Modifiers
In C#, there are 4 basic types of access modifiers.
- public
- private
- protected
- internal
1. Public Access Modifier
When we declare a type or type member public, it can be accessed from anywhere. For example:
using System;
namespace AccessModifiers 
{
  class Student 
  {
    public string name = "Bob";
    public void SayHello() =>
      Console.WriteLine("Hello from Student class");
  }
  class Program 
  {
    static void Main(string[] args) 
    {
      // creating object of Student class
      Student student = new Student();
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
      // accessing SayHello method from Student
      student.SayHello();
     }
  }
}
Output
Name: Bob
Hello from Student class
In the above example, we have created a class named Student with a field name and a method SayHello().
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
      // accessing SayHello method from Student
      student.SayHello();
Since the field and method are public, we are able to access them from the Program class.
Note: We have used the object student of the Student class to access its members. To learn more, visit the C# class and objects.
2. Private Access Modifier
When we declare a type member with the private access modifier, it can only be accessed within the same class or struct. For example:
using System;
namespace AccessModifiers 
{
  class Student 
  {
    private string name = "Bob";
    private void SayHello() =>
      Console.WriteLine("Hello from Student class");
  }
  class Program 
  {
    static void Main(string[] args) 
    {
      // creating object of Student class
      Student student = new Student();
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
      // accessing SayHello method from Student
      student.SayHello();
    }
  }
}
In the above example, we have created a class named Student with a field name and a method SayHello().
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
      // accessing SayHello method from Student
      student.SayHello();
Since the field and method are private, we are not able to access them from the Program class. Here, the code will generate the following error.
Error    CS0122    'Student.name' is inaccessible due to its protection level    
Error    CS0122    'Student.SayHello()' is inaccessible due to its protection level
3.Protected Access Modifier
When we declare a type member as protected, it can only be accessed from the same class and its derived classes. For example:
using System;
namespace AccessModifiers 
{
  class Student 
  {
    protected string name = "Bob";
  }
  class Program 
  {
    static void Main(string[] args) 
    {
      // creating object of student class
      Student student = new Student();
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
    }
  }
}
In the above example, we have created a class named Student with a field name. Since the field is protected, we are not able to access it from the Program class.
Here, the code will generate the following error:
Error    CS0122    'Student.name' is inaccessible due to its protection level
Now, let's try to access the protected member from a derived class:
using System;
namespace AccessModifiers 
{
  class Student 
  {
    protected string name = "Bob";
  }
  // derived class
  class Program : Student 
  {
    static void Main(string[] args) 
    {
      // creating object of derived class
      Program program = new Program();
      // accessing name field and printing it
      Console.WriteLine("Name: " + program.name);
    }
  }
}
Output
Name: Bob
In the above example, we have created a class Student with a protected field name. Notice that we have inherited the Program class from the Student class.
// accessing name field and printing it
      Console.WriteLine("Name: " + program.name);
    }
Since the protected member can be accessed from derived classes, we are able to access name from the Program class.
4.Internal Access Modifier
When we declare a type or type member as internal, it can be accessed only within the same assembly, that is, we cannot call internal from another project in our Solutions.
An assembly is a collection of types (classes, interfaces, etc) and resources (data). They are built to work together and form a logical unit of functionality.
That's why when we run an assembly all classes and interfaces inside the assembly run together.
Call in our project. For example:
using System;
namespace AccessModifiers 
{
  class Student 
  {
   internal string name = "Bob";
  }
  class Program 
  {
    static void Main(string[] args) 
    {
      // creating object of Student class
      Student student = new Student();
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
    }
  }
}
Output
Name: Bob
Call in another project. For example:
using System;
namespace SecondAccessModifiers 
{
  class Program 
  {
    static void Main(string[] args) 
    {
      // creating object of Student class
      Student student = new Student();
      // accessing name field and printing it
      Console.WriteLine("Name: " + student.name);
    }
  }
}
Note: Pay attention to the namespace, it is different from the first project.
Output
Error    CS0122    'student.name' is inaccessible due to its protection level
Conclusion
In general, access modifiers allow you to specify the allowed scope for class components. That is, access modifiers determine the context in which a given variable or method can be used.
I have a lot of interesting code on GitHub
 
 
              
 
    
Top comments (0)