C# Sınıflar 2

     Merhaba, uzun bir aradan sonra yeni bir C# dersi yazmaya vakit bulabildim. Dersleri takip edip devamını bekleyen arkadaşlara teşekkürler. Bu dersimizde sınıflara devam edeceğiz. Bir önceki dersimizde sınıf nedir, nasıl yazılır gibi konulara değinmiştik. Bu dersimizde ise this anahtar kelimesi, get ve set içeren property’ler, yapıcı ve yıkıcı metotlardan bahsedeceğiz. Dersimize başlayalım…

DERS 11 : Sınıflar 2

this anahtar kelimesi

     this anahtar kelimesi (keyword), herhangi bir sınıf içerisindeki metot veya property’lere erişirken kullanılabilir. Normalde bu keyword’ü kullanmanıza gerek yok; ancak bazı durumlarda okumayı kolaylaştırmak için veya derleyicinin yanlış kararlar vermesini engellemek için kullanmak gerekebilir. Bir örnekle açıklayalım:

public class Rectangle
{
    private int width;
    private int height;

    public void SetWidthHeight(int width, int height)
    {
        this.width = width;
        this.height = height;
    }
}

     Yukarıdaki örnekte, Rectangle isimli bir sınıfımız var ve sınıfımızın iki adet değişkeni mevcut: width ve height. Bu değişkenlere değer atamak için de SetWidthHeight metodu mevcut. Metodun aldığı parametre isimleri sınıfın değişken isimleri ile aynı. Bu durumda eğer this keyword’ünü kullanmazsak sınıf değişkenlerine atama yapılmayacak, saçma bir kod yazmış olacağız. Dolayısıyla burada this kelimesini kullanmamız mecburi. Bir başka örnek daha verelim:

public class Rectangle
{
    public int Width;
    public int Height;

    public int GetArea()
    {
        Calculator calculator = new Calculator();
        return calculator.CalculateArea(this);
    }
}

public class Calculator
{
    public int CalculateArea(Rectangle rectangle)
    {
        return rectangle.Width * rectangle.Height;
    }
}

     Yukarıdaki örnekte ise iki sınıf mevcut: Rectangle ve Calculator. Normalde bu şekilde iki sınıf kullanımı biraz saçma; ancak this kullanımına örnek vermek için kullanılabilir. Rectangle sınıfı içerisinde GetArea metodu mevcut. Calculator sınıfı içerisinde ise parametre olarak Rectangle tipinde bir değişken alan CalculataArea metodu mevcut. Rectangle içerisindeki GetArea metodunu çağırdığımızda Calculator tipinde bir değişken oluşturup, CalculateArea metoduna this parametresi geçerek çağırıyoruz. this’in anlamı aslında “bu sınıf” demek. Yani herhangi bir sınıf içerisinde this kelimesi görürseniz, içinde bulunduğunuz sınıfı ifade ediyor demektir.

get ve set anahtar kelimeleri

     Sınıflar içerisinde dışarıdan erişilebilecek değişkenler, yani public olarak tanımlanan değişkenler genelde property olarak tanımlanır. Property’lerin ise get ve set tanımları vardır. Private olan değişkenler ise genelde field olarak tanımlanır ve herhangi bir get veya set tanımları yoktur. Elbette ki private property tanımları da yapabilirsiniz veya public field tanımları. Sadece diğer türlüsü daha uygun olacaktır. Değişkenin get ve set tanımı varsa property, yoksa field olarak adlandırılır. Field ve property kullanımına örnek verelim:

public class Rectangle
 {
    private int width;
    private int height;

    public int Width
    {
        get
        {
            return this.width;
        }
        set
        {
            this.width = value;
        }
    }

    public int Height
    {
        get
        {
            return this.height / 10;
        }
        set
        {
            this.height = value * 10;
        }
    }

    public int Area
    {
        get
        {
            return this.width * this.height;
        }
    }
 }

     Yukarıdaki kod bloğunda, küçük harfle yazılmış olan width ve height değişkenleri birer field’dır ve private oldukları için dışarıdan erişime kapalıdırlar. Büyük harfle yazılmış olan Width, Height ve Area ise get ve set metotları olduğu için birer property’dir ve public oldukları için dışarıdan erişime açıktırlar. Width property’sine bakacak olursak, get metodu içerisinde sadece this.width değerini return ediyor, aslında tek amacı private olan width değişkenini dışarı açmak. Height property’sinde de benzer bir işlem yapılıyor; ancak height değeri return edilmeden önce 10’a bölünüyor (örnek olsun diye yazdım, bir anlamı yok). Aynı şekilde height değişkenine değer atanırken de 10 ile çarpılıyor. set metotları içerisindeki value değişkeni eşitliğin sağ tarafındaki değeri ifade eder. Örneğin rectangle.Height = 100 dediğimizde, value değeri 100 olur. Area property’sinde ise sadece get metodu bulunmakta. Bu metot içerisinde ise width ve height çarpımı dönülüyor. Burada, gördüğünüz gibi set metodu yok, çünkü eğer en ve boy belliyse alan değerinin set edilmesi zaten saçma olur. Örneğin eni 5cm, boyu 10cm olan bir dikdörtgenin alanını 70 diye set edemezsiniz. Alanın 50 olduğu bellidir ve bu değeri sadece kullanabilirsiniz, değiştiremezsiniz. Eğer Area property’sine değer set’lemeye çalışırsanız, ör: rectangle.Area = 70 gibi, projeniz build olmayacak ve aşağıdaki hatayı alacaksınız:

