Encapsulation is one of the fundamental principles of Object-Oriented Programming (OOP). It refers to the bundling of data (variables) and methods (functions) that operate on the data into a single unit, or class. Encapsulation also involves restricting direct access to some of an object's components, which is a means of preventing unintended interference and misuse of the data.
Key Concepts of Encapsulation
- Data Hiding: Encapsulation allows the internal state of an object to be hidden from the outside. Only the object's methods can interact with its internal state.
- Access Modifiers: C# provides access modifiers to control the visibility of class members. The most common access modifiers are:
- public: The member is accessible from any other code.
- private: The member is accessible only within the class.
- protected: The member is accessible within the class and by derived class instances.
- internal: The member is accessible only within its own assembly.
- protected internal: The member is accessible within its own assembly or by derived class instances.
 
Practical Example
Let's create a simple class to demonstrate encapsulation in C#.
Step-by-Step Example
- Define a Class with Private Fields: Create a class Personwith private fields fornameandage.
public class Person
{
    private string name;
    private int age;
    // Constructor
    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
    // Public method to get the name
    public string GetName()
    {
        return name;
    }
    // Public method to set the name
    public void SetName(string name)
    {
        this.name = name;
    }
    // Public method to get the age
    public int GetAge()
    {
        return age;
    }
    // Public method to set the age
    public void SetAge(int age)
    {
        if (age > 0)
        {
            this.age = age;
        }
    }
}- Using the Class: Create an instance of the Personclass and interact with its properties using the public methods.
public class Program
{
    public static void Main()
    {
        // Create a new Person object
        Person person = new Person("John Doe", 30);
        // Access and modify the person's name and age using public methods
        Console.WriteLine("Name: " + person.GetName());
        Console.WriteLine("Age: " + person.GetAge());
        // Modify the person's name and age
        person.SetName("Jane Doe");
        person.SetAge(25);
        // Display the updated information
        Console.WriteLine("Updated Name: " + person.GetName());
        Console.WriteLine("Updated Age: " + person.GetAge());
    }
}Explanation
- Private Fields: The nameandagefields are private, meaning they cannot be accessed directly from outside thePersonclass.
- Public Methods: The GetName,SetName,GetAge, andSetAgemethods are public, providing controlled access to the private fields.
- Validation: The SetAgemethod includes a validation check to ensure the age is positive, demonstrating how encapsulation can enforce rules and constraints.
Practical Exercises
Exercise 1: Create a BankAccount Class
- 
Objective: Create a BankAccountclass with private fields foraccountNumberandbalance. Provide public methods to deposit and withdraw money, and to check the balance.
- 
Solution: 
public class BankAccount
{
    private string accountNumber;
    private decimal balance;
    // Constructor
    public BankAccount(string accountNumber, decimal initialBalance)
    {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }
    // Method to deposit money
    public void Deposit(decimal amount)
    {
        if (amount > 0)
        {
            balance += amount;
        }
    }
    // Method to withdraw money
    public void Withdraw(decimal amount)
    {
        if (amount > 0 && amount <= balance)
        {
            balance -= amount;
        }
    }
    // Method to check the balance
    public decimal GetBalance()
    {
        return balance;
    }
}Exercise 2: Test the BankAccount Class
- 
Objective: Create an instance of the BankAccountclass and perform some transactions.
- 
Solution: 
public class Program
{
    public static void Main()
    {
        // Create a new BankAccount object
        BankAccount account = new BankAccount("123456789", 1000m);
        // Deposit money
        account.Deposit(500m);
        Console.WriteLine("Balance after deposit: " + account.GetBalance());
        // Withdraw money
        account.Withdraw(200m);
        Console.WriteLine("Balance after withdrawal: " + account.GetBalance());
        // Attempt to withdraw more money than the balance
        account.Withdraw(1500m);
        Console.WriteLine("Balance after attempting to overdraw: " + account.GetBalance());
    }
}Common Mistakes and Tips
- Direct Access: Avoid making fields public. Always use private fields with public methods to control access.
- Validation: Always validate input in setter methods to ensure the object's state remains consistent.
- Encapsulation vs. Abstraction: Remember that encapsulation is about bundling data and methods, while abstraction is about hiding complexity. Both are important OOP principles.
Conclusion
Encapsulation is a powerful concept in C# that helps in maintaining the integrity of an object's data by restricting direct access to its fields. By using access modifiers and providing public methods to interact with the data, you can ensure that the object's state remains consistent and protected from unintended interference. This principle not only enhances code maintainability but also improves security and robustness.
C# Programming Course
Module 1: Introduction to C#
- Introduction to C#
- Setting Up the Development Environment
- Hello World Program
- Basic Syntax and Structure
- Variables and Data Types
Module 2: Control Structures
Module 3: Object-Oriented Programming
- Classes and Objects
- Methods
- Constructors and Destructors
- Inheritance
- Polymorphism
- Encapsulation
- Abstraction
Module 4: Advanced C# Concepts
- Interfaces
- Delegates and Events
- Generics
- Collections
- LINQ (Language Integrated Query)
- Asynchronous Programming
Module 5: Working with Data
Module 6: Advanced Topics
- Reflection
- Attributes
- Dynamic Programming
- Memory Management and Garbage Collection
- Multithreading and Parallel Programming
