Constructor (Yapıcı) Metot Nedir?

Bir sınıftan nesne oluşturulduğu an arkaplanda otomatik olarak çalıştırılan metotlara yapıcı metotlar denilmektedir. Bu yüzden nesne oluşturulduğunda otomatik olarak yapılmasını istediğimiz işlemleri yapıcı metotların içerisine yazarız.

Yapıcı metodu kısaca tanımlamak için klavyede ctor+tab+tab tuşları işimizi görecektir.

Yapıcı Metotlar Nasıl Tanımlanır?

  1. Yapıcı metotların isimleri sınıf isimleri ile aynı olmak zorundadır.

  2. Public olarak bildirilmeleri gerekir.

  3. Geri dönüş değerleri yoktur.

class Matematik
{
    private double PiSayisi;
    private double EulerSayisi;
    public Matematik()
    {
        PiSayisi = 3.1415;
        EulerSayisi = 2.7182;
    }
}

“new Matematik()” ifadesi ile Matematik sınıfından bir nesne oluşturulduğu an yapıcı metot otomatik olarak çalışacak ve PiSayisi özelliğine 3.1415 değerini, EulerSayisi özelliğine 2.7182 değerini atayacaktır.

Sıradan metotlar gibi yapıcı metotlarda parametre alabilmektedir. Ancak yapıcı metotlar nesne oluşturulduğu an çalıştığı için parametreler nesne oluşturulurken girilmelidir.

class Ogrenci
{
    // Özelliklere diğer sınıflardan erişilemez. (Private)
    private string AdSoyad;
    private int Numara;
    private int Sinif;
    // Nesne oluşturulurken girilen parametreler ilgili özelliklere atanacaktır.
    public Ogrenci(string ogrAdi,int ogrNo,int ogrSinif)
    {
        AdSoyad = ogrAdi;
        Numara = ogrNo;
        Sinif = ogrSinif;
    }
    // Öğrenciye ait bilgiler ekrana yazdırılacaktır. 
    public void Bilgi()
    {
        Console.WriteLine("Öğrencinin Adı:{0}", AdSoyad);
        Console.WriteLine("Öğrencinin Numarası:{0}", Numara);
        Console.WriteLine("Öğrencinin Sınıfı:{0}", Sinif);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Yapıcı metoda parametreler nesne oluşturulurken gönderildi.
        Ogrenci ogr1 = new Ogrenci("Mehmet Özdemir", 134, 4);
        Ogrenci ogr2 = new Ogrenci("İrem Kesici", 118, 3);
        // Öğrencilere ait bilgiler ekrana yazdırıldı. 
        ogr1.Bilgi();
        ogr2.Bilgi();
    }
}

Yapıcı Metotların Aşırı Yüklenmesi(Overload)

Tıpkı sıradan metotlar gibi yapıcı metotlarda aşırı yüklenebilir.Parametre sayısı ve parametrelerin tipinden en az birisinin farklı olması şartıyla birden fazla yapıcı metot tanımlanabilir.

class Silindir
{
    private double r;
    private double h;
    private double PI = 3.1415;
    // Nesne oluşturulurken double tipinde 2 parametre girildiğinde çalışacak olan yapıcı metot. 
    public Silindir(double yaricap, double yukseklik)
    {
        r = yaricap;
        h = yukseklik;
    }
    // Nesne oluşturulurken double tipinde 3 parametre girildiğinde çalışacak olan yapıcı metot. 
    public Silindir(double yaricap, double yukseklik, double piSayisi)
    {
        r = yaricap;
        h = yukseklik;
        PI = piSayisi;
    }
    public double Hacim()
    {
        return (PI * r * r * h);
    }
    public double YuzeyAlani()
    {
        return (2 * PI * r * h);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // 3.Parametre girilmediği için PI başlangıç değerini(3.1415) alacaktır. 
        Silindir s1 = new Silindir(4, 6);
        Console.WriteLine("Silindirin Hacmi:{0} - Silindirin Yüzey Alanı:{1}", s1.Hacim(), s1.YuzeyAlani());
        // 3.Parametreye girilen değer PI'ye atanacaktır. 
        Silindir s2 = new Silindir(4, 6, 3);
        Console.WriteLine("Silindirin Hacmi:{0} - Silindirin Yüzey Alanı:{1}", s2.Hacim(), s2.YuzeyAlani());
    }
}

