7 Aralık 2012 Cuma

KDV PROGRAMI VE ÖZEL ÖĞRENCİ İNDİRİMİ

 
 
KDV  PROGRAMI VE ÖZEL ÖĞRENCİ İNDİRİMİ
 
 
FORM1 DESİGN

 
 
 
 
FORM1 CS

1 Aralık 2012 Cumartesi

C# ile LCD Simulatörü


LCD’ler elektronikte karakterlerin gösterilmesinde kullanılırlar.LCD’lerin üstünde ekran kartları gibi ekrana yazılan bilgilerin sürekli görünebilmeleri için tarama işlemini yapan entegrelerle birlikte üretilip satılırlar.Bu entegreler ekranın her yanını tarayarak kendini sürekli günceller.Neyse bu kadar elektronik bize yeter.Elektronik demişken yapacağımız uygulamanın lcd’ye bağlayıpta yapacağımız birebir uygulama değil(ama onuda yapacam.ilk önce 20$ bulup bir lcd aldıktan sonra:)).Lcd’yi bir anlamda simule edeceğiz.LCD’lerin yapısını tam anlamak için bir kareli defteri düşünün.Bu defter içindeki kareler LCD içindeki her noktayı yani bir led’i (noktayı)temsil etsin.Karakterlerde bellirli bir binary dağılım göstererek ledleri yakar ve ortaya insanların anlayabileceği bir şekil gelirki bunlar karakter olarak isimlendirilir.
Programın Amacı: Yapacağımız programla textboxtan girilen bir yazı sanki bir Lcd üzerindeymiş gibi bitlerine ayrışacak ve biz insanlara anlaşır bir karakter sunacak.Gireceğimiz string veri haliyle karakterlere ayrılacak ve ayrılan her karakter binary olarak sanal Lcd’mize yayılacak ve bize güzel bir sonuç ile dönecek.
ALGORİTMA:
Ve programıza başlıyoruz.LCD’ye yaz butonuna basınca yaz() isimli master metotu çağırıyoruz. Butonlara ne kadar az kod yazarsak o kadar iyi olacağı inancındayım. yaz() metotuna gelirsek burda şöyle bir yapı söz konusu: Karakter dizisine ayrılan string verimizin her karakteri kodlama için harfyaz() metotuna gider. Kodları incelersek bu rahatlıkla gözükecektir. Birde gonder isimli değişken var. Bu "gonder"in anlamı ise aşadaki şekille pekiştirilmeye çalışılmıştır.

public void yaz()
{
int gonder=0;
int i,j;
char[]gelen=textBox1.Text.ToUpper().ToCharArray();
for(i=0,j=0;i<gelen.Length && j<gelen.Length;i++,j++)
{
harfyaz(gonder,gelen[j]);
gonder+=8;
}
}

yaz() metodunun istediği harfyaz metodunda ise temel mantık yaz() metotundan gelen karakter dizisinin elemanlarını alarak harfsec isimli metota yollar. Harfsec ise; genel bildirim yaptıdığımız A isimli iki boyutlu karakterlerimizin binary formatının tutulacağı matrisi harfe göre doldurmaktır. Harfyaz metotu gelen A matrisindeki verileri 8’li gruplar halinde kaydırarak ekransatir[8,80]isimli LCD ekran kabul ettiğimiz matrisin bulunduğu satir ve sutuna göre ledleri yakar. Ledler yandığı zaman led1.image, söndüğünde ise led0.image gözükecektir.Aşadaki yapıyı dikkatle incelerseniz neler olup bittiğini daha iyi anlayacaksınız.

public void harfyaz(int a,char c)
{
int x=a;
harfsec(c);
for(int i=0;i<8;i++)
{
x=a;
for(int j=0;j<8;j++)
{
if(A[i,j]==1)
{
ekransatir[i,x].Image=led1.Image;

}
else if(A[i,j]==0)
{
ekransatir[i,x].Image=led0.Image;

}
x++;
}
}
matristemizle();//A matrisinin tüm elemanlarını sıfırlayan metotdur.
}

harfsec() metotuna kısaca değinirsek:Gelen karaktere göre A matrisini 1 ve 0 ile doldurur. Geriye dönüş değeri yoktur ve olmamasıda çok doğaldır. Bu metotta bütün karakterler binary olarak kodlandığı için sadece birini inceleyim...

