Friday, September 21, 2012

Protected Erişim Belirleyicisi (C#)


Protected Erişim Belirleyicisi

Sınıflar konusunda belirleyicilerini incelerken, protected erişim belirleyicisini türetmeyi anlatırken inceleyeceğimizi
söylemiştik. Kalıtım yolu ile sadece puplic ve protected elemanlar aktarılır. Temel sınıfta bulunan private üye elemanlara
türeyen sınıf içersinde ulaşamayız. Örneğin aşağıdaki kullanım geçersizdir.

using System;

class Memeli

{
  private double Boy;
  private double Agirlik;

  puplic void OzellikGoster()
  {
    console.WriteLine("Boy = " + Boy);
    console.writeline("Ağırlık = " + agirlik);
  }
}

class Kedi : Memeli
{
  puplic string Turu;
 
  puplic void BoyGoster()
  {
    Console.writeline("Boy = " + Boy);
  }
}

Burada Kedi sınıfı Memeli sınıfnda türemiş olmasına rağmen Kedi sınıfında bulunan BoyGoster() metodu içerisinden Memeli
sınıfındaki Boy özelliğinin private olarak bildirilmesidir. private özelliklerinde kalıtım yolu ile aktarılması için her
değişken için get ve set blokları tanımlanabilir. Bu durumda Memeli sınıfının private elemanlarına erişebiliriz.

Diğer sınıfların kullanımına kapalı ancak türetme ile türemiş sınıfa geçebilen özellikler protected anahtar sözcüğü ile
oluşturulur. Eğer türeme söz konusu değilse protected olarak bildirilen elemenlarla private olarak bildirilen elemanlar
arasında fark kalmaz. protected eleman içeren bir sınıf türetildiğinde bu elemanlar türemiş sınıflar içinde rahatlıkla
kullanılabilir. protected elemanlar diğer sınıflar için private olarak kalmaya devam eder. Buna göre asağıdaki sınıf
bildirimleri geçerlidir.

Get ve Set anahtar sözcükleri (C#)


Set ve get Anahtar sözükleri

get ve set anahtar sözlükleri ile bir özellik tanımlanır. Ancak bu özelliklere erişmek için belirli kod bolkarını çalıştırma
şansımız mevcuttur. Metotlar ve özellikler arasındaki tek fark özellikleri çağırırken, fonksiyon çağırmak için kullandığımız
parantezleri kullanmamızdır.

private olarak tanımlanan En ve Boy elemananlarının Dortgen sınıfı için bir arayüz oluşturmayacağı için ikisinde önüne
member(üye) sözcüğünü temsil eden "m" harfini koyacağız. Böylece orjinal isimler get ve set erişimlerini kullancağımız
özelliklerde kalacaktır.

Dortgen sınıfının yeni arayüzü aşağıdaki gibidir.

class Dortgen
{
    private int mEn;
    Private int mBoy;

    puplic int En
    {
       get
       {
         return mEn;
       }
   
       set
       {
          if (value <0)
              mEn= 0;
          else
          mEn=value;
       }
    }

    puplic int Boy
    {
       get
       {
         return mBoy;
       }
   
       set
       {
          if (value <0)
              mBoy= 0;
          else
          mBoy=value;
       }
    }
}


Value anahtar sözcüğü ise özelliklere atanacak nesnenin değerini ifade eder. Örneğin,

Dortgen d= new Dortgen();

d.En = 50;

ifadesinde value anahtar sözcüğü 50 değerini temsil etmektedir. Veri elemanı hangi türden ise value değeri de o türden olur.

This anahtar sözcüğü (C#)


This Anahtar Sözcüğü

Nesneler üzerinden metotlar çağrılırken aslında biz farkına varmadan metotlara gizlice ilgili nesnelerin referansları geçirilir.
Örneğin, this anahtar sözcüğünün anlamını daha iyi kavrayabilmek için soyutlama yapalım;

Dorgen d1= new Dortgen();

d1.EnBoyBelirle();

yerine aşağıdaki gibi bir kullanımda olabilirdi:

Dortgen d1 = new Dortgen();


d1.EnBoyBelirle(d1 'in referansı);

Eğer this anahtar sözcüğü olmasaydı ikinci şekildeki gibi bir kullanıma mecbur kalacaktık. İkinci şekildeki gibi bir kullanımın
kullanışsız olduğunu söyleyebiliriz. Bu yüzden C# dilini tasarlayanlar d1 nesnesinin referansını gizlice EnBoyBelirle()
metoduna aktarmada kullanılacak bir sistem geliştirmişlerdir. İşte this anahtar sözcüğü bu referansı temsil etmektedir.
this anahtar sözcüğü çok fazla kullanılmasa da bazı durumlarda faydalı olabilir; örneğin,
EnBoyBelirle() metodunun aşağıdaki gibi olduğunu düşünelim:

puplic void EnBoyBelirle(int En, int Boy)
{
     if(En < 0 || Boy < 0)
     {
           En= 0;
           Boy = 0;
     }
     else
     {
           En = En;
           Boy = Boy;
     }
}



EnBoyBelirle() metodunun parametreleri olan En ve Boy değişkenleri Dortgen sınıfının üye elemanları ile aynı isime sahiptir.
Metot gövdesinde kullandığımız En ve Boy değişkenleri EnBoyBelirle() metodunun parametleridir. Çünkü bir üst faaliyet
alanında olan Dortgen sınıfının En ve Boy değişkenleri EnBoyBelirle() metodunun parametleri tarafından görünmez hale gelmiştir.

Böyle bir durumda this anahtar sözcüğünü kullanarak mantıksal hatayı önlemiş oluruz.

puplic void EnBoyBelirle(int En, int Boy)
{
     if(En < 0 || Boy < 0)
     {
           this.En= 0;
           this.Boy = 0;
     }
     else
     {
           this.En = En;
           this.Boy = Boy;
     }
}


derleyecek olursak;

using System;


namespace ThisSoz
{
    class dortgen
    {
        public int En;
        public int Boy;

        public int Alan()
        {
            int Alan = En * Boy;
            return Alan;
        }
         public void EnBoyBelirle(int En, int Boy)
        {
            if (En < 0 || Boy < 0)
            {
                this.En = 0;
                this.Boy = 0;
            }
            else
            {
                this.En = En;
                this.Boy = Boy;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            dortgen d1 = new dortgen();
            d1.EnBoyBelirle(2,-5);
            Console.WriteLine("En: " +d1.En +"  "+ "Boy: " +d1.Boy);
            Console.ReadLine();
        }
    }
}
ekran çıktısı olarak En: 0 Boy: 0 sonucunu alacağız.



this anahtar sözcüğü ile EnBoyBelirle() metodunun En ve Boy parametleri, o an üzerinde çalışılan Dortgen nesnesinin En ve Boy özelliklirine atanıyor. this anahtar sözcüğünün kullanımına olanak tanımamak okunabilirlik açısından önemlidir.


Sınıf oluşturma (c#)

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

namespace siniflar
{


    class Program
    {
        static void Main(string[] args)
        {
            EV ev1 = new EV();

            ev1.kat = 3;
            ev1.oda = 2;
            ev1.semt = "besiktas";

            Console.WriteLine(ev1.Evgoster());

            Console.ReadLine();
        }
    }


    public class EV
    {
        public int kat;
        public int oda;
        public string semt;

        public string Evgoster()
        {

            return string.Format(" kat numarasi: {0} \n oda sayisi: {1} \n semt: {2}", kat, oda, semt);
        }
    }
}



Nesne Tabanlı Programlama (C#)


NESNE TABANLI PROGRAMLAMA

Nesne yönelim tekniği, gerçek hayatı programlar için simule edecej yöntemler topluluğudur. Her nesnenin kendine has özellikleri
vardır. Nesneler tamamen birbirlerinden soyutlanarak farklılaştırılır. Tabi her nesnenin birbirine mesaj göndermesi de son
derece doğaldır. Bu gerçek yaşamda da böyledir. Nesne yönelimli programlama tekniğinde gerçek bir sistem parçalara ayrılır
ve parçalar arasında ilişkiler kurulur. Nesne tabanlı programlamada önemli olan her parçayı etkili bir şekilde tasarlamaktır.



NESNE KAVRAMI

Nesneler gerçek hayatta görebildiğimiz ya da varlığını bildiğimiz eşyalardır. Nesne yönelimli programlama tekniğinde sınıflar
nesnelerin biçimlerini belirler. Oluşturduğumuz nesneler dınıf türlerinden nesneler olarak da adlandırılabilir. Her bir nesne
kendi içinde tutarlı bir yapıya sahiptir. Yani veriler arasında sıkı bir bağ vardır.

C#'ta nesne yönelimli programlama yapısını sınıflar sağlar. Sınıfları kullanarak nesneler tanımlarız. Hatırlayacağınız gibi
bir nesne aşağıdaki gibi oluşturuluyordu.

using System;

class Sınıf
{
   puplic int a;

   puplic int A()
   {
     return a;
   }
}

class MainMetodu
{
   static void Main()
   {
     Sınıf x = new Sınıf();
   }
}


Yukarıdaki programda Sınıf bir nesnenin şeklini belirlemektedir. Kısacası bir tür bilgisi saklamaktadır. new anahtar sözcüğünü
kullanarak bu türdeb x isimli bir nesne tanımlıyoruz. Bu x nesnenin bir tane veri taşıyan yapısı, bir tanede iş yapan metodu
mevcuttur.

Sınıflar bir tür  bilgisi olduğuna göre bu türü paketleyip istediğimiz programda kullanabilmemiz gerekir.



Sınıf Kütüphanesi Oluşturma

Her zaman olduğu gibi boş olduğu gibi boş bir metin dosyası açıp aşağıdaki sınıf yazalım ve RastgeleSayi.cs adıyla kaydedelim.
Bu sınıf yapısında rastgele bir değer bulunan bir özelliğe sahiptir. Ayrıca rastgele sayıyı daha sonra değiştirebilmek için
bir de Değiştir() isimli bir metot sağlanmıştır. Bu örnekte rastgele sayılar üretmek için System isim alanında bulunan
Random sınıfı kullanılmıştır.

using System;

namespace Csharp
{
  puplic class Rastgelesayi1
  {
    pravite Random rnd = new Random();
    pravite int mSayi;

    Puplic int sayi
    {
      get
       {
         return mSayi;
       }
    }
    puplic RastgeleSayi()
    {
      mSayi = rnd.Next(0,100);
    }

    puplic void Değistir()
    {
     mSayi = rnd.Next(0,100);
    }
  }
}


Yukaridaki kaynak kodda Main() metodunun olmadığına dikkat edin. Burada tanımladığınız sınıf kendi başına çalışabilen bir yapı
değildir. Ancak bir program içinde bu sınıf türünden nesneler tanımlayabiliriz.

yazdığımız sınıfın solution kısmına sağ tıklayarak build ettiğimizde daha önce belirtilen yolda sınıfın .dll dosyası derlenir.
bu dosya da yazdığımız sınıfı içeren binary düzeyde bilgiler bulunur. Dosyayı açtığımızda kodlarımızı açık bir şekilde
göremeyiz. Sınıfın  .dll dosyası elimizde olduğu sürece programlarmızda sınıfı dilediğimiz gibi kullanabiliriz.

Sınıf Kütüphanesi kullanma

Oluşturduğumuz bu sınıfı programlarımızda kullabilmek için derleyiciye .dll dosyasının yolunu bildirmek gerekir.

ana sınıfımızın bulunduğu programımızda solutionun referansına add referans dediktikten sonra .dll dosyamızı seçtikten sonra
programızın refaranslarının çağrıldığı kısma using .dll ismini eklediğimiz oluşturduğumuz sınıfı kullanabiliriz.
namespaceini eklicez bitti.


Metotlar (C#)


Metotlar tekrar tekrar aynı kodların yazılmasını önlemek için kullanılır.Bir fonsiyonun çalışması için başka bir fonksiyon tarafından çağrılması gerekir.
Metot içinde tanımladığımız kod parçacığını ana metot içinde çağırdığımız takdirde o metotun sahip olduğu deyimleride çalıştırmış oluruz. böylece
sürekli aynı kod parçacıklarını kullanmamız gereken durumlarda bize kolaylık sağlar.
metotlar ;  tür metot_adı (parametreler) { deyimler.. } şeklinde tanımlanır.
kullandığımız main fonksiyonuda buna örnektir.


private tanımlanan metotlara sadece bulundugu sınıf içersinden erişebilinirken
puplic tanımlanan metotlara ise tüm sınıflardan  erişebilinir.

bir metot Private static int metot(int x, int y) şeklinde tanımlanır. konsolda main metodu static olduğu için diğer metotlarda static tanımlanır.

örnek 1: kullanıcıdan alınan sayıları toplama, çarpma ve bolme metotlarına gönderen ve işlem yaptıran program.

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

namespace metotolar
{
    class Program
    {
        private static int toplama(int sayi1, int sayi2)
        {
            int toplam = sayi1 + sayi2;
            return toplam;
        }

        private static int carpma(int sayi1, int sayi2)
        {
            int carpim = sayi1 * sayi2;
            return carpim;
        }

        private static float bolme(float sayi1, int sayi2)
        {
            float bolum = sayi1 / sayi2;
            return bolum;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("1.sayiyi giriniz: ");
            int sayi1= Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("2.sayiyi giriniz: ");
            int sayi2= Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("toplama: "+ toplama(sayi1, sayi2));
            Console.WriteLine("carpma: "+ carpma(sayi1, sayi2));
            Console.WriteLine("bolme: "+ bolme(sayi1, sayi2));
            Console.ReadLine();
            }
        }
    }


örnek 2: rastgele sayılardan oluşan 10 elemanlı bir dizinin elemanlarını metot yardımıyla isteğe göre büyükten küçüğe veya küçükten büyüğe sıralayan program.

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

namespace diziler
{
    enum siralamatipi
    {
        artan=0, azalan=1
    }
    class Program
    {
        private static int[] sirala(int[] siralanmis)
        {
            int ara;
            Console.WriteLine("siralama tipini seciniz: ");
            siralamatipi tip = (siralamatipi)Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < siralanmis.Length; i++)
            {
                for (int j = i + 1; j < siralanmis.Length; j++)
                {
                    if (tip == siralamatipi.artan)
                    {
                        if (siralanmis[i] > siralanmis[j])
                        {
                            ara = siralanmis[i];
                            siralanmis[i] = siralanmis[j];
                            siralanmis[j] = ara;
                        }
                    }

                    else if (tip == siralamatipi.azalan)
                    {
                        if (siralanmis[i] < siralanmis[j])
                        {
                            ara = siralanmis[i];
                            siralanmis[i] = siralanmis[j];
                            siralanmis[j] = ara;
                        }
                    }

                }
            }
            return siralanmis;
        }

        static void Main(string[] args)
        {

            int[] dizi = new int[10];
            Random rnd = new Random();

            for (int i = 0; i < 10; i++)
            {
                dizi[i] = rnd.Next(100);
            }

            sirala(dizi);

            foreach (int item in dizi)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }
}



örnek: main fonksiyonuyla kullanıcıdan alınan sayının metotlar yardımıyla asal ve mukemmel sayı olup olmadığını
kontrol eden program;

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

namespace sayilar
{
  class Program
    {
      private static void asalsayi(int a)
      {
          bool durum = true;
          int kalan;

          for (int i = 2; i < a; i++)
          {
              kalan = a % i;

              if (kalan == 0)

                  durum = false;
              break;
         }

          if (durum == true)
              Console.WriteLine("sayi asal");
          else
              Console.WriteLine("sayi asal degil");
      }

      private static void mukkemmel(int a)
      {
          int [] dizi = new int [a];
          int s=0;
          int toplam = 0;
          for (int i = 2; i < a; i++)
          {
              if (a % i == 0)
              {

                  dizi[s++] = i;
              }
          }
             
              for (int j = 0; j <= s; j++)
              {

                  toplam = dizi[j] + toplam;
              }

              toplam = toplam + 1;
         

              if(toplam== a)
              Console.WriteLine(a + " mukemmel sayi");

              else
              Console.WriteLine(a+ " mukemmel degil.");
         
     
      }
        public static void Main(string [] Args)
            {
                int sayi;

                Console.WriteLine("sayiyi giriniz: ");
                sayi = Convert.ToInt32(Console.ReadLine());
                asalsayi(sayi);
                mukkemmel(sayi);

                Console.ReadLine();
        }
    }
}









Diziler (C#)


Diziler belirle sayıda veriyi içinde barından değişken listesidir.
dizi içersindeki verilerin indexi(sıra konumu) 0 dan başlar. yani ilk sıradaki dizinin indexi 0 dır. int türünden deneme adında 10 eleman içeren bir dizi
tanımlamamız gerekirse, int [] deneme = new int[10] şeklinde tanımlamalıyız.

Dizi kullanımda 2 önemli özellik vardır bunlar;
 1. Dizi elemanları bellekte ardışıl  olarak bulunurlar
 2. Dizi elemanları aynı türden nesnelerdir.

dizi tanımlanması aşağıda ki gibi olur.

int [] sayilar = new int[10];

boyutu 10 olan int türünden bir dizi tanımlamış olduk.
dizi elemanlarına dizi[index]= değer; şeklinde değer verebiliriz.

Dizi elemanlarına index operatörüyle [] ulaşılabilir.

int sayilar[0]= 10;
int sayilar[1]= 20;  sayilar adlı dizinin 0. indexte bulunan elemanı 10, 1.indexte bulunan elamanı 20dir.



örnek 1: klavyeden 5tane değer girilen 5 değeri diziye atan ve bu dizideki değerlerin ortalamasını alan program.

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

namespace diziler
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] dizi = new int[5];
            int ortalama = 0, toplam=0;
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("{0}. elemani giriniz: ", i+1);
                dizi[i]= Convert.ToInt32(Console.ReadLine());
                toplam = dizi[i] + toplam;
            }

            ortalama = toplam / 5;
            Console.WriteLine(ortalama);
            Console.ReadLine();
        }
    }
}

örnek 2: 10elamanlı bir sayı dizisinin en küçük elemanını bulan program.

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

namespace diziler
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] dizi = new int[10];
           
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("{0}. elemanı giriniz: ", i+1);
                dizi[i] = Convert.ToInt32(Console.ReadLine());
                Console.Clear();              
            }

            int min = dizi[0];
           

            for (int j = 1; j < 10; j++)
            {
                if (dizi[j] < min)
                {
                    min = dizi[j];
                }
            }
            Console.WriteLine("en kucuk elemani: {0}",min);
            Console.ReadLine();
        }
    }
}