!!-------------------ÇALIŞMA SIRASI ÖRNEK----------------!

Öncelikle yapıcı metodu olan bir Öğrenci sınıfı oluşturalım.

public class Ogrenci
    {
        public Ogrenci()
        {
            Console.WriteLine("Yapıcı metot çalıştı.");sınıfımdan sadece nesne üretmem yeterli. Yapıcı metotta yapılacak işlemler ne yazdı isem otomatik geliyor.
        }
 
        public string Adi { get; set; }
        public string Soyadi { get; set; }
        public int Numara { get; set; }
        public double Ortalama { get; set; }
    }

Uygulamamızın main metodunu aşağıdaki gibi düzenleyelim;

static void Main(string[] args)
        {
            Console.WriteLine("Uygulama başladı.");
            Ogrenci yeniOgrenci = new Ogrenci();
            Console.WriteLine("Öğrenci nesnesi oluştu.");
 
            Console.WriteLine("Uygulama bitti.");
        }

ÇIKTI

<---------------------------!ÖRNEK!------------------------>

Class içinde tanımladığımız yapıcı metot içerisinde parametreli kullanımı gösterelim. Console ekranınada ad, soyad, yaş ve meslek bilgisi girilsin. Öncelikle sınıfımı oluşturalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    class Personel
    {
        //yapıcı metotlarda metot adı ile class adı aynı olur. Burda yapıcı metot içinde ayrıca parametre tanımlaması yaptım. Tüm parametrelerim string, işlem yapmadığım için.
        public Personel(string ad, string soyad, string dogumYil, string dogumYeri, string meslek)
        {
            Console.WriteLine("Ad: " + ad);
            Console.WriteLine("Soyad: " + soyad);
            Console.WriteLine("Doğum Yılı: " + dogumYil);
            Console.WriteLine("Doğum Yeri: " + dogumYeri);
            Console.WriteLine("Meslek: " + meslek);
                 
        }
    }
}

Görüleceği üzere burada sınıfımla aynı ismi taşıyan bir constructor oluşturdum. Metoduma ait parametreleri de tanımladım. Akabinde yapılacak işlemleri belirttim.

Program.cs’ye dönüp kodlarımı yazıyorum:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {           
            //Önce değişkenlerimi tanımlıyorum
            string _ad, _soyad, _dogumYil, _dogumYeri, _meslek;
            //Kullanıcıdan verileri girmesini istiyorum ve her bir veriyi ilgili değişkenime atama işlemi yapıyorum
            Console.WriteLine("Adınızı giriniz: ");
            _ad = Console.ReadLine();
            Console.WriteLine("Soyadınızı giriniz: ");
            _soyad = Console.ReadLine();
            Console.WriteLine("Doğum yılınızı giriniz: ");
            _dogumYil = Console.ReadLine();
            Console.WriteLine("Doğum yerinizi giriniz: ");
            _dogumYeri = Console.ReadLine();
            Console.WriteLine("Mesleğinizi giriniz: ");
            _meslek = Console.ReadLine();
 
            //Personel classından nesne oluşturuyorum ve ilgili parametrelerini belirtiyorum.
            Personel prsnl = new Personel(_ad, _soyad, _dogumYil, _dogumYeri, _meslek);
 
            Console.Read();
        }
    }
}

Öncelikle değişkenlerimi oluşturdum. Mateatiksel işlem vb yapmayacağım için tüm değişkenlerim string tipinde. Daha sonra kullanıcıdan veri girişi yapmasını istiyorum. Her bir girilen veriyi ilgili değişkenime Console.ReadLine() ile atadım. Daha sonra Personel sınıfımdan prsnl nesnesi oluşturdum ve daha önce tanımladığım değişkenleri parametre olarak belirttim.

!---------------------ÖRNEK--------------------!