Property or indexer ‘Rectangle.Area’ cannot be assigned to — it is read only

     Yukarıdaki hatada demek istediği, Rectangle sınıfının Area property’sinin değerini sadece okuyabilirsiniz, değer ataması yapamazsınız. get ve set ile alakalı olarak son bahsedeceğim şey ise, bu metotlara da erişim belirleyiciler tanımlayabilirsiniz.

public class Rectangle
{
    private int width;

    public int Width
    {
        get
        {
            return this.width;
        }
        private set
        {
            this.width = value;
        }
    }

    public void SetWidth(int width)
    {
        this.Width = width;
    }
}

     Yukarıdaki örnekte set metodunu private yaptık. Yani, Width property’sine sadece Rectangle sınıfı içerisinde değer atanabilir. SetWidth metodunda değer atandığnı görebilirsiniz. Ancak sınıf dışarısında başka bir yerde rectangle.Width = 100 gibi bir atama yapmaya çalışırsanız projeniz build olmayacak ve aşağıdaki hatayı alacaksınız:

The property or indexer ‘Rectangle.Width’ cannot be used in this context because the set accessor is inaccessible

Yapıcı metotlar (Constructor)

     Yapıcı metot, bir sınıfı new anahtar kelimesiyle oluşturduğunuz anda çalışan metotlardır. Yazılması zorunlu değildir, genelde başlangıç değerlerinin atanması için yazılır. Constructor’ın geri dönüş tipi yoktur ve ismi sınıf ismiyle aynı olmalıdır. Geri dönüş tipi yok derken void olmasından bahsetmiyoruz, hiçbir dönüş tipi belirtilmemesinden bahsediyoruz. Bir sınıfın birkaç tane constructor’ı olabilir, tabi aldığı parametreler farklı olmak koşuluyla. Örneğimize geçelim:

class Program
{
    static void Main(string[] args)
    {
        Rectangle rectangle1 = new Rectangle();
        rectangle1.Width = 20;
        rectangle1.Height = 15;

        Rectangle rectangle2 = new Rectangle(20, 15);
    }
}

public class Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }

    public Rectangle()
    {
        this.Width = 10;
        this.Height = 5;
    }

    public Rectangle(int width, int height)
    {
        this.Width = width;
        this.Height = height;
    }
}

     Bu örneğimizde yine Rectangle sınıfını kullandık ve sınıfımıza iki adet constructor tanımladık. Birincisi hiçbir parametre almazken ikincisi en ve boy parametrelerini alıyor. Birincisi varsayılan olarak eni 10, boyu da 5 olarak setliyor. Asıl programımızda yani Main metodumuzda, rectangle1 değişkeni oluşturulurken new Rectangle() dediğimizde hiç parametre geçmiyoruz ve doğal olarak birinci constructor’ı kullanmış oluyoruz. Yani rectangle1 10×5’lik bir dikdörtgen oluyor. Ardından Width ve Height değerlerini 20×15 olacak şekilde setliyoruz. rectangle2 değişkenimizi oluştururkense new Rectangle(20,15) diyerek constructor’a iki parametre geçiyoruz ve dolayısıyla ikinci constructor çağrılıyor ve direkt olarak 20×15’lik bir dikdörtgen elde ediyoruz. Gördüğünüz gibi constructor’ın asıl amacı başlangıç değerlerini setlemek. Tabiki başka şeyler yapmak için de kullanılabilir; ancak ideali budur.

Yıkıcı metotlar (Destructor)

     Öncelikle, bir sınıfın sadece bir tane destructor metodu olabilir. Bu metot içerisinde değişkeniniz bellekten silinirken yapılmasını istediğiniz şeyleri yapabilirsiniz. Örneğin bir oyun yazdığınızı düşünün. Herhangi bir anda ekrandaki araç sayısını tutan global bir değişkeniniz olsun. Tabi her araç bir değişken/sınıf demek. Ekrana yeni bir araç girdiğinde global değişkenimizin değeri bir artacak, ekrandan bir araç çıktığında ise global değişkenimizin değeri bir azalacak. Bu azaltma işlemini manuel olarak metot çağrımıyla yapabileceğimiz gibi, araç sınıfının destructor’ına yazıp otomatik olarak yapılmasını da sağlayabiliriz. Destructor’ın da geri dönüş değeri bulunmamaktadır ve başında ~ (tilda) işaretiyle beraber sınıf ismiyle aynı olmak zorundadır. Destructor’ın çağrımı Garbage Collector (GC) adı verilen özel bir yapı tarafından yapılır. Örnek bir destructor yazımı aşağıdaki gibidir:

public class Rectangle
{
    ~Rectangle()
    {
        Console.WriteLine("Destructor çağrıldı.");
    }
}

     Böylelikle bu dersimizin de sonuna geldik. Bir sonraki dersimiz yine sınıflar hakkında olacak ve sınıflarla alakalı son dersimiz olacak. İçeriğinde ise static sınıflar, singleton sınıflar, struct ve enum yapılarından bahsedeceğiz. Sonraki dersimizde görüşmek üzere…

Bu makaleye 2 yorum yapılmış

  • Barış

    24 Nisan 2016 at 12:33 Cevapla

    Hocam emeğinize sağlık gene harika bir makale olmuş.

Yorum Yapın

*

warning
www.kemalkefeli.com.tr üzerindeki herhangi bir yazının veya kodun izinsiz olarak başka bir yerde kullanılması yasaktır.