Yapı ve Sınıf Arasındaki Fark

Struct Nedir

Yapılar değer türünde olduklarından belleğin yığın (stack) bölümünde, sınıflar ise referans türünde oldukları için belleğin öbek (heap) bölümünde depolanırlar.

Değişken ve sınıfları bellek bölgesinde tutulma biçimleri

Sınıflar için varsayılan (default) yapıcı (contructor) metotlar yazılabiliyorken yapılarda bunu yapamayız. Fakat yapılarda parametreli yapıcılar tanımlayabiliriz. Burada dikkat edilmesi gereken nokta ise yapılarda tanımladığımız parametreli yapıcılara ilk değer ataması yapmak zorundayız. Sınıflarda ise buna gerek yoktur. Çünkü derleyici bizim yerimize ilk değer atamasını yapacaktır.

Örnek

namespace DikdortgenAlan
{
    class Dikdortgen
    {
        public int kisaKenar;
        public int uzunKenar;

        public Dikdortgen() // Varsayılan yapıcı metot.
        {
            kisaKenar = 5;
            uzunKenar = 6;
        }

        public int alanHesap()
        {
            int alan;
            alan = kisaKenar * uzunKenar;
            return alan;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Dikdortgen dortgen = new Dikdortgen();
            Console.WriteLine(dortgen.alanHesap());
            Console.ReadKey();
        }
    }
}
Ekran Çıktısı

Yukarıdaki örnekte Dikdortgen adında bir tane sınıf tanımladık. Bu sınıfa varsayılan yapıcı metot aracılığıyla kisaKenar ve uzunKenar değişkenlerine varsayılan bir değer atadık. Program içerisinde bu sınıftan yei bir nesne türettiğimiz zaman bu değerler varsayılan olarak atanacaktır. Dikkat ettiyseniz alanHesap() metodumuza bir değer ataması yapmadığımız halde program doğru bir şekilde çalışmıştır.

namespace DikdortgenAlan
{
    struct Dikdortgen
    {
        public int kisaKenar;
        public int uzunKenar;

        public Dikdortgen() // Varsayılan yapıcı metot.
        {
            kisaKenar = 5;
            uzunKenar = 6;
        }

        public int alanHesap()
        {
            int alan;
            alan = kisaKenar * uzunKenar;
            return alan;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Dikdortgen dortgen = new Dikdortgen();
            Console.WriteLine(dortgen.alanHesap());
            Console.ReadKey();
        }
    }
}

Aynı işlemi yapı (struct) kullanarak yapmaya çalışırsak aşağıdaki resimde görünen hatayı alırız. Hatanın sebebi, yapılarda parametresiz varsayılan yapıcı tanımlanamamasıdır.

Hata penceresi

Fakat yapılarda parametre alan yapıcı metotlar tanımlayabildiğimizi belirtmiştim.

 struct Dikdortgen
    {
        public int kisaKenar;
        public int uzunKenar;

        public Dikdortgen(int m_kisaKenar, int m_uzunKenar)
        {

        }

Yukarıdaki tanımlada yapıcı metoda ilk değer ataması yapmadığımız için yine hata ile karşılaşılacaktır.

namespace DikdortgenAlan
{
    struct Dikdortgen
    {
        public int kisaKenar;
        public int uzunKenar;

        public Dikdortgen(int m_kisaKenar, int m_uzunKenar)
        {
            kisaKenar = m_kisaKenar;
            uzunKenar = m_uzunKenar;
        }

        public int alanHesap()
        {
            int alan;
            alan = kisaKenar * uzunKenar;
            return alan;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Dikdortgen dortgen = new Dikdortgen(7, 9);
            Console.WriteLine("Alan: {0}", dortgen.alanHesap());
            Console.ReadKey();
        }
    }
}
Ekran çıktısı

Yapılarda sınıflar gibi türetme yapamayız. Bir sınıf tanımlarken bir başka sınıfı temel alan yani kalıtım yoluyla oluşturabiliyoruz fakat bir yapıcı bir başka yapıyı temel alarak oluşturamayız.

Yapılar işleri bittikleri zaman bellekten otomatik olarak silindikleri için yıkıcı metotları tanımlayamayız.

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.