int[,]A;
public void harfsec(char karakter)
{
switch(karakter)
{
case ’ ’:
A=new int[8,8];
break;
case ’A’:
A=new int[8,8]{{0,0,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0}};
break;

NOT: Rakamlar ve bazı özel karakterleri ben koymadım.isterseniz koyabilirsiniz.Sadece temel alfabe ve ünlem işaretleri var.
Evet nerde kaldık. Birde sağa sola kaydırma işlemleri var. Bu işlemleri kontrol altında tutmak için timer controlüne koymak daha anlamlı. Örnek olarak sola kaydırma işlemini ele alalım.Bu işlemle iki döngü ile tüm sanal Lcd ekranını tarayarak sola doğru bir öteleme yapıyoruz. ekransatir[i,j].Image=ekransatir[i,j+1].Image; bu kadar basit.....

private void timer1_Tick(object sender, System.EventArgs e)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<79;j++)
{
ekransatir[i,j].Image=ekransatir[i,j+1].Image;
}
}
}

Son olarak formun load event’ ına bakmakta yarar var. Burada ekransatir isimli sanal Lcd panel belirtiliyor ve dizi olarak formun kontollerine ekleniyor ve düzenli artışla formda gösteriliyor. Birde programda her defasında textbox’ tan veri yollamadan önce Lcd temizle butonu ile matrisleri boşaltmamız gerekir.

PictureBox[,]ekransatir;
private void Form1_Load(object sender, System.EventArgs e)
{
ekransatir=new PictureBox[8,80];
int xpos=0;
int ypos=20;
int width=8;
int height=8;
for(int i=0;i<8;i++)
{
for(int j=0;j<80;j++)
{
ekransatir[i,j]=new PictureBox();
this.Controls.Add(ekransatir[i,j]);
ekransatir[i,j].Image=led0.Image;
ekransatir[i,j].SetBounds(xpos,ypos,width,height);
ekransatir[i,j].Show();
xpos+=8;
}
xpos=0;
ypos+=8;
}
}


c# da Rastgele Kod Üretimi


