ูƒู„ู†ุง ูุงู„ุฃูˆู„ ุจู†ู„ุงู‚ูŠ ุตุนูˆุจุฉ ููŠ ูู‡ู… ุฅูŠู‡ ู‡ูˆ ุจุงู„ุธุจุท ู…ุจุฏุฃ ุงู„ู€ Encapsulation ูˆู„ูŠู‡ ุจู†ุญุชุงุฌู‡. ุนุดุงู† ูƒุฏู‡ุŒ ู‡ู†ุจุณุท ุงู„ู…ูˆุถูˆุน ุฌุฏู‹ุงุŒ ูˆู‡ู†ู…ุดูŠ ุฎุทูˆุฉ ุฎุทูˆุฉ ุนุดุงู† ู†ูู‡ู… ุงู„ู…ุดูƒู„ุฉ ุงู„ุฃูˆู„ุŒ ูˆุจุนุฏูŠู† ู†ุดูˆู ุงู„ุญู„.


The Problem: Why not just use Public Attributes?

ู‚ุจู„ ู…ุง ู†ุนุฑู ุฅูŠู‡ ู‡ูˆ ุงู„ู€ EncapsulationุŒ ุฎู„ูŠู†ุง ู†ุณุฃู„ ู†ูุณู†ุง: ู„ูŠู‡ ู…ู†ุฎู„ูŠุด ูƒู„ ุงู„ุฏุงุชุง ุจุชุงุนุชู†ุง Public ูˆุฎู„ุงุตุŸ ุงู„ู…ูŠุฒุฉ ุงู„ูˆุญูŠุฏุฉ ู„ุงุณุชุฎุฏุงู… ุงู„ู€ Public Attribute ู‡ูŠ ุณู‡ูˆู„ุฉ ุงู„ุงุณุชุฎุฏุงู…ุŒ ู„ุฅู†ูƒ ุจุชุณุชุฎุฏู… ู†ูุณ ุงู„ุดูƒู„ ูˆู†ูุณ ุงู„ู…ู†ุธุฑ ูˆู†ูุณ ูƒู„ ุญุงุฌุฉ ุนุดุงู† ุชูˆุตู„ ู„ู„ู…ุชุบูŠุฑ ููŠ ุฃูŠ ู…ูƒุงู† ููŠ ุงู„ูƒูˆุฏ.

ุจุต ุนู„ู‰ ุงู„ู…ุซุงู„ ุฏู‡ ู„ู€ struct ุจูŠู…ุซู„ ู…ูˆุธู:

internal struct Employee
{
    public int Id;
    public string Name;
    public decimal Salary;
    
    // Constructor
    public Employee(string _name, int _id, decimal _salary)
    {
        Id = _id;
        Name = _name;
        Salary = _salary;
    }
 
    public override string ToString()
    {
        return $"Name: {Name}\nID: {Id}\nSalary: {Salary:c}";
    }
}
 
// Main
Employee employee = new Employee("Mahmoud", 253, 5000);
employee.Id = 50;
Console.WriteLine(employee);

