- 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. }
Related posts
Kategoriler
- ASP.NET (1)
- C# (13)
- SQL İpuçları ve Püf Noktaları (1)
- SQL Server (4)
- Uncategorized (1)