Bu uygulama birçok, yerde işimize yarayabilecek bir “Rastgele Kod Üretici” dir. Rastgele üretilmiş bir koda birçok yerde ihtiyaç duyabiliriz. Örneğin; web sitenizin üye kayıtlarında üye adaylarının gerçek email adreslerini girmelerini garantilemek isteyebilirsiniz. Bunu sağlamanın en basit yolu, kişinin verdiği email adresine rastgele ürettiğinz bir kodu göndermektir. Böylece üye adayından, üyelik işlemlerinin tamamlanarak hesabın aktive olabilmesi için, email adresine gönderdiğiniz aktivasyon kodunu “üyelik aktivasyon” sayfanızda girmesini isteyebilirsiniz. Eğer email adresi doğru değilse aktivasyon kodunu edinemeyeceğinde üyeliği de geçerli olmaz.
Rastgele kod üretebilmek için kullanacağımız en önemli sınıf “System” isim alanı (namespace) içerisinde bulunan “Random” sınıfıdır (class). Bu sınıfı kullanarak kod içerisinde görünmesini istediğimiz karakterler dizisinin boyutu kadar rastgele tamsayı üreteceğiz.
Kullanacağımız diğer bir sınıf ise System.Text isim alanı içerisinde bulunan StringBuilder sınıfıdır. Yapacağımız işlem bir metin birleştirme döngüsü içermekte ve metin birleştirme işlemlerinde StringBuilder sınıfı, string tipine oranla daha fazla performans sağlamaktadır.
Uygulamayı bir fonksiyon olarak hazırlayacağız.
Fonksiyon üreteceği “rastgele kod” un kaç karakter uzunlukta olması istendiğini “codeLength” parametresiyle alacak. Ürettiği “codeLength” kadar karakter uzunluğundaki “Rastgele Kod”u da string veri tipinde, fonksiyonun çağırıldığı yere döndürecek.
private string GenerateCode(int codeLength)
{
}
Fonksiyonda ilk olarak “sb” değişken adıyla, “rastgele kod”u yapılandıracağımız StringBuilder nesnesini ve ikinci olarak da “objRandom” adıyla, rastgele sayı üretecek olan Random nesnesini yapılandıracağız.
System.Text.StringBuilder sb=new System.Text.StringBuilder();
System.Random objRandom=new System.Random();
Sıra “Rastgele Kod”umuz içinde yer almasını istediğimiz karakterleri bir metin dizisi olarak tanılamaya geldi. Ben bu örnekte “A-Z”, “a-z” ve “0-9” arası karakterleri kullandım. Siz isterseniz uygulamayı zenginleştirmek için farklı karakterler de kullanabilirsiniz.
string[] strChars = { “A", "B", "C", ...
"1", "2", "3", ...
“a", "b", "c", ... };
Şimdi işlemlere başlayabiliriz. Önce rastgele üreteceğimiz sayı aralığını bulalım. Yukarıdaki karakterler “strChars” adında bir metin dizisinde tutulmaktalar. Diziler 0 indeksle başladıklarından rastgele üretilecek olan minimum rakam 0 olmalıdır. Üretilecek maksimum rakam ise dizinin en son elemanının indeksi olmalıdır. Dizinin en büyük indeksli elemanının indeks bilgisini
int maxRand=strChars.GetUpperBound(0);
koduyla aynı anda hem bu değeri tutacak olan “maxRand” adında bir değişken tanımlayarak dizinin “GetUpperBound(0)” metoduyla alırız.
“Rastgele Kod”un üretilmesi, istenilen kod uzunluğu için her bir basamağın rastgele oluşturulmasıyla sağlanır. Bunun için, 0 ile “Rastgele Kod” için kullanılacak karakter dizisinin en büyük indeksi arasında rastgele bir sayı objRandom.Next(maxRand) metoduyla üretilir ve bu değer “rndNumber” değişkenine atanır.
int rndNumber=objRandom.Next(maxRand);
Karakter dizisindeki rastgele bir eleman, edinilen “rndNumber” sayısını indeks olarak kullanarak “strChars(rndNumber)” ifadesiyle elde edilir ve bu karakter sb.Append metoduyla “sb” nesnesine eklenir.
sb.Append(strChars[rndNumber]);
Eğer 10 karakter uzunluğunda bir “rastgele kod” istenirse, önce birinci basamak için rastgele bir karakter üretilir, daha sonra ikinci basamak için ve bu böylece 10’a kadar devam eder. Bu üretilen karakterler “sb” değişkeni içerisinde ard arda eklenir.
for(int i=0;i<codeLength;i++)
{
int rndNumber=objRandom.Next(maxRand);
sb.Append(strChars[rndNumber]);
}
En son olarak da StringBuilder nesnesinin içerinde yapılandırılmış olan ve rastgele karakterlerden meydana gelen sonuç, string veri tipine sb.ToString() metoduyla dönüştürülerek fonksiyon sonlandırılır ve değer fonksiyonun çağırıldığı yere döndürülür.
return sb.ToString();
Kodun tamamlanmış şekli aşağıdaki gibidir.
private string GenerateCode(int codeLength)
{
System.Text.StringBuilder sb=new System.Text.StringBuilder();
System.Random objRandom=new System.Random();
string[] strChars = { "A","B","C","D","E","F","G","H","I",
"J","K","L","M","N","O","P","Q","R",
"S","T","U","V","W","X","Y","Z",
"1","2","3","4","5","6","7","8","9","0",
"a","b","c","d","e","f","g","h","i","j","k",
"l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
int maxRand=strChars.GetUpperBound(0);
for(int i=0;i<codeLength;i++)
{
int rndNumber=objRandom.Next(maxRand);
sb.Append(strChars[rndNumber]);
}
return sb.ToString();
}


30 Kasım 2012 Cuma

C# Giriş Ders 1

Temel C# Konuları 1.(TextBox,Label ve Buton Kullanımı)
Merhaba arkadaşlar.Bu ilk konumuz olacak.Bir süre C# ile ilgili araçların kullanımdan bahsetmeye çalışacağım.Daha sonra C# ta yararlı ve öğretici uygulamalar yapacağız.Bugünkü konumuz TextBox ve buton kullanımı.

Textbox ve Buton C#'ın vazgeçilmez iki bileşenidir. Genelde Texbox içerisindeki veriyi butonla kontrol ederiz.Bunu örneklerle daha iyi anlayacaksınız.
Öncelikle visual studio açalım.Sırasıyla File-New-Project tıklayalım.

Daha sonra gelen ekranda Sol sekmede C# altında Windows'u seçelim ve sağ tarafta Windows Form Application'ı seçelim.

Burada Projemize bir isim verip nereye kaydedeceğimiz seçip OK tuşuna basalım.Şuan bulunduğumuz form projemizi şekillendireceğimiz yerdir.Bu form üzerine elemanlarımızı ToolBox üzerinden yerleştiririz.


Kullanacağımız bütün elemanlar ToolBox içindedir.Herhangi bir elemanı sürükleyerek yada çift tıklayarak formumuza ekleyebiliriz.Bu örneğimizde bir adet Textbox,bir adet Button ve bir adet Label kullanacağız.Bunları sayfamıza ekleyelim.Aşağıdaki gibi bir görünüm elde edeceğiz.


Şimdi yapmak istediğimizi anlatayım.Çok basit bir uygulama yapacağız.TextBox ' a girilen içeriği buttona basıldığı anda label'a yazacağız.Bunu yapmak için button1'e çift tıklayıp click özelliğine giriyoruz.Click'in anlamı butona basıldığı zaman içerisindeki kodları çalıştır olarak düşünebilirsiniz.Bunu ilerleyen derslerde daha detaylı bir şekilde yapacağız.Çift tıklayıp butonun içerisine girdik.Aşağıdaki gibi bir görüntü elde edeceğiz.


Bu ekran bizim kod kısmımız.Diğer taraf Desing kısmımızdı istediğimiz anda diğer tarafa geçebiliriz.Burada button1_Click'e ait iki tane süslü parantez var.Butona tıklanınca çalıştırmak istediğimiz kodları buraya yazacağız.Aşağıda yazdığım kodları oraya ekleyin.Buarada buarada yazdığım kodları kopyala yapıştır yoluyla almazsanız sizin açınızdan daha iyi olur kod yazmada alışkanlık kazanmış olursunuz.


label1.Text = textBox1.Text;

bu kodu ekledik ve yukarıdaki yeşil play düğmesinden programımızı çalıştırıyoruz.TextBox'a herhangi birşey yazın ve buton'a basın.TextBox'a yazmış olduğunuz yazının label1'e yazıldığını göreceksiniz.

Programı kısaca anlatmaya çalışacağım.TextBoxlar ve Label'lar her zaman string ifade tutar.Sayısal rakamlarda tutarlar ancak yinede içerisinde gösterebilmemiz için string'e çevirmemiz gerekir.Mesela bu örnekte TextBox'ın textine yazığımız ifayi label'ın textinde gördük.Yani text dediğimiz şey aslında görünen kısımdır.Yani bir elemanın içerisinde ne görmek istiyorsak onun text özelliğine yazarız.

Burada Butona basdığımız anda(Click Olayı) Textbox'ın içindeki veriyi alıp Label'ın Text'ine atıyor.Yani görünen kısmına atıyor.

C# Basit Kdv Programı

Merhaba arkadaşlar.Bugün C#'ta combobox,textbox,label ve button kullanarak basit bir fiyat hesaplayıcı programı yapacağız.Öncelikle aşağıdaki formu hazırlayalım.

Yapmak istediğimiz şey butona bastığımızda girilen fiyatı adet ve kdv oranıyla çarpıp ödenecek tutar kısmına sonucu yazması.Butona bastığımızda işlem yapılacağı için butonun click olayına kodları yazmamız gerekiyor ama kdv oranlarının form açıldığı anda combobox'a yüklenmesini sağlamak için form'un load kısmına da bi kaç kod yazmamız gerekiyor.Form'da herhangi bir boş yere çift tıklayıp form'un load kısmına gelip aşağıdaki kodları yazalım.

private void Form1_Load(object sender, EventArgs e)
{
comboBox1.Items.Add("8");
comboBox1.Items.Add("18");
comboBox1.Items.Add("25");
}



Bu kodu eklediğimizde form açıldığı anda combobox'ın içerisini belirlediğimiz kdv oranlarıyla doldurmuş oluyoruz.Bu işlemi manual olarakta yapabiliriz.Combobox seçiliyken properties pencerisinde items özelliğine tıklayarak oraya direkt kdv oranlarını ekleyebiliriz.Bunları yaptıktan sonra artık asıl işi yapacak kodumuzu butonun içerisine yazıyoruz.


private void button1_Click(object sender, EventArgs e)
{
textBox3.Text = Convert.ToString((Convert.ToDouble(textBox1.Text) + ((Convert.ToDouble(textBox1.Text) * Convert.ToInt32(comboBox1.SelectedItem)) / 100)) * Convert.ToInt32(textBox2.Text));
}



Bu kodu yazdığımızda olan olay şu:

Textboxlar string tipinde değer tutarlar.Bu yüzden textboxların içerisine direkt olarak sayısal değer atayamayız yani double,int gibi.Öncelikle textbox'ın içindekini convert etmemiz gerekir.Eğer ondalıklı bir sayı tutacaksak convert.todouble ifadesini kullanırız.Eğer ondalıklı olmayan bir sayı tutacaksak convert.toint32 işimizi görür.

Dikkat ederseniz textboxlarımızı comboboxları hep convert ederek işlem yaptık.Çünkü öbür türlü işlem sonucu alamayız sadece string olarak toplamış olursunuz.Buda bizim işimize şuan yaramaz.

Combobox içerisindeki değeri combobox.text olarakta alabiliriz.Ama ileride bu yöntem bize lazım olacağı için combobox1.selecteditem olarak aldık.

En sonda bütün işlemlerin sonucunu textbox'a yazmak için convert.tostring özelliğini kullanmamız gerekiyor çünkü Textbox sadece string değer alıyordu hatırlarsanız.Biz bütün işlemleri sayısal olarak yaptıktan sonra string'e çevirip atmamız gerekiyor.Textbox3.text bizim sonucumuzun görünecek kısmı.

Yaptığımız işlem ise şu
( girilenpara+ ( ( girilenpara * kdvoranı) / 100 ) ) * adet sonucu git Textbox3.text'e yaz.

girilenpara=Texbox1.text
kdvoranı=Combobox1.selecteditem veya Combobox1.text
adet=Textbox2.text



Girilen tüm bilgileri convert ederek işlem yaptık ve sonucunu bir textbox'a yazdırdık.
Eğer aklınıza takılan bir yer varsa lütfen sorun iyi akşamlar.


c# İçin For Döngüsü

C# For Döngüsü
C#'ta döngü kullanımları bir çok işimizi kolay hale getirir.Bir döngü kurarak normalde yazmamız gereken bir çok satırı, kurduğumuz döngü sayesinde bir kaç satırla yazabiliriz.Ayrıca döngülerle kontrol işlemleri de yapabiliriz.Yani anlayacağınız döngüler tüm programlama dillerinin vazgeçilmez bir parçasıdır.Bugün döngü tiplerinden For döngüsünü anlatmaya çalışacağım.

For döngüsü en çok kullanılan döngü tiplerinden biridir.



1)

int sayac=0;
for( int i=0 ; i<=10 ; i++ )
{
sayac++;
}

Burada for döngüsü içinde 1.blokta "i" değişkeni tanımlanmıştır.Başlangıç değeri olarak 0 atanmıştır.Yani i değişkeni 0 dan başlayacaktır.2. blokta for döngüsünün koşulu belirlenmiştir.Yani i değişkeni 10 dan küçük olduğu sürece bu döngünün devam edeceği belirtilmiştir. 3. blokta ise i değişkenin artış miktarı belirtilmiştir.Yani döngü her bir dönüşünde i değerinin 1 artacağını belirtmiş oluyoruz.

Döngü ilk çalıştığında i değişkenine 0 atıyor.Daha sonra gelip 10 dan küçük olup olmadığına bakıyor.10 dan küçük olduğu için sayac değişkenini 1 arttırıyor.sayac değişkenini arttırdıktan sonra for döngüsünün 3 bloğuna geliyor döngü ve i değişkenini yine 1 arttırıyor.Sonra 2 bloğa gelip yine 10 dan küçük olup olmadığını kontrol ediyor.Bu şekilde döngü i değişkeni 10 olana kadar bu işlemler her defasında tekrar tekrar gerçekleşiyor.Bu işlem her tekrar ettiğinde sayac değişkeni 1 arttıyor ve son olarak 10 oluyor ve döngü bitiyor.For döngüsü devam ettiği sürece süslü paratezler arasındaki bütün işlemleri teker teker gerçekleştirir.

2)