ู„ุญุฏ ู‡ู†ุง ุงู„ู…ูˆุถูˆุน ุจุงูŠู† ุณู‡ู„ุŒ ู„ูƒู† ุงู„ุทุฑูŠู‚ุฉ ุฏูŠ ู…ู„ูŠุงู†ุฉ ุนูŠูˆุจ ู‚ุงุชู„ุฉ:

  1. ุงู„ู€ Tightly Coupled Code: ุงู„ูƒูˆุฏ ุจูŠูƒูˆู† ู…ุฑุชุจุท ุจุจุนุถู‡ ุฌุฏู‹ุง. ู„ูˆ ุญุจูŠุช ููŠ ูŠูˆู… ุฃุบูŠุฑ ุงุณู… ุงู„ู€ variable ู…ู† Id ู„ู€ EmpId ุฃูˆ ุฃุบูŠุฑ ู†ูˆุนู‡ุŒ ู‡ุญุชุงุฌ ุฃุนู…ู„ update ู„ูƒู„ ุณุทุฑ ูƒูˆุฏ ุจูŠุณุชุฎุฏู… ุงู„ู…ุชุบูŠุฑ ุฏู‡.

  2. ูู‚ุฏุงู† ุงู„ุชุญูƒู… (Loss of Control): ุชุงู†ูŠ ู…ุดูƒู„ุฉ ุฅู† ู…ุนุฏุด ุนู†ุฏูŠ control ุนู„ู‰ ุงู„ูƒูˆุฏ ุจุชุงุนูŠ. ุจู…ุนู†ู‰ ุฅู†ูŠ ู„ูˆ ุนุงูŠุฒ ุฃุฎู„ูŠ ุงู„ู€ Id ุฏู‡ Read-only (ูŠุชู‚ุฑูŠ ุจุณ ูˆู…ุญุฏุด ูŠุนุฏู„ู‡)ุŒ ูุงู„ุญู„ ุงู„ู…ุชุงุญ ุจุงู„ู†ุณุจุงู„ูŠ ู‡ูˆ ุฅู†ูŠ ุฃุฎู„ูŠู‡ Private. ุจุณ ู„ูˆ ุนู…ู„ุช ูƒุฏู‡ุŒ ุฏู‡ ู‡ูŠู…ู†ุน ุฅู†ูŠ ุฃุนู…ู„ู‡ get ุฃูˆ set ู…ู† ุงู„ุฃุณุงุณุŒ ูˆูƒุฏู‡ ู…ู„ูŠุด ูƒู†ุชุฑูˆู„. ู…ู‚ุฏุฑุด ุฃุชุญูƒู… ููŠ ุงู„ู€ read & write ุจุญูŠุซ ุฃุฎู„ูŠ ูˆุงุญุฏ ู…ู†ู‡ู… public ูˆุงู„ุชุงู†ูŠ private:

    private int Id;
     
    // Main
    Employee.Id = 50; // ERROR
    Console.WriteLine(Employee.Id); // ERROR
  3. ู…ููŠุด ูู„ุชุฑุฉ (No Data Validation): ู…ู‚ุฏุฑุด ุฃูู„ุชุฑ ุงู„ุฏุงุชุง ุงู„ู„ูŠ ุฑุงูŠุญุฉ ูˆุงู„ู„ูŠ ุฌุงูŠุฉ. ุฒูŠ ู…ุง ุงู„ู€ user ู‡ูŠุฏุฎู„ู‡ุงุŒ ู‡ุงุฎุฏู‡ุง ูˆุฃุฎุฒู†ู‡ุงุŒ ูˆุฏู‡ ู…ู…ูƒู† ูŠุถุฑุจ ุงู„ุจูŠุฒู†ุณ ู„ูˆุฌูŠูƒ. ู…ุซุงู„ ุนู„ู‰ ุฏู‡: ู„ูˆ ุนู†ุฏู†ุง class ุงุณู…ู‡ Bank ูˆููŠู‡ ู…ุชุบูŠุฑ Amount ูƒู€ public. ุงู„ูŠูˆุฒุฑ ูŠู‚ุฏุฑ ุจุจุณุงุทุฉ ูŠุฎุฒู† ู‚ูŠู…ุฉ ุณุงู„ุจุฉุŒ ูˆุฏู‡ ุทุจุนู‹ุง ุบูŠุฑ ู…ู†ุทู‚ูŠ ููŠ ุงู„ุฑุตูŠุฏ:

    public class Bank
    {
        public int Amount;
    }
     
    // Main
    Bank bank = new Bank();
    bank.Amount = 50; // Valid
    bank.Amount = -150; // Invalid logically, but compiler allows it

ุนุดุงู† ู†ุญู„ ูƒู„ ุงู„ู…ุดุงูƒู„ ุฏูŠ ูˆู†ุชุนุงู…ู„ ู…ุน ุงู„ุชุบูŠูŠุฑุงุช ุงู„ู…ุณุชู‚ุจู„ูŠุฉ ุจุณู‡ูˆู„ุฉุŒ ุงู„ุญู„ ุงู„ุณุญุฑูŠ ู‡ูˆ ุงู„ู€ Encapsulation.


What is Encapsulation in C#?

ุงู„ู€ Encapsulation ุจูŠุฎููŠ ุงู„ุญุงู„ุฉ ุงู„ุฏุงุฎู„ูŠุฉ (internal state) ูˆุงู„ูˆุธุงุฆู (functionality) ุจุชุงุนุฉ ุฃูŠ objectุŒ ูˆุจูŠุณู…ุญ ุจุงู„ูˆุตูˆู„ ู„ูŠู‡ู… ุจุณ ุนู† ุทุฑูŠู‚ ู…ุฌู…ูˆุนุฉ public ู…ู† ุงู„ู€ functions.

