• Tüm struct’ların varsayılan ctor.’ı vardır.
  • Struct’larda varsayılan ctor’ın görevi : tüm field’lara ilk değer ataması yapmaktır.
  • Bir struct’ın ctor’ı, kesinlikle ve kesinlikle tüm field’lara değer ataması yapmalıdır.
  • Bir struct’ın kullanılabilir hale gelmesi için kesinlikle tüm field’larına değer ataması yapılmalıdır.
 struct Ogrenci
    {
        //Bir struct kullanılabilir hale gelmesi için tüm field'ları ilk değerlerini almalıdır. Bunun kolay yolu, new ile varsayılan ctor'ı çağırmaktır.
        public string AdSoyad;
        public int Not;

        //ÖNEMLİ NOT : Class'larda, bir tane ctor biz yazarsak, artık varsayılan ctor yazılmaz.
        //Ancak struct'larda, biz ctor yazsak da o struct'ın varsayılan ctor'ı yazılır ve bu yazılan varsayılan ctor'ın görevi, tüm field'lara ilk değer atamalarını yapmaktır.

        public Ogrenci(string adSoyad, int not)
        {
            AdSoyad = adSoyad;
            Not = not;
            //Struct içerisine yazılan ctor'larda, tüm field'lara ilk değer ataması yapılmalıdır.
        }

        public Ogrenci(string adSoyad)
        {
            AdSoyad = adSoyad;
            Not = 0;
        }

        //Bir struct içerisine, parametre almayan ctor yazamayız!
        //public Ogrenci()
        //{
        //    AdSoyad = null;
        //    Not = 0;
        //}

        public string BilgiVer()
        {
            return string.Format("AdSoyad : {0},Not : {1}", AdSoyad, Not.ToString());
        }        
    }
  struct Nokta
    {
        int _x;
        int _y;

        public int X
        {
            get { return _x; }
            set { _x = value; }
        }
        public int Y
        {
            get { return _y; }
            set
            {
                _y = value;
            }
        }

        //Bu ctor içerisinde, tekrar field'lara 0 atamak yerine öncelikle varsayılan ctor'ın çalışması sağlanabilir.
        public Nokta(int x, int y):this()
        {            
            //Şu anda 141 nolu satırda hiçbir field değerini almamıştır.
            //Değerini almayan field'lar bulunduğu için, struct kullanıma hazır değildir.
            //Dolayısıyla bu struct üzerinden, field değerlerini almamışken, metot çağrısı yapılamaz.

            //_x = 0; _y = 0; //Field'lara ilk değer ataması yaptıktan sonra ancak struct kullanılabilir ve üzerinden metot çağrısı yapılabilir.
            
            this.X = x;
            //set_X()
            this.Y = y;
        }
    }
 struct A
    {
    }

    class TabanSinif
    {
    }

    //bir struct'ı başka bir struct'tan kalıtamayız.
    //struct B : A
    //{
    //}

    //bir struct'ı başka bir class'tan kalıtamayız.
    //struct B : TabanSinif
    //{
    //}

    //Struct'lar kalıtıma destek vermezler, diğer bir deyişle struct'ları istediğimiz bir tipten kalıtamayız. Tüm struct'lar otomatik olarak ...System.ValueType..... tipinden kalıtırlar.
 //Struct'lara, interface implemente edilebilir.
    struct Point:IComparable
    {
        #region IComparable Members

        public int CompareTo(object obj)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
 static void Main(string[] args)
        {
            #region Struct'lar değer türü davranışı gösterirler
            //Ogrenci o1 = new Ogrenci();
            //o1.Not = 80;
            //Ogrenci o2 = new Ogrenci();
            //o2.Not = 60;

            //o1 = o2;
            //o1.Not = 45;

            //Console.WriteLine(o2.Not.ToString()); 
            #endregion
            
            #region Int32 değer türü davranışı
            //Int32 a = 5;
            //Int32 b = 10;
            //a = b;
            //a = 50;
            //Console.WriteLine(b.ToString()); 
            #endregion

            #region Struct kullanımı
            //Siparis bir class olduğu için stack'te bir pointer oluşur.
            //Siparis s;

            //Ogrenci bir struct olduğu için stack'te nesnenin kendisi oluşur, içindeki not bilgisi rassal bir değere sahiptir.
            Ogrenci o1;
            //Console.WriteLine(o1.Not);//rassal değere sahiptir ve derleyici tarafından kullanımına izin verilmez.
            o1.Not = 60;

            Console.WriteLine(o1.Not); 
            #endregion

            #region new anahtar sözcüğü
            //Oluşturduğumuz ogrenci nesnesi, şu anda kullanılabilir durumda değildir.
            //SORU : Bir struct nasıl kullanılabilir bir hale gelir?
            //CEVAP : Tüm field'larına ilk değer ataması yapıldıktan sonra.

            //SORU : Bir struct'ın tüm field'larına kolay bir şekilde ilk değer ataması yapılır.
            //SORU : new ile mi
            //CEVAP : evet

            //Ogrenci ogrenci;
            Ogrenci ogrenci = new Ogrenci();
            Console.WriteLine(ogrenci.BilgiVer());  
            #endregion           

            #region Alıştırma
            //Ogrenci ogr;
            //ogr.AdSoyad = "deneme";
            //ogr.Not = 50;
            //Console.WriteLine(ogr.BilgiVer());
            #endregion

            //Performans için"Bir nesnenin boyutu 16byte'tan daha az ise struct yapılmalıdır".
            Ogrenci o9 = new Ogrenci("deneme", 50);
            Console.WriteLine(o9.BilgiVer());
            Ogrenci o10 = new Ogrenci("test", 50);

            //SORU : Kimler struct olarak tasarlanmalıdır?
            //CEVAP : Değer türü davranışı göstermesi istenen nesneler struct olarak tasarlanmalıdır.
        }