int sayac=0;
for (int i = 0; i < 10; i++)
{

for (int j = 0; j < 10; j++)
{
sayac++;
}
}
textBox1.Text = ikinci.ToString();


Bu kısımda iç içe for döngüleri kullanılmıştır.İlk döngü bir kere çalıştıktan sonra alttaki döngüye geçer ve bu döngünün koşulunu sağlayana kadar döngü devam eder.Alttaki döngünün koşulu tamamlandıktan sonra ilk döngüye geri döner.Eğer koşul hala sağlanmamışsa alttaki döngü tekrar çalışır.Bu şekilde döngüler koşullar sağlanana kadar devam eder.Yaptığımız bu örnekte bu kod satırları tam 100 defa çalışır.Gördüğünüz gibi bir kaç satırda 100 defalık bir işlem yapmış olduk.Döngüden çıktıktan sonra sayac değişkeninin değeri Textbox'a 100 olarak basılır.Birden fazla döngüyü iç içe alabiliriz.Bu bizim yapacağımız yazılma göre şekillenir.

Bundan sonraki konum yine döngüler olacak.For ve diğer döngüler ile ilgili örnekler ve açıklamalar yapmaya devam edeceğim.

c# Dilinde Özellikler

Evet ilk makalemizle karşınızdayız ;