ุจุดูƒู„ ุฃุจุณุท: ู‡ูˆ ุนู…ู„ูŠุฉ ุฑุจุท ุฃูˆ ุชุฌู…ูŠุน ุงู„ู€ State (ุงู„ู€ Data Members ุฃูˆ ุงู„ู…ุชุบูŠุฑุงุช) ูˆุงู„ู€ Behaviour (ุงู„ู€ Member Functions ุฃูˆ ุงู„ุฏูˆุงู„) ู…ุน ุจุนุถ ููŠ ูˆุญุฏุฉ ูˆุงุญุฏุฉ (ุฒูŠ class, interface, structุŒ ุฅู„ุฎ).

ุงู„ู€ Encapsulation ุจูŠูุตู„ ุชุนุฑูŠู ุงู„ุฏุงุชุง ุนู† ุทุฑูŠู‚ุฉ ุงุณุชุฎุฏุงู…ู‡ุง. ุฅู†ุช ุจุชูุตู„ ุชุนุฑูŠู ุงู„ุฏุงุชุง ูˆุชุฎู„ูŠู‡ุง PrivateุŒ ูˆุจุนุฏู‡ุง ุจุชูˆูุฑ ุทุฑูŠู‚ุฉ Public ุนุดุงู† ุงู„ุนุงู„ู… ุงู„ุฎุงุฑุฌูŠ ูŠุณุชุฎุฏู…ู‡ุง. ุงู„ู‡ุฏู ุงู„ุฃุณุงุณูŠ ู‡ูˆ ุงู„ุชุฃูƒุฏ ุฅู† ุงู„ุฏุงุชุง ุงู„ุญุณุงุณุฉ ู…ุฎููŠุฉ ุนู† ุงู„ู…ุณุชุฎุฏู…ูŠู†.

Real-World Examples

  • ุงู„ูƒุจุณูˆู„ุฉ ุงู„ุทุจูŠุฉ: ู…ุจุฏุฃ ุงู„ู€ Encapsulation ุดุจู‡ ุงู„ูƒุจุณูˆู„ุฉ ุฌุฏู‹ุง. ุฒูŠ ู…ุง ุงู„ูƒุจุณูˆู„ุฉ ุจุชุญุจุณ ุงู„ู…ูˆุงุฏ ุงู„ุทุจูŠุฉ ุฌูˆุงู‡ุงุŒ ุงู„ู€ Encapsulation ุจูŠุฌู…ุน ุงู„ู…ุชุบูŠุฑุงุช ูˆุงู„ุฏูˆุงู„ ููŠ ูˆุญุฏุฉ ูˆุงุญุฏุฉ ูˆุจูŠุบู„ูู‡ู….
graph TD
    subgraph Encapsulation Capsule
        direction TB
        M[Public Methods / Properties]
        subgraph Hidden State
            D[Private Data / Variables]
        end
        M --> D
    end
    User((External Code)) -->|Access via| M
    User -.->|Direct Access Blocked| D

Data Hiding and Access Specifiers

ุฃูƒุจุฑ ู…ูŠุฒุฉ ู„ู„ู€ Encapsulation ู‡ูŠ ุงู„ู€ Data Hiding (ุฅุฎูุงุก ุงู„ุจูŠุงู†ุงุช). ุงู„ู€ Data hiding ู‡ูˆ ุนู…ู„ูŠุฉ ุจู†ุฎููŠ ุจูŠู‡ุง ุงู„ุจูŠุงู†ุงุช ุงู„ุฏุงุฎู„ูŠุฉ ุนู† ุงู„ุนุงู„ู… ุงู„ุฎุงุฑุฌูŠ ู„ุญู…ุงูŠุชู‡ุง ู…ู† ุณูˆุก ุงู„ุงุณุชุฎุฏุงู…. ุงู„ุนู…ู„ูŠุฉ ุฏูŠ ุฃุญูŠุงู†ู‹ุง ุจุชุชุณู…ู‰ Data Encapsulation.