Bu örnekte de ilk değer ataması yapılmış bir constructor metot yapalım.Örneğimde yine personel isminde bir class oluşturacağım. Bu classımda yine personelin adı, soyadı, doğum yılı, doğum yeri ve ünvanı yer alacak. Doğum yılını bu sefer int tipinde yapalım.Şimdi benim bu örneğimde amacım yapıcı metodumun her halükarda ilk değerlerinin olması. Şöyle bir senaryo düşünün, bir form doldurtuyorsunuz ancak bu formda boş geçilmesini istemediğiniz alanlar var veya boş geçilse bile sabit kabul edeceğiniz değerlerin yazmasını istiyorsunuz İşte burada yapıcı metot içinde ilk değer ataması kullanma yöntemine başvurabilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    //Personel adında bir class oluşturdum.
    class Personel
    {
        //class içinde 5 adet değişkenim var.
        string ad, soyad, dogumYeri, Unvan;
        int dogumYili;
 
        //Encapsulation işlemlerim
        public string _ad
        {
            get
            {
                return ad;
            }
 
            //Nasıl yazılırsa yazılsın ad değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                ad = value.ToUpper();
            }
        }
 
        public string _soyad
        {
            get
            {
                return soyad;
            }
            //Nasıl yazılırsa yazılsın soyad değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                soyad = value.ToUpper();
            }
        }
 
        public int _dogumYili
        {
            get
            {
                return dogumYili;
            }
            //Doğum yılının eksi yazılması vs gibi durumları gözeterek burada da Math fonksiyonunun Abs metodunu kullanarak, mutlak değer alma işlemini yaptırıyorum.
            set
            {
                dogumYili = Math.Abs(value);
            }
        }
 
        public string _dogumYeri
        {
            get
            {
                return dogumYeri;
            }
            //Nasıl yazılırsa yazılsın dogumYeri değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                dogumYeri = value.ToUpper();
            }
        }
 
        public string _unvan
        {
            get
            {
                return Unvan;
            }
            //Nasıl yazılırsa yazılsın Unvan değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                Unvan = value.ToUpper();
            }
        }
 
 
        //Constructor metodumu yazıyorum. Class ile aynı ismi taşıyor. Ve bu metodum içerisinde ilk sabit olması gereken değer atamamı yaptım!. Veri girilmediğinde ad, soyad, doğumyeri ünvan için N/A yazsın istiyorum. Doğum yılı da girilmezse eğer 1900 yazsın istiyorum.
        public Personel()
        {
            ad = "N/A";
            soyad = "N/A";
            dogumYili = 1900;
            dogumYeri = "N/A";
            Unvan = "N/A";
        }
         
            
    }
}

Program.cs e dönüş;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            //Personel classımdan prsnl adında bir nesne oluşturdum.
            Personel prsnl = new Personel();
 
            //Daha sonra ekrana yazdırma işlemlerimi yapıyorum.
 
            Console.WriteLine(prsnl._ad);
            Console.WriteLine(prsnl._soyad);
            Console.WriteLine(prsnl._dogumYili);
            Console.WriteLine(prsnl._dogumYeri);
            Console.WriteLine(prsnl._unvan);
 
            Console.Read();
        }
    }
}

Öncelikle Personel sınıfından prsnl adında bir nesne tanımladım. Daha sonra yazdırma komutlarımı yazdım. Eğer bu şekilde çalıştırırsam aşağıdaki gibi ilk değer atamalarını görebilirim.

Örnek olarak birkaç değer ataması yaparak örneğimizi bitirelim.Kodlarımı aşağıdaki gibi düzenliyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            //Personel classımdan prsnl adında bir nesne oluşturdum.
            Personel prsnl = new Personel();
 
            prsnl._ad = "Mehmet";
            prsnl._soyad = "Özdemir";
            prsnl._unvan = "MüHenDiS";
 
            //Daha sonra ekrana yazdırma işlemlerimi yapıyorum.
 
            Console.WriteLine(prsnl._ad);
            Console.WriteLine(prsnl._soyad);
            Console.WriteLine(prsnl._dogumYili);
            Console.WriteLine(prsnl._dogumYeri);
            Console.WriteLine(prsnl._unvan);            
 
            Console.Read();
        }
    }
}

Bu sefer ad bilgisine, soyad bilgisine ve unvan bilgisine veri girişi yaptım. Ancak ad bilgisindeki, soyad bilgisindeki ve unvan bilgisindeki yazı yazma şeklime özelilkle dikkat edin. Sınıf içindeki encapsulation işlemlerim ile bunların hepsi büyük harfe dönecek. Doğum yılı bilgisini girmediğim için varsayılan olarak 1900 yazacak. Doğum yeri bilgisi de girmediğim için varsayılan olarak N/A yazacak. Böylelikle hem encapsulation işlemlerimin hem de yapıcı metodumum çalıştığını görebileceğim. Ekran çıktısı aşağıdaki şekilde

MEHMET

ÖZDEMİR

1900

N/A

MÜHENDİS

Last updated