Constructor

  • هي عبارة عن special method بنستخدمها عشان initialize objects
  • بيتم مناداتها أول ما بتعمل create object
  • الـ Access Modifier بتاعه في الطبيعي بيبقا Public إلا في Design pattern واحدة
  • They are used to initialize the object’s state by assigning values to its fields or properties.
class Car
{
	public string model; //field
	public Car() // parameter less - default cons
	{
		model = "Mustang"; // initial value
	}
 
	public Car(string modelName)
	{
	    this.model = modelName;
	}
 
	static void Main()
	{
		Car Ford = new Car();
		Console.WriteLine(Ford.model); // Mustang
	}
}
  • The constructor name must match the class name, and it cannot have a return type
  • All classes have constructors by default: if you do not create a class constructor yourself, C# creates one for you.
  • ال ctor اللي بيبقا مفهوش برامتر بيبقا اسمها parameter less - default ctor
    • في الطبيعي بياخد كل الـ Attributes ويحطلها القيمة الـ Default بتاع النوع دا يعني لو هي من النوع Int هيديلها صفر وهكذا

Type of Constructors

  1. Default Constructor
  2. Parameterized Constructor
  3. Copy Constructor
  4. Static Constructor

Default Constructor

Parameterized Constructor

Copy Constructor

Static Constructor

Struct vs Class for constructor

الفرق بينهم

  • ان الـ Default constructor بيتعمل دايمًا في الـ Cs Struct
  • انما في الـ Cs Class بيتعمل في حالة إن مفيش ctor انت عامله انما لو عملت واحد الـ Default مبيبقاش موجود وانت ممكن تعمله عادي بعد كدا بمعنى انك لو جيت تستخدمه بعد ما عملت واحد هتلاقيه مديلك Error

Constructor Overloading

  • ال Overloading: انك يبقا عندك method ليها نفس الإسم بس متغير فيها signatures
  • Signatures: What uniquely identify a method (Return type, name, the types and numbers of its parameters)
public class Car 
{
	public Car () { ... }
	public Car (string name) { ... }
	public Car (int id, string name) { ... }
}

Constructor Chaining

  • عندي مشكلة مثلا إن مينفعش أعرف field من النوع Cs Lists وأسيبه مش حاجزله مكان بال new
  • دا هيعملي مشكلة لو جيت أضيف عنصر في ال list أو استخدمها عمومًا فلازم أعملها initialization الأول
  • الحل إننا نعمل كدا في default constructor
public List<Order> Orders;
 
public Customer()
{
	Orders = new List<order>();
}
  • هيظهرلي مشكلة تانية إني ممكن أستخدم Constructor تاني فكدا الليست مش هيتعملها initialization
  • بالتالي فيه حل إننا لازم نكرر نفس الحوار في كل ال constructors اللي عندنا بس دا مش حل عملي
  • الحل التاني اننا نستخدم this
public class Customer
{
    public int ID;
    public string Name;
    public List<Order> Orders;
    // When you use a list of any type, you should initialize it at ctor
 
    public Customer()
    {
        Orders = new List<Order>();
    }
    public Customer(int id)
        :this()
    {
        this.ID = id;
    }
    public Customer(int id, string name)
        :this(id)
    {
        this.ID = id;
        this.Name = name;
    }
}
  • دا بكل بساطة هيخلي أي constructor هتناديه، هيروح ينادي على ال constructor ال default الأول
  • بينفذ اللي أنا عامل منه Chain الأول وبعدين ينفذ اللي انا فيه
  • نقدر نخلي أي constructor ينادي أي واحد قبله بشرط إني أحط ال parameters جوا القوسين بعد this
  • ممكن نعمل Chaining على constructor موجود في class تاني

Copy Constructor

  • اني بديله داتا Object معين وينسخلي الحاجات اللي جواه في الـ Object الجديد
  • بتعمل Deep Copy
public Employee(Employee empCopy)
{
    this.Id = empCopy.Id;
    this.Name = empCopy.Name;
    this.Salary = empCopy.Salary;
}
// this --> اللي عامل كول