Özellik ve arabirimleri anlama3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList sepet=new ArrayList(); //object türünden bir kolleksiyon
            List<Urun> sepet = new List<Urun>(); //Urun turunde generic bir collection olan List i kullandık.
            Urun kalem = new Urun();
            Urun silgi = new Urun();
            Urun defter = new Urun();
            Urun kitap = new Urun();
            kalem.Ad = "çıtçıt"; kalem.Fiyat = 12.55M; kalem.adet = 5;
            silgi.Ad = "kokulu"; silgi.Fiyat = 15.2M; silgi.adet = 10;
            defter.Ad= "çizgili"; defter.Fiyat = 9.54M;
            kitap.Ad = "Roman"; kitap.Fiyat = 25.99M;
            sepet.Add(kalem); sepet.Add(silgi); sepet.Add(defter); sepet.Add(kitap);
            Console.WriteLine("Urun Adı:\tUrun Fiyat:\tUrun Adet:\t Kdvli Fiyat\tUrunSeriNo:\t\t");
            Console.WriteLine("--------\t--------\t-------\t\t------\t\t-----\t\t");
            foreach (Urun  item in sepet)
            {
                //Urun urunum = (Urun)item;//List türünde kolleksiyon kulladığımız için Unboxing işlemine gerek kalmadı.
                Console.WriteLine("{0}\t\t {1}\t {2}\t {3}\t {4}\t", item.Ad, item.Fiyat, item.adet, item.KdvHesapla().ToString(), item.SeriNo);
            }
        }
        interface IUrun
        {
             string Ad { get; set; }
             decimal Fiyat { get; set; }
             decimal KdvHesapla();
        }
        class Urun : IUrun
        {
            Guid seriNo;

            public Guid SeriNo
            {
                get { return seriNo; }//kimsenin değiştirmesin diye sadece okunur özellik yaptık.
            }
            public Urun()
            {
                seriNo = Guid.NewGuid();
            }
            string _ad;
            public int adet = 1;
            public string Ad
            {
                get
                {
                    return _ad;
                }
                set
                {
                    _ad = value;
                }
            }
            decimal _fiyat;
            public decimal Fiyat
            {
                get
                {
                    return _fiyat;
                }
                set
                {
                    _fiyat = value;
                }
            }
            public decimal KdvHesapla()
            {
                return _fiyat * 1.18M*adet;
            }
        }
        enum Renkler
        {
            Mavi,Kırmızı,Yeşil,Siyah,Gri,Turuncu,Mor,Beyaz
        }
    }
    
}

Özellikleri Anlama 2

Merhaba sevgili öğrenciler,

Bu makalede  özellikleri kullanma, sadece okunabilir özellikler, static alanlar ve hatta kucuk projemizi geliştirerek kollesiyon kullanmayı oğreneceğiz.

Daha önce ki makalede de belirtiğimiz gibi özellikle akıllı alanlardır demiştik kısaca. Örnek TextBox sınıfının Text özelliği gibi. Sadece get olan bir özelliklere sadece okur, sadece set olan özelliklere sadece yazılabilir özellik demiştik. Şimdi bunları pekiştiren örneğimizi Console Application projesi olarak yazalım.

Oncelikle Personel clasımızı ve cinsiyet enum değer türünü yazalım..

    enum cinsiyet  { kiz,erkek }
    class Personel
    {
        string ad, soyad;
        cinsiyet cinsiyeti;
        public string Ad
        {
            get { return ad; }
            set { ad = value; }
        }
        public string Soyad
        {
            get { return soyad; }
            set { soyad = value; }
        }
        public string AdSoyad
        {
            get { return ad + " " + soyad; }
        }
    }

Burada AdSoyad sadece oknur bir özelliktir. Bu senaryayo göre ad soyad değerini aynı özellikte set etmek mantıksız olacaktır.

class Program
    {
        static void Main(string[] args)
        {
            Personel eleman = new Personel();
            eleman.Ad = "mürteza";
            eleman.Soyad = "ivedik";
            //recep.AdSoyad = "recep ivedik"; // çalışmaz. çünkü sadece okunur bir özelliktir.
            Console.WriteLine("{0} ",eleman.AdSoyad);
        }
    }

Şimdi artık personel tipinde olan eleman nesnemize değer aktarımı  yapabliriz ve Ad ve soyad özellikleri erişebilir veya herikisi bir de AdSoyad özelliği ile erişebiliriz.

Şimdi senaryonuzu geliştirelim. enum türünde cinsiyet  özelliği ekleyelim. Sadece az sayıda değişmeyen bir tür olduğu için enum türünü seçtim.

enum cinsiyet  { kiz,erkek }

ve Personel Sınıfını özellik ekleyelim.