örnek 3: 10 elemanlı bir sayı dizisine 1-10arası puan girilen ve hangi puandan kaç adet bulunduğunu gösteren program.

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

namespace puantut
{
    class Program
    {
        static void Main(string[] args)
        {
            int i;
            int[] dizi = new int[10];
            int[] Puansayisinitut = new int[11];

            for (i = 0; i <= 10; i++)
            {
                Puansayisinitut[i] = 0;
            }
                for (i = 0; i < 10; i++)
                {
                    Console.WriteLine(i + 1 + ". puanı giriniz(0-10 arasi hesaplanacak); ");
                    dizi[i] = Convert.ToInt32(Console.ReadLine());

                    Puansayisinitut[dizi[i]]++;
                    Console.Clear();
                }

                for (i = 0; i <= 10; i++)
                {
                    Console.WriteLine(i + "'den" + Puansayisinitut[i] + "adet var");
                   
                }
                Console.ReadLine();
            }
        }
    }


Örnek 4; 10 elamanlı bir sayı dizisinin elamanlarını büyükten küçüğe sıralayan program.

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

namespace diziler
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] dizi = new int[10];
           
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("{0}. elemanı giriniz: ", i+1);
                dizi[i] = Convert.ToInt32(Console.ReadLine());
                Console.Clear();
               
            }

            int ara;
            for (int s = 0; s < 10; s++)
            {
                for (int k = s+1; k < 10; k++)
                {
                    if (dizi[s] < dizi[k])
                    {
                        ara = dizi[s];
                        dizi[s] = dizi[k];
                        dizi[k] = ara;
                    }
                }
            }
                int[] siralanmis = dizi;

                foreach (int item in siralanmis)
                {
                    Console.Write(item + "--");
                }

                Console.ReadLine();
            }
        }
    }