ููŠ C#ุŒ ุจู†ุทุจู‚ ุงู„ู€ Data Encapsulation ุนู† ุทุฑูŠู‚ ุฎุทูˆุชูŠู†:

  1. ุชุนุฑูŠู ุงู„ู…ุชุบูŠุฑุงุช ุฃูˆ ุงู„ุญู‚ูˆู„ (fields) ูƒู€ private ู„ู…ู†ุน ุงู„ูˆุตูˆู„ ุงู„ู…ุจุงุดุฑ.
  2. ุชูˆููŠุฑ public get ูˆ set methodsุŒ ุฃูˆ ู…ู† ุฎู„ุงู„ ุงู„ู€ properties ู„ู„ูˆุตูˆู„ ู„ู„ู‚ูŠู… ูˆุชุญุฏูŠุซู‡ุง ู…ุน ูˆุฌูˆุฏ validations ู…ู†ุงุณุจุฉ.

ุนุดุงู† ู†ุนู…ู„ ุฏู‡ุŒ ุจู†ุณุชุฎุฏู… ุงู„ู€ Access Specifiers ุงู„ู„ูŠ ุจุชุญุฏุฏ ู†ุทุงู‚ ูˆุฑุคูŠุฉ ุงู„ูƒูˆุฏ. C# ุจุชุฏุนู… 6 ุฃู†ูˆุงุน ุฑุฆูŠุณูŠุฉ:

  • ุงู„ู€ public: ู…ุชุงุญ ู„ุฃูŠ ูƒูˆุฏ ููŠ ุฃูŠ ู…ูƒุงู†.
  • ุงู„ู€ private: ู…ุชุงุญ ุจุณ ุฌูˆู‡ ู†ูุณ ุงู„ู€ class ุฃูˆ ุงู„ู€ struct.
  • ุงู„ู€ protected: ู…ุชุงุญ ุฌูˆู‡ ุงู„ู€ class ูˆู„ู„ู€ classes ุงู„ู„ูŠ ุจุชูˆุฑุซ ู…ู†ู‡.
  • ุงู„ู€ internal: ู…ุชุงุญ ุฌูˆู‡ ู†ูุณ ุงู„ู€ assembly (ุงู„ู…ุดุฑูˆุน) ุจุณ.
  • ุงู„ู€ protected internal: ู…ุชุงุญ ุฌูˆู‡ ุงู„ู€ assembly ุฃูˆ ู„ุฃูŠ derived class ุจุฑู‡ ุงู„ู€ assembly.
  • ุงู„ู€ private protected: ู…ุชุงุญ ู„ู„ู€ classes ุงู„ู„ูŠ ุจุชูˆุฑุซ ู…ู†ู‡ ุจุดุฑุท ูŠูƒูˆู†ูˆุง ุฌูˆู‡ ู†ูุณ ุงู„ู€ assembly.

Achieving Encapsulation: Getter and Setter Methods

ุนุดุงู† ู†ุญู‚ู‚ ุงู„ู€ Encapsulation ูˆู†ุญู„ ุงู„ู…ุดุงูƒู„ ุงู„ู„ูŠ ูˆุงุฌู‡ุชู†ุง ููŠ ุงู„ุฃูˆู„ุŒ ู‡ู†ุฎู„ูŠ ุงู„ู…ุชุบูŠุฑ private ูˆู†ุจุฏุฃ ู†ุณุชุฎุฏู… methods ุนุดุงู† ู†ุดูˆูู‡ ูˆู†ุชุญูƒู… ููŠู‡ ู…ู† ุจุฑู‡.

Example 1: Basic Getter and Setter

private string Name;
 
// Public Getter Method
public string GetName()
{
    return Name;
}
 
// Public Setter Method with Validation
public void SetName(string newName)
{
    // Restrict name length to 20 characters maximum
    Name = newName.Length <= 20 ? newName : newName.Substring(0, 20);
}
 
// Main
// Obj.GetName();
// Obj.SetName("VeryLongNameThatWillBeCut");

Example 2: Validating Bank Amount

ู†ุฑุฌุน ู„ู…ุซุงู„ ุงู„ุจู†ูƒ ุงู„ู„ูŠ ูƒุงู† ุจูŠู‚ุจู„ ุฑุตูŠุฏ ุจุงู„ุณุงู„ุจุŒ ูˆู†ุญู„ู‡ ุจุงุณุชุฎุฏุงู… ุงู„ู€ Getter ูˆุงู„ู€ Setter:

using System;
namespace EncapsulationDemo
{
    public class Bank
    {
        // Hiding class data
        private int Amount;
 