Nesne yönelimli programlamanın günümüzde ne kadar yaygın olduğunu programlama ile ilgilenen herkes bilmektedir. Nesne Yönelimli Programlama (NYP) yaklaşımında temel olan prensiplerden birisi bilgi gizleme (information hiding)'dir. Bu prensibi projelerimizde uygulamak için C#'in sunduğu en önemli araçlardan biri olan sınıf özellikleri (class properties) konusunu inceleyeceğiz.
Bildiğiniz gibi, C# dilinde tasarlanmış bir sınıfta iki temel unsur bulunur. Birincisi sınıfın özellikleri (fields), ikinicisi ise sınıfın metodlari (methods)'dır. Herhangi bir sınıfın özellikeri sınıfta tutulan ilişikili verilerlerdir. Diğer taraftan sınıfın bizim için değişik işleri yapmasını metodları vasıtasıyla sağlarız. Sınıf tasarımı çok önemli bir iş olup; deneyim, konsantrasyon ve dikkat ister. Sınıfımızın özelliklerini tutan veriler, program akışı sırasında sınıf dışında değiştirilebilir veya bu değerlere ulaşmak istenebilir.
Bu durumda akla ilk gelen çözüm sınıfın verilerinin hepsinin dışarıdan ulaşilabilmesini ve değiştirilebilmesine olanak sağlayan public anahtari ile tanımlamakdir. Aşağıdaki programda bu tür bir çözümün uygun olabileceği düşünülmüştür:

using System;
namespace Property_Makale
{
class Otomobil
{
public int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;

this.marka=marka;
this.renk=renk;
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
oto1.model=300;
oto1.OzellikleriGoster();
}
}
}

Yukarıdaki kod örneğimizde iki tane sınıf bulunmaktadır. Otomobil sınıfı ile otomobil nesnelerimizi oluşturabiliriz. Ayrıca bu sınıfın OzellikleriGoster() metodu ile herhangi bir otomobil nesnemizin özelliklerini görmek için ekrarana yazdırıyoruz. İkinci sınıfımızda (OtomobilTest) ise Otomobil sınıfımızdan nesneler oluşturmak ve onların özellikerini çağırmak için kullanacağız. Şimdi isterseniz Main() fonksiyonunu incelemeye başlayalım. Metodun hemen ilk başında oto1 isimli nesnemizi oluşturuyoruz. oto1 nesnemizin özellikleri 2000 model, siyah ve BMW olsun. Bir sonraki satırda oto1 nesnemizin modelini 300 yapıyoruz. İşte burda büyük bir hata yapılıyor! Çünkü 300 yılında henüz otomobil üretilmemişti. Böyle bir hatayı nasıl önleriz? Çözüm olarak otomobil nesnemizin herhangi bir özelliğini değiştirmek için ayrı bir metod yazmamız gerekir. O zaman programızı şu şekilde değiştirmemiz gerekiyor:

using System;
namespace Property_Makale
{
class Otomobil
{
private int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;

this.marka=marka;
this.renk=renk;
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
public void ModelDegistir(int yeniModel)
{
if( (yeniModel>DateTime.Now.Year)||(yeniModel<1900) )
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! ");
else this.model=yeniModel;
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
oto1.ModelDegistir(300);
oto1.OzellikleriGoster();
}
}
}

Yukarıdaki programda Otomobil sınıfına ModelDegistir(int yeniModel) metodunu ekledik. Bu metod ile modeli değiştirilecek nesnenin modelinin şu anda bulunulan yıldan sonra ve 1900'den önce yapılmak istendiğinde hata mesajı veriyor ve modelini değiştirmiyor. Ayrıca sınıf içindeki model değişkenin tanımlanmasında private anahtarını da kullandığımıza dikkat ediniz. Bu şekildeki bir yaklaşım ile hem sınıfın iç işleyişini sınıf dışından saklamış oluyoruz hem de sınıfa ait verilerin değiştirilmesini sırasındaki hataları en az seviyede tutmayı sağlıyoruz.
Fakat yukarıdaki yöntemi genelde C++ programcıları kullanır(dı). Bizler C# programcıları olarak daha gelişmiş bir yola sahibiz. Sınıf içindeki değerleri değiştirmek ve ulaşmak için özellik (Property) aracını kullanırız. Aşağıdaki program ise C#'ın özellikleri nasıl kullandığına bir örnektir:

using System;
namespace Property_Makale
{
class Otomobil
{
private int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;

this.marka=marka;
this.renk=renk;
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
public int Model
{
get
{
return model ;
}
set
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto = new Otomobil(2000, "BMW" , "Siyah");
Console.WriteLine("Otomobilimizin modeli: "+ oto.Model);
oto.Model=300;
oto.OzellikleriGoster();
}
}
}

Çıktısını gördüğünüz program kodunda C#'ın özellik tanımlama ve kullanma yöntemini kullandık. Özellikler ile herhangi bir nesneye ait değişkenin değerini öğrenebilir ve değiştirebiliriz. Yukarıdaki örnek kodda yeralan aşağıdaki kısımda bir özellik(Property) tanımlıyoruz. Genellikle bir özelliğin ismi üzerinde iş yaptığı değişkenin ismi ile aynı olup sadece ilk harfi büyük olur. Aslında bu bir zorunluluk değil. Sadece C#'da bu bir gelenektir. Bu şekilde bir kullanım bizim kodumuzu okuyanların kodu daha kolay anlaması ve bizim başkalarının kodlarını daha kolay anlamamıza yardımcı olur. Bir özelliğin tanımında özellik isminden önce ne tür bir değer dönderecekse onun tipini belirtmeliyiz. Bu genelde özelliğin ilgili olduğu değişkenin tipidir

public int Model
{
get
{
return model ;
}
set
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}

Özellikler içinde get ve set olmak üzere iki ayrı blok kod olur. İstersek sadece get veya sadece set blokları olan özellikler de yazabiliriz. get bloğunda ilgili değişkenimizin değerini dışarıya döndeririz. set bloğunda ise değişkenimizin değerini değiştiririz. Burda gereken kontrolleri yapıp daha sonra uygunsa girilen değeri kabul edebiliriz. Eminimki get bloğu içinde dikkattinizi değişkeni ismi yerine value şeklinde çağırmamız çekmiştir. Bu sayede kod içinde karışıklık olmaz. Zaten sadece bir tane değişken üzerinde çalışıyorsunuz.
Bu makalemizde C# dilinde yeralan özellik (Property) kavramını inceledik.Bir sonraki makalemizde görüşmek üzere.