ูููุง ูุงูุฃูู ุจููุงูู ุตุนูุจุฉ ูู ููู
ุฅูู ูู ุจุงูุธุจุท ู
ุจุฏุฃ ุงูู 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);ูุญุฏ ููุง ุงูู ูุถูุน ุจุงูู ุณููุ ููู ุงูุทุฑููุฉ ุฏู ู ููุงูุฉ ุนููุจ ูุงุชูุฉ:
-
ุงูู Tightly Coupled Code: ุงูููุฏ ุจูููู ู ุฑุชุจุท ุจุจุนุถู ุฌุฏูุง. ูู ุญุจูุช ูู ููู ุฃุบูุฑ ุงุณู ุงูู variable ู ู
IdููEmpIdุฃู ุฃุบูุฑ ููุนูุ ูุญุชุงุฌ ุฃุนู ูupdateููู ุณุทุฑ ููุฏ ุจูุณุชุฎุฏู ุงูู ุชุบูุฑ ุฏู. -
ููุฏุงู ุงูุชุญูู (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 -
ู ููุด ููุชุฑุฉ (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 ุนู ุทุฑูู ุฎุทูุชูู:
- ุชุนุฑูู ุงูู
ุชุบูุฑุงุช ุฃู ุงูุญููู (
fields) ููprivateูู ูุน ุงููุตูู ุงูู ุจุงุดุฑ. - ุชูููุฑ
public getูsetmethodsุ ุฃู ู ู ุฎูุงู ุงูู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 ุฃุณูู ูุฃูุธู ู
ู ุฃู ููุช ูุงุช!