cinsiyet cinsiyeti;
        public cinsiyet Cinsiyeti
        {
            get { return cinsiyeti; }
            set { cinsiyeti = value; }
        }

Anaprogramızı bunları kullanacak kodlarıda yazdıktan sonra projemiz aşağıdaki gibi olacaktır.

namespace Özellikler2
{
    enum cinsiyet  { kiz,erkek }
    class Personel
    {
        string ad, soyad;
        cinsiyet cinsiyeti;
        public cinsiyet Cinsiyeti
        {
            get { return cinsiyeti; }
            set { cinsiyeti = value; }
        }
       
        public string Ad
        {
            get { return ad; }
            set { ad = value; }
        }
        public string Soyad
        {
            get { return soyad; }
            set { soyad = value; }
        }
        public string AdSoyad
        {
            get { return ad + " " + soyad; }
        }

    }
  
    class Program
    {
        static void Main(string[] args)
        {
            Personel eleman = new Personel();
            eleman.Ad = "mürteza";
            eleman.Soyad = "ivedik";
            Console.WriteLine("{0} cinsiyeti {1} ", eleman.AdSoyad,eleman.Cinsiyeti);
        }
    }
}

Şimdi eski konularıda gördüğümüz  static bir alanı burada kullanmak istiyorum. Static alanlar değer türleri gibi işlem görürler, ve belleğin stack bölgesinde tutulurlar.

        public static int nufus;
        public Personel()
        {
            nufus++;
        }

Personel sınıfımıza satatic bir alan ekledik, bunu kurucu yöntemin içinde 1 arttırarak kullandık. nufus static alanı personel sınfının örnek oluşturma sayısını tutar. Çünkü her new Personel(); satırında  nufus++ satırı işlemektedir. Burada static deyimi silersek, nufus bilgisinin hep sıfırlandığını görürüz. Zaten bu nedenle static bir alan tanımladım.. Bu değeri yazdıran kod satırnı main yöntemine eklersek, programın son hali aşağıdaki gibi olacaktır.

using System;

namespace Özellikler2
{

    enum cinsiyet { kiz, erkek }
    class Personel
    {
        public static int nufus;
        public Personel()
        {
            nufus++;
        }
        string ad, soyad;
        cinsiyet cinsiyeti;
        public cinsiyet Cinsiyeti
        {
            get { return cinsiyeti; }
            set { cinsiyeti = value; }
        }

        public string Ad
        {
            get { return ad; }
            set { ad = value; }
        }
        public string Soyad
        {
            get { return soyad; }
            set { soyad = value; }
        }
        public string AdSoyad
        {
            get { return ad + " " + soyad; }
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Personel eleman = new Personel();
            Personel eleman2 = new Personel();
            Personel eleman3 = new Personel();
            eleman.Ad = "mürteza";
            eleman.Soyad = "ivedik";
            Console.WriteLine("{0} cinsiyeti {1}, nufus :{2} ", eleman.AdSoyad, eleman.Cinsiyeti, Personel.nufus);
        }
    }
}

Ekran çıktısı

mürteza ivedik cinsiyeti kiz, nufus :3
Press any key to continue . . .

Şimdi ben projemizi biraz daha geliştirmek istiyorum. 18-19 kişil bir takim oluşturmak istiyorum. Personel türünde bir ArrayList (kolleksiyon) oluşturalım. Bir döngü içinde personel nesnesi oluşturalım  ve kolleksiyonumuza ekleyelim. Foreach deyimiyle bu kolleksiyondaki bütün elemenlara erişerek yazdıralım.. ArrayList başka bir isim alanında olduğu için

using System.Collections; projemi ekledim.

static void Main(string[] args)
        { 
             ArrayList bizimTakim = new ArrayList();
           //nufusu attırmak için isimsiz 18 kişi ekleyelim.
            for (int i = 0; i < 18; i++)
            {
                bizimTakim.Add(new Personel());
            }

            Personel eleman = new Personel();

            bizimTakim.Add(eleman);
            eleman.Ad = "mürteza";
            eleman.Soyad = "ivedik";

            foreach (Personel  item in bizimTakim)
            {
                Console.WriteLine("{0} cinsiyeti {1}, nufus :{2} ", item.AdSoyad, item.Cinsiyeti, Personel.nufus);
            }
        }

Arraylist kullanma, bir kolleksiyondaki değerleri erişme, foreach deyimini kullanmayı tekrar etmiş olduk. Ben bir başka List<> generic sınıfnı kullanarak yine bizim takıma değer girmek istiyorum. Amacım List<> sıınıfı kullanımını göstermek. Burada  lambada(=>) deyimini kullanarak foreach deyimi ile bizimTakim kolleksiyonuna eklemeler yaptım. List<> deyimi için using System.Collections.Generic; satırınıekleyerek , projeme  Collection.Generic isim alanını projeme dahil ettim. Lambada deyimiyle ilgili daha geniş  bilgi için bu makaleye başvurabilirsiniz. 