        public int GetAmount()
        {
            return Amount;
        }
        
        public void SetAmount(int Amount)
        {
            // Validation: Do not allow negative values
            if (Amount > 0)
            {
                this.Amount = Amount;
            }
            else
            {
                throw new Exception("Please Pass a Positive Value");
            }
        }
    }
    
    class Program
    {
        public static void Main()
        {
            try
            {
                Bank bank = new Bank();
                // bank.Amount = 50; // Compile Time Error
                
                bank.SetAmount(10); // Valid
                Console.WriteLine(bank.GetAmount());
                
                bank.SetAmount(-150); // Throws Exception
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

ู…ู…ูŠุฒุงุช ุงู„ุทุฑูŠู‚ุฉ ุฏูŠ ู‡ูŠ ูƒู„ ุงู„ู…ุฒุงูŠุง ุงู„ู„ูŠ ู‚ูˆู„ู†ุงู‡ุง ููˆู‚ ููŠ ุงู„ู€ Encapsulation:

  • ุฃู‚ุฏุฑ ุฃุฎู„ูŠ ุงู„ู€ Field ูŠุจู‚ู‰ Read-only ุจุจุณุงุทุฉ ุฅู†ูŠ ุฃู…ุณุญ ุงู„ู€ Set method.
  • ู„ูŠุง ุงู„ุชุญูƒู… ุงู„ูƒุงู…ู„ ูˆู…ุญุฏุด ูŠู‚ุฏุฑ ูŠุญุท ุฏุงุชุง ุบู„ุท.
  • ู„ูˆ ุบูŠุฑุช ุงุณู… ุงู„ู…ุชุบูŠุฑ private int Amount; ู„ุงุณู… ุชุงู†ูŠ ุฌูˆู‡ ุงู„ู€ classุŒ ู…ุด ู‡ุชูุฑู‚ ูˆู…ุด ู‡ุชุจูˆุธ ุงู„ูƒูˆุฏ ุจุฑู‡ ู„ุฅู† ุงู„ู€ Methods ู„ุณู‡ ุงุณู…ู‡ุง ุฒูŠ ู…ุง ู‡ูˆ.

ุนูŠุจ ุงู„ุทุฑูŠู‚ุฉ ุฏูŠ:

  • ุดูƒู„ ุงู„ูƒุชุงุจุฉ ู…ุนู‚ุฏ ุฃูƒุชุฑ ู…ู† ุงู„ู€ Public Attribute ุงู„ู…ุจุงุดุฑ ุงู„ู„ูŠ ูƒู†ุง ู…ุชุนูˆุฏูŠู† ุนู„ูŠู‡.

ู‡ู†ุง ุจูŠุฌูŠ ุฏูˆุฑ ุงู„ู€ Properties


Implementing Data Encapsulation using Properties

ุงู„ู€ Properties ู‡ูŠ ู…ูŠุฒุฉ ู‚ูˆูŠุฉ ููŠ ู„ุบุฉ C# ุจุชุณุงุนุฏ ููŠ ุญู…ุงูŠุฉ ุงู„ู€ field ุนู† ุทุฑูŠู‚ ุงู„ุชุญูƒู… ููŠ ู‚ุฑุงุกุฉ ูˆูƒุชุงุจุฉ ุงู„ู‚ูŠู… ุจุฃุณู„ูˆุจ ูƒุชุงุจุฉ (Syntax) ุณู‡ู„ ูˆุจุณูŠุท ุดุจู‡ ุงู„ู…ุชุบูŠุฑุงุช ุงู„ุนุงุฏูŠุฉ.

ุฎู„ูŠู†ุง ู†ุทุจู‚ ู†ูุณ ู…ุซุงู„ ุงู„ุจู†ูƒ ุจุงุณุชุฎุฏุงู… ุงู„ู€ Properties:

using System;
namespace EncapsulationDemo
{
    public class Bank
    {
        private double _Amount;
        
        // Public Property
        public double Amount
        {
            get
            {
                return _Amount;
            }
            set
            {
                // Validate the value before storing it
                if (value < 0)
                {
                    throw new Exception("Please Pass a Positive Value");
                }
                else
                {
                    _Amount = value;
                }
            }
        }
    }
    
    class Program
    {
        public static void Main()
        {
            Bank bank = new Bank();
            
            // Setting Positive Value using public Property
            bank.Amount = 10;
            
            // Getting the Value
            Console.WriteLine(bank.Amount);
            
            // This will throw an exception
            // bank.Amount = -150; 
        }
    }
}

ููƒุฏุง ุฎุฏู†ุง ูƒู„ ู…ุฒุงูŠุง ุงู„ู€ Methods ู„ุฃู†ู‡ุง ุนุจุงุฑุฉ ุนู† Methods ูˆุฎุฏู†ุง ูƒู…ุงู† ู…ูŠุฒุฉ ุงู„ูƒุชุงุจุฉ ุงู„ุณู‡ู„ุฉ.


Comprehensive Example: Phone Book

ุนุดุงู† ู†ุฌู…ุน ูƒู„ ุงู„ู„ูŠ ุงุชุนู„ู…ู†ุงู‡ุŒ ุจุต ุนู„ู‰ ุงู„ู…ุซุงู„ ุฏู‡ ู„ู€ struct ุจูŠู…ุซู„ ุฏู„ูŠู„ ู‡ูˆุงุชู (PhoneBook). ุงู„ู…ุซุงู„ ุฏู‡ ุจูŠุณุชุฎุฏู… ุงู„ู€ Encapsulation ุจุดูƒู„ ูƒุงู…ู„ุŒ ูˆุจูŠุฏู…ุฌ ุจูŠู† ุงู„ู€ PropertiesุŒ ุงู„ู€ MethodsุŒ ูˆุงู„ู€ Indexers.

struct PhoneBook
{
    // Private Data (Hidden State)
    string[] Names;
    long[] Numbers;
    int size;
 
    // Read-only Property
    public int Size { get { return size; } }
 
    // Constructor
    public PhoneBook(int _Size) 
    {
        size = _Size;
        Names = new string[size];
        Numbers = new long[size];
    }
 
    // Setter method with validation
    public void SetEntry(int Index, string Name, long Number) 
    {
        if ((Index >= 0) && (Index < size))
        {
            Names[Index] = Name;
            Numbers[Index] = Number;
        }
    }
 
    // Getter method
    public long GetNumber(string Name) 
    {
        for (int i = 0; i < Names?.Length; i++)
            if (Names[i] == Name)
                return Numbers[i];
        return -1;
    }
}

Why Encapsulation? (Summary of Advantages)

  • ุชุญูƒู… ุฃูุถู„ (Better Control): ุจูŠู‚ู„ู„ ุงุญุชู…ุงู„ูŠุฉ ุฅู†ูƒ (ุฃูˆ ุบูŠุฑูƒ) ุชุจูˆุธ ุงู„ูƒูˆุฏ ุงู„ุฏุงุฎู„ูŠ.
  • ุชุฎุตูŠุต ุงู„ุตู„ุงุญูŠุงุช: ุชู‚ุฏุฑ ุชุฎู„ูŠ ุงู„ู€ fields ุชุชู‚ุฑูŠ ุจุณ (read-only) ู„ูˆ ุงุณุชุฎุฏู…ุช ุงู„ู€ get ุจุณุŒ ุฃูˆ ุชุชูƒุชุจ ุจุณ (write-only) ู„ูˆ ุงุณุชุฎุฏู…ุช ุงู„ู€ set ุจุณ.
  • ุงู„ู…ุฑูˆู†ุฉ (Flexibility): ุงู„ู…ุจุฑู…ุฌ ูŠู‚ุฏุฑ ูŠุบูŠุฑ ุฌุฒุก ู…ู† ุงู„ูƒูˆุฏ ุงู„ุฏุงุฎู„ูŠ (ุฒูŠ ุฃุณู…ุงุก ุงู„ู…ุชุบูŠุฑุงุช) ุจุฏูˆู† ู…ุง ูŠุฃุซุฑ ุนู„ู‰ ุงู„ุฃุฌุฒุงุก ุงู„ุชุงู†ูŠุฉ ุงู„ู„ูŠ ุจุชุณุชุฎุฏู… ุงู„ู€ class ุฏู‡.
  • ุญู…ุงูŠุฉ ุงู„ุจูŠุงู†ุงุช (Data Protection & Security): ุชู‚ุฏุฑ ุชุนู…ู„ validate ู„ู„ุฏุงุชุง ู‚ุจู„ ู…ุง ุชุชุฎุฒู†ุŒ ูˆุงู„ูŠูˆุฒุฑ ุงู„ุฎุงุฑุฌูŠ ู…ุจูŠูƒูˆู†ุด ุนู†ุฏู‡ ููƒุฑุฉ ุนู† ุงู„ุชู†ููŠุฐ ุงู„ุฏุงุฎู„ูŠุŒ ูˆุฏู‡ ุจูŠุญู…ูŠ ุงู„ูƒูˆุฏ.
  • ุฅุฎูุงุก ุงู„ุจูŠุงู†ุงุช (Data Hiding): ุงู„ูˆุญุฏุงุช ุงู„ุชุงู†ูŠุฉ ู…ุชู‚ุฏุฑุด ุชูˆุตู„ ู„ู„ุจูŠุงู†ุงุช ู…ุจุงุดุฑุฉ ูˆุชู„ุนุจ ููŠู‡ุง.

Notes

  • ู„ูŠู‡ ู†ุณุชุฎุฏู… Properties ุจุฏู„ MethodsุŸ: ููŠ C#ุŒ ุงุณุชุฎุฏุงู… ุงู„ู€ Properties (ุฒูŠ public int Amount { get; set; }) ู‡ูˆ ุงู„ู€ Standard ุงู„ู…ูุถู„ (Idiomatic C#) ุนู† ุฅู†ูƒ ุชุนู…ู„ ุฏุงู„ุชูŠู† GetAmount() ูˆ SetAmount() ุฒูŠ ู…ุง ุจูŠุญุตู„ ููŠ ู„ุบุฉ Java ุฃูˆ C++. ุงู„ู€ Properties ุจุชุฏูŠูƒ ู†ูุณ ู…ุณุชูˆู‰ ุงู„ุฃู…ุงู† ูˆุงู„ุญู…ุงูŠุฉุŒ ุจุณ ุจุดูƒู„ ูƒุชุงุจุฉ ู…ุฃู„ูˆู ูˆุณู‡ู„ ูƒุฅู†ูƒ ุจุชุชุนุงู…ู„ ู…ุน ู…ุชุบูŠุฑ ุนุงุฏูŠ.

Whatโ€™s new in .NET 10

ุจู…ุง ุฅู†ู†ุง ุจู†ุชูƒู„ู… ุนู† ุงู„ู€ Encapsulation ูˆุงู„ู€ PropertiesุŒ ูู…ู† ุงู„ุชุญุฏูŠุซุงุช ุงู„ุซูˆุฑูŠุฉ ุงู„ู…ู†ุชุธุฑุฉ ููŠ C# 14 (ุงู„ู„ูŠ ุจุชูŠุฌูŠ ู…ุน .NET 10) ู‡ูŠ ู…ูŠุฒุฉ ุงู„ู€ โ€œFieldโ€ keyword in auto-properties. ุญุงู„ูŠู‹ุง ุนุดุงู† ุชุนู…ู„ validation ุฌูˆู‡ PropertyุŒ ู„ุงุฒู… ุชุนุฑู‘ู private (Backing field) ุฒูŠ private double _Amount; ูˆุจุนุฏูŠู† ุชุณุชุฎุฏู…ู‡. ููŠ .NET 10ุŒ ู…ุด ู‡ุชุญุชุงุฌ ุงู„ู…ุชุบูŠุฑ ุฏู‡ ุฎุงู„ุต! ุชู‚ุฏุฑ ุชุณุชุฎุฏู… ุงู„ูƒู„ู…ุฉ ุงู„ู…ุญุฌูˆุฒุฉ field ู…ุจุงุดุฑุฉ ุฌูˆู‡ ุงู„ู€ Property ูƒุงู„ุชุงู„ูŠ:

public double Amount
{
    get => field;
    set
    {
        if (value < 0) throw new Exception("Positive values only");
        field = value;
    }
}

ุงู„ุชุญุฏูŠุซ ุฏู‡ ุจูŠู‚ู„ู„ ูƒู…ูŠุฉ ุงู„ูƒูˆุฏ ุจุดูƒู„ ูƒุจูŠุฑ ุฌุฏู‹ุงุŒ ูˆุจูŠุฎู„ูŠ ุชุทุจูŠู‚ ุงู„ู€ Encapsulation ุฃุณู‡ู„ ูˆุฃู†ุธู ู…ู† ุฃูŠ ูˆู‚ุช ูุงุช!