کپسوله سازی، مخفی‌سازی (Encapsulation)، کپسوله سازی یا لفافه‌بندی، به این مفهوم اشاره دارد که باید بعضی خصوصیات یا رفتارهای شیء را از دید دیگران پنهان کرد. فرض کنید شما به عنوان یک راننده می‌خواهید اتومبیل شخصی تان را روشن کنید و به محل کارتان عزیمت کنید سوییچ را برمی‌دارید، استارت می‌زنید و با فشار آوردن به پدال‌های گاز و ترمز و چرخش فرمان و … به محل کارتان خواهید رسید. در طول این مسیر در اتومبیل شما به عنوان یک شیء اعمال مختلفی در حال انجام بود. مثلاً لنت ترمز به دیسک چرخ برخورد می‌کرد و باعث کم شدن سرعت می‌شد یا شمع‌ها شروع به جرقه زدن در زمانی بخصوصی می‌کردند. حال فرض کنید که عمل مخفی سازی وجود نداشت و شما مجبور بودید که جرقه زدن شمعها را کنترل می‌کردید و به سیستم سوخت رسانی در موقع لزوم دستور می‌دادید که سوخت را بداخل سیلندرها ارسال کند و… یا هیچ‌گاه به مقصد نمی‌رسیدید! یا سالم نمی‌رسیدید!


عمل مخفی سازی باعث می‌شود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند



کپسوله‌سازی (به انگلیسی: Encapsulation) مخفی‌سازی، یا لفافه‌بندی، در علم رایانه مخفی سازی مکانیزم داخلی و ساختار داده‌های اجزای نرم‌افزار در پشت یک رابط کاربر است. بدین طریق کاربر یک نرم‌افزار فقط نیاز دارد که بداند آن قطعه نرم‌افزاری چه می‌کند و نمی‌تواند آنها را منوط به چگونگی اجرای آنها بکند.

عمل مخفی‌سازی باعث می‌شود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند


در حقیقت پارامترهای ورودی همیشه حتما نباید متغیرها و داده های ساده باشد گاهی نیاز داریم به متد Reference خاصی ارسال کنیم و در آن از آن Reference استفاده کنیم.


مثال

class MyClass
{
   string Name;
   string Surname;
   int Age;
 
   public MyClass(string name, string surname, int age)
   {
      Name = name;
      Surname = surname;
      Age = age;
   }

      if (Name == ob.Name && Surname == ob.Surname && Age == ob.Age)  return true;
   public bool SameAs(MyClass ob)
   {
         else return false;
   public void Copy(MyClass ob)
   }

   {
   {
      Name = ob.Name;
      Surname = ob.Surname;
      Age = ob.Age;
   }

MyClass ob1 = new MyClass("Damon", "Salvatore", 22);
   public void Show()
      Console.WriteLine("  Name: {0}, Surname: {1}, Age: {2}",
MyClass ob2 = new MyClass("Stefan", "Salvatore", 21);
      Name, Surname, Age);
   }
}

// Using :

else   Console.WriteLine("ob1 and ob2 have different values.");
Console.WriteLine("ob1: ");
ob1.Show();
ob2.Show();
console.WriteLine("ob2: ");

if (ob1.SameAs(ob2)) Console.WriteLine("ob1 and ob2 have the same values.");
 
// Now, make ob1 a copy of ob2
else Console.WriteLine("ob1 and ob2 have different values.");
ob1.Copy(ob2);
Console.WriteLine();
Console.WriteLine("ob1 after copy: ");
ob1.Show();

if (ob1.SameAs(ob2))  Console.WriteLine("ob1 and ob2 have the same values.");


به همان روشی که value type ها به متدها داده می‌شوند، reference type ها نیز به متدها داده شده‌اند

private---تنها اعضایی از نوعی یکسان
protected-تنها اشیاء مشتق شده و یا اعضایی از نوع
internal--تنها کدهای داخل اسمبلی یکسان
protected internal --کدهای مربوط به یک نوع مشتق شده و یا کدهای مربوط به اسمبلی یکسان
public هرنوع کدیدسترسی برای همه

نمونه های بالا ابتدا public

using System;
namespace encapsulation
{
     class square
         public float length;
     {
         public float Area()
         {
             return length * length;
         }
         public void ShowArea()
             Console.WriteLine("Length of a side of square: "+ length);
         {
             Console.WriteLine("Area of square: "+ Area());
         }
     }
     class area
     {
             square s = new square();
         static void Main(string[] args)
         {
             s.length = 1.5f;
}
             s.ShowArea();
             Console.ReadLine();
         }
     }

نتیجه خروجی

Length of a side of square: 1.5
Area of square: 2.25
نمونه  Access Modifier "private"

using System;
namespace encapsulation
{
    class square
    {
        private float length = 1.5f; //private member so, can't be use anywhere
        public double Area()
        {
            return length * length; //private member can be accessed here
        }
        public void ShowArea()
        {
            Console.WriteLine("Length of a side of square: " + length);
            Console.WriteLine("Area of square: " + Area());
        }
    }
    class area
    {
        static void Main(string[] args)
        {
            square s = new square();
            s.ShowArea();
            Console.ReadLine();
        }
    }
}



خروجی

Length of a side of square: 1.5
Area of square: 2.25
مونه یا مثال Access Modifier "protected"
using System;
namespace encapsulation
{
    class len
    {
        protected float length; //protected member
    }
    class square : len
    {
        public double Area()
        {
            this.length = 1.5f; //accessing protected member from derived class
            return length * length;
        }
        public void ShowArea()
        {
            Console.WriteLine("Area of square: " + Area());
        }
    }
    class area
    {
        static void Main(string[] args)
        {
            
            square s = new square();
            s.ShowArea();
            Console.ReadLine();
        }
    }
}



خروجی
Area of square: 2.25


مثال Access Modifier "internal"
using System;
namespace encapsulation
{
    class square
    {
        internal float length; //can be accessed from any class of the assembly
        internal float Area()
        {
            return length * length;
        }
        internal void ShowArea()
        {
            Console.WriteLine("Length of a side of square: " + length);
            Console.WriteLine("Area of square: " + Area());
        }
    }
    class area
    {
        static void Main(string[] args)
        {
            square s = new square();
            s.length = 1.5f;
            s.ShowArea(); //internal member is accessed here
            Console.ReadLine();
        }
    }
}Length of a side of square: 1.5/////خروجی
Area of square: 2.25



مثال 
Access Modifier "protected internal"


using System;
namespace encapsulation
{
    class square
    {
        internal float length;
        internal float Area()
        {
            return length * length;
        }
        protected internal void ShowArea() //protected internal member
        {
            Console.WriteLine("Length of a side of square: " + length);
            Console.WriteLine("Area of square: " + Area());
        }
    }
    class area
    {
        static void Main(string[] args)
        {
            square s = new square();
            s.length = 1.5f;
            s.ShowArea(); //protected internal member is accessed here
            Console.ReadLine();
        }
    }
}


خروجی
Length of a side of square: 1.5
Area of square: 2.25


مثال
دیگر برای Public Access Modifier

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      //member variables
      public double length;
      public double width;
      
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle
   
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle();
         r.length = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}
خروجی
Length: 4.5
Width: 3.5
Area: 15.75