class Program
    {
        static void Main(string[] args)
        {
            ArrayList bizimTakim = new ArrayList();
            for (int i = 0; i < 18; i++)
            {
                bizimTakim.Add(new Personel());
            }
            new List<Personel> {
                new Personel { Ad="kemal", Cinsiyeti=cinsiyet.erkek, Soyad="balli"},
                new Personel { Ad="mustafa", Soyad="dal", Cinsiyeti=cinsiyet.erkek },
                new Personel {Ad="bennu", Soyad="baner", Cinsiyeti=cinsiyet.kiz}
            }.ForEach(t => bizimTakim.Add(t));

            Personel eleman = new Personel();
            bizimTakim.Add(eleman);
            eleman.Ad = "mürteza";
            eleman.Soyad = "ivedik";

            foreach (Personel  item in bizimTakim)
            {
                Console.WriteLine("{0} cinsiyeti {1}, nufus :{2} ", item.AdSoyad, item.Cinsiyeti, Personel.nufus);
            }
        }
    }

Bir sonraki makalemizede görüşmek üzere hoşçakalın. Bu makalenin sonuna flickr.com adresinden seçtiğim bir resmi  koymak istiyorum.

 

Özellikleri Anlama3(properties)

Senaryomuz gereği bir doğrunun uzunluğu bulan bir program yazacağız. Bu doğrunun ANoktasi ve BNoktasi isimli özellikleri olacak ve bu özelliklere değer aktarımı yapacağız. Daha sonrada bu Dogru sınıfının IkiNoktaArasiniBul() isimli bir yöntem yazacağız. Bir doğrunun uzunluğunu bulmak için kordinat düzleminde bu doğruyu çiziyoruz. Problemin matematiksel çözümünü buradan inceleyebilirsiniz.

 

 Programımız için aşağıdaki gibi bir form hazırlayalım..

Öncelikle küçük değerleri tutan bir class yerine Struct(Yapı) kullanmak daha avantajlı ve hızlı olduğunu hatırlatmak isterim. Yapıların ilk değerleri 0,  "" gibi ilk değerleri olması garanti altındadır. Tıpkı int a; tanımladığımızda anın ilk değeri 0 olması gibi. Enum, struct, double, int gibi önceden tanımlı tipler değer türüdür. String tipinin referans(başvuru) türü olduğunu hatırlayalım..

Point isimli yapımızı oluşturalım...

struct Point  //değer türlerinin başlangıç değerlerinin olması garanti altındadır.
    {  
        public int x, y;
        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

Daha sonra Dogru classımızı oluşturuyoruz. Özellik oluşturmanın bir yöntemide Sınıfımız üyesi üzerinde sağ tuşa tıklayıp, refactor, Encaptulation Filed  tıklayarak oluşturmaktır. Diğer bir deyişle bir alanı özeliklik kullanarak kapsülleme işlemi yapmaktır.

class Dogru
    {
        Point aNoktasi;
        Point bNoktasi;

        internal Point BNoktasi
        {
            get { return bNoktasi; }
            set { bNoktasi = value; }
        }

        internal Point ANoktasi
        {
            get { return aNoktasi; }
            set { aNoktasi = value; }
        }

        public double IkiNoktaArasiBul()
        {
            double sonuc = Math.Sqrt(((aNoktasi.x - bNoktasi.x) * (aNoktasi.x - bNoktasi.x)) + (aNoktasi.y - bNoktasi.y) * (aNoktasi.y - bNoktasi.y));
            return sonuc;
        }
    }

Hesapla butonunun click olayını işleyelim..Butonun üzerinde çift tıklayarak gerekli kodları yazalım...

 

private void btnHesapla_Click(object sender, EventArgs e)
        {
            int ax = Convert.ToInt32(tbAx.Text);
            int ay = Convert.ToInt32(tbAy.Text);
            int bx = Convert.ToInt32(tbBx.Text);
            int by = Convert.ToInt32(tbBy.Text);
            Point  A = new Point(ax, ay);
            Point  B = new Point(bx, by);
            Dogru dogrum = new Dogru();
            dogrum.ANoktasi = A; //ANoktasi isimli Özelliğini değer ataması yaptım..
            dogrum.BNoktasi = B;
            double sonuc = dogrum.IkiNoktaArasiBul();
            lblSonuc.Text = sonuc.ToString();

        }

Projemizi bu linkden indirebilirsiniz. 

ozellik5.rar (40,71 kb)

Bir sonraki yazıda görüşmek üzere. Esenlikle kalın..

 

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.