26 Oca 2016

Değişkenlerin Yaşam Döngüsü ve Class Kullanımı

C#'ta tanımladığınız herşey object sınıfından türer. int türündeki bir değişkeni aşağıdaki gibi de tanımlayabilirsiniz hatta böyle tanımlamasanız bile C# derleyicisi sizin için aşağıdaki kodu çalıştırır;
int x = new int();

Üstteki satırı bir metot içine yazmışsak x değişkeni sadece o scope'da ya da o metodun içinde geçerlidir. Akış o metottan çıktığında c#'ın çöp toplayıcısının (garbage collector) onu bellekten silmesi için kuyruğa girer ve bir daha kullanılamaz.
Peki x'i bir sınıfın özelliği olarak tanımlarsak ne olur? O zaman sınıfın kopyası new ile alındığında yaşam döngüsü başlar ve sınıf aynı yukarıdaki x gibi tanımlandığı başka yerdeki bir metodun veya başka kendisi gibi bir sınıfın içinde yok edilene kadar sürer.
public class A
        {
            public int x = new int();
        }
public class B
        {
            public void Metod()
            {
                A a = new A();
                a.x = 3;
            }
        }
Sadece erişim seviyesi, class ve sınıf adı yazarak yukarıda 2 sınıf tanımladık. A'nın içine bir x özelliği oluşturduk ve dışarıdan kullanılabilmesi için public yetkisi verdik. B sınıfının içinde bir metod tanımladık ve bunun içinde A sınıfından bir kopya aldık. Bu kopyayı a'ya eşitledik. Artık a değişkeni ve içindeki özellikler metod scope'u bitene kadar kullanılabilir. a'nın x'ine  3 atadık ve bu noktadan sonra metot bitti. Bu noktadan sonra a ve a.x'e ulaşılamaz.

Örnek Uygulama:
class Program
    {
        static void Main(string[] args)
        {
            //aşağıda tanımlı sınıfları kullanmak için ana programda uygun kodları yazmalıyız.
            Ogrenci o = new Ogrenci();
            o.ad = "Gökalp";
            o.no = 1234;
            o.AldigiNotlar.Add(new SinavNotu { ders = DersTipi.Fizik, not = 70 });
            o.AldigiNotlar.Add(new SinavNotu { ders = DersTipi.Matematik, not = 0 });
            o.AldigiNotlar.Add(new SinavNotu { ders = DersTipi.Kimya, not = 90 });
            o.AldigiNotlar.Add(new SinavNotu { ders = DersTipi.Turkce, not = 100 });

            Console.WriteLine("Adı: {0}, Numarası {1} ", o.ad, o.no);
            Console.WriteLine("Aldığı notlar: ");

            foreach (SinavNotu item in o.AldigiNotlar)
            {
                Console.WriteLine("{0} - {1}", item.ders.ToString().PadRight(10), item.not.ToString().PadLeft(3));
            }
            Console.ReadKey();
        }
    }
    public class Ogrenci
    {
        public string ad;
        public int no;
        public List<SinavNotu> AldigiNotlar = new List<SinavNotu>(); 
//Adı AldigiNotlar tipi SinavNotu olan bir liste. Bu durumda SianvNotu sınıfını kendimiz yazmalıyız.
    }
    public class SinavNotu
    {
        public DersTipi ders; //DersTipi veri tipi için enum tipini kullandık
        public int not;
    }
    public enum DersTipi{Matematik = 0, Fizik = 1, Kimya = 2, Turkce = 3} //değer ve indeks no şeklinde tanımlanır

ÇIKTISI:


Önce öğrenci sınıfından bir kopya alındı ve o değişkenine atandı. Artık o değişkeninin özellikleri kullanılabilir hale geldi. ad ve no özelliklerine gerekli atamalar yapıldı. o değişkeni bundan sonra scope içindeki hayatı boyunca bu özelliklerin değerini hatırlayacak.
o.AldigiNotlar.Add(new SinavNotu { ders = DersTipi.Fizik, not = 70 });
Ardından elimizde bulunan boş listeye yukarıdaki gibi listenin kabul ettiği tipte eleman eklemesi gerçekleştirdik. Eğer liste int kabul eden List<int> olsaydı int eleman ekleyecektik fakat bizim listemiz <SinavNotu> şeklinde tanımlanmış bundan dolayı bu tipte bir eleman eklemeliyiz. SinavNotu sınıfından aynı satırda bir kopya alıp değerlerini aynı satırda vererek ekliyoruz. Yukarıdaki kod parçası aşağıdaki kod ile aynı işlevi görmektedir;
SinavNotu s = new SinavNotu();
s.ders = DersTipi.Fizik;
s.not = 70;
o.AldigiNotlar.Add(s);
Eğer kodu böyle yazsaydık s değişkenine bir daha ihtiyacımız olmayacaktı. Ve yukarıdaki işlemi 4 ders için 4 kere yapmamız gerekecekti.
Buraya kadaro'nun özelliklerine değer atadık ardından o'yı kullanarak ekrana yazdırıyoruz.
foreach satırını okurken; o.AldigiNotlar içindeki her SınavNotu tipindeki eleman item değişkenine atanmış olsun diye okuruz. iteratör SinavNotu tipinde yaptık çünkü kontrol edilecek liste de List<SinavNotu> şeklinde tanımlanmıştı.  PadRight(10) eğer ders adı 10 karakterden kısa gelirse sağına boşul atarak 10'a tamamla anlamına gelmektedir. Böylece -'ler aynı hizada olacaktır. not değişkenini de yazdırırken sağa yaslamak için PadLeft(3) ile sağına max. 3 boşluk attık.

Hiç yorum yok:

Yorum Gönder