Eylül ayı blog kayıtları
C# Biliyorum - 3

            Visual Basic kodlamadan C# kodlamaya geçtiğimiz makalelerden üçüncüsü olan bu makalemizde, C# içerisindeki for, while ve do while yapılarına değiniyor olacağız. Visual Basic içerisinde sıkça kullandığımız, özellikle for, while ve do while yapıları C# içerisinde VB?e göre biraz farklı kodlanıyor. Öncelikle for dediğimiz yapıyı biraz hatırlayalım. En eski dostlarımızdan olan for her yazılım dilinde olduğu gibi C# içerisinde de bize yardım için hazır beklemekte.

 

For :

 

            Kısa bir tanım yapmak istersek for yapısı için söylenecek en güzel cümle sanırım, belirtilen bir başlangıç rakamından, bitiş rakamına kadar belirteceğimiz kodları tekrar tekrar çalıştıran kod parçacığıdır (döngü yapısıdır).

            Öncelikle for yapısının C# içerisinde ki şemasını inceleyelim.

 

 

Yukarıda ki kodları biraz açıklayalım. En başta integer türünden bir değişken tanıtılıyor. For içerisinde kırmızı ile işaretlenen alan bizim döngümüzün saymaya başlayacağı değerdir. Değişkenimize ilk değerini başka bir deyişle başlangıç değerini veriyoruz. Döngümüz 0(sıfır) dan başlasın. İkinci bölüm, mavi ile işaretlenen alan ise döngümüzün kaç kere döneceğini belirten bölümdür. Yani sayımız 0 (sıfır) dan başlasın, 10 oluncaya kadar dönsün.

 

Not: Küçüktür 10 dediğimiz için döngümüzdeki değişken olan sayim, 10 değeri için dönmeyecektir.

 

Üçüncü bölüm ise döngümüzün başlangıç ve bitiş değerleri arasında kaçar kaçar artacağı veya azalacağını belirler. Böylece yukarıda ki for döngüsü için şöyle bir tanım yapabiliriz. Sayim isimli değişkenimiz 0(sıfır) dan başlasın, 10 a kadar birer birer dönsün.Döngümüz 0 (sıfır) dahil olmak üzere :

 

0          1          2          3          4          5          6          7          8          9

 

rakamları için dönecek, 10 için dönmeyecektir. Şimdi gelelim for yapısının VB ile C# kodlamalarına. İlk önce VB içerisinde 0(sıfır) ile 10 arasındaki 2 ile tam bölünebilen sayıları bulan ufak bir program yazalım:

 

 

VB içerisinde geliştirdiğimiz bu program parçası kullanıcıya, 0 ile 10 dâhil olmak üzere, 0 ile 10 arasındaki 2 ile tam bölünebilen sayıları MessageBox ile bildirecektir. Şimdi gelelim bu program parçacığının C# taki karşılığına:

 

 

Gördüğümüz gibi VB içerisinde kullandığımız for ile C# içerisinde ki for yapısının tek farkı syntax. VB içerisinde:

 

            For değişken = başlangıç_değeri To bitiş_değeri

 

            Next

 

şeklinde bit tanımlama yapılırken. C# içerisinde:

 

            for (değişken = başlangıç_değeri; değişken <= bitiş_değeri; değişken artma veya azalma komutu)

 

            Şimdi gelelim şu step dediğimiz kavrama. Eğer biz döngümüzün birer birer artmasını değilde ikişer ikişer artmasını istiyorsak ne yapacağız. VB içerisinde:

 

 

C# içerisinde ise:

 

 

Şeklinde kodlanacaktır. Yani VB içerisinde step anahtar kelimesinden sonra verdiğimiz arttırma parametresi C# içerisinde for yapısının üçüncü bloğunda yer alıyor. Eğer 5?er 5?er arttırma yapmak istiyorsak += operatöründen sonraki 2 rakamı ile 5 rakamını değiştirmemiz yeterli olacaktır.

            Artan değil de azalan bir for kurmak istiyorsak, sayim++ şeklinde yazdığımız üçüncü blok yerine sayim- - yazmamız gerekmektedir. Yine birer birer değil de 2 şer 2 şer veya 5 er 5 er azaltma yapmak istiyorsak sayim -= 2 veya sayim -=5 yazmamız yeterli olacaktır.

 

            For yapısını anlayabilmek için en uygun kelime olduğu sürecedir. Yani başlangıç değerini verdiğimiz değişkenin değeri ikinci blokta tanımladığımız koşula uygun olduğu sürece döngümüz dönmeye devam edecektir.

 

While

 

            While hemen hemen for ile aynı mantığa sahip bir döngü yapısıdır. While ile for arasında ki tek fark for döngüsünde olduğu gibi iterasyonun (arttırma veya azaltmanın) tanımlama satırında olmamasıdır. Ne demek istediğimize kodlarla açıklık getirelim.

 

            İşe yine şemayı tanımlamakla başlayalım:

 

            While (koşul)

{

            //çalıştırılacak kodlar?

}

 

VB kodlaması:

 

 

C# kodlaması:

 

 

Görüldüğü üzere yukarıda for ile yaptığımız programı while ile yaparsak bu şekilde kod parçacıkları ortaya çıkacaktır. Biraz önce bahsettiğimiz iterasyonu kendimiz yapmalıyız cümlesinin anlamı ise kodlar da açık şekilde görünmekte. VB içerisinde sayim+=1 olarak veya C# içerisinde sayim++; olarak tanımladığımız kod parçası bizim iterasyonumuzu yani arttırma veya azaltma yöntemimizi belirtmektedir. Yukarıdaki kodlar da birer birer arttırma söz konusudur. Aynı for yapısında kullandığımız gibi iterasyonu birer birer yerine ikişer ikişer veya beşer beşer tanımlayabiliriz.

 

While yapısı içinde olduğu sürece mantığı geçerlidir. While anahtar kelimesinden sonra tanımladığımız koşul doğru olduğu sürece döngü dönmeye devam edecektir.

 

 

Do while:

 

            Do while yapısı while gibi çalışır fakat aralarında ufak bir fark vardır. İlk önce do while yapısının şemasını inceleyelim daha sonra farktan bahsedelim.

 

 

            do

{

 

            //çalışacak kodlar?

 

}while(koşul);

 

Do while yapısı aynı while ve for yapısı gibi belirtilen koşul doğru olduğu sürece dönmekle yükümlüdür. Fakat while yapısı ile arasında çok ufak bir fark vardır. O da while döngüleri her dönme işleminden önce (yani kodlarını çalıştırmadan önce) belirtilen koşulun doğruluğunu kontrol eder. Do while yapıları ise ilk önce kendi içerisine yazılan kodları çalıştırır daha sonra koşulu kontrol eder. Dolayısıyla while ile do while arasındaki farkı şu şekilde özetleyebiliriz. While koşul doğru değilse hiçbir şekilde çalışmayacaktır, fakat do while yapısında kodlar kesinlikle en az bir kez çalışacaktır.

 

 

 

 

            Şimdi gelelim bu döngüler içerisin de kullanılan bazı özel anahtar kelimelere.

 

Break:

            Break anahtar kelimesi döngüyü sonlandırmak için kullanılır. Döngü içerisinde herhangi bir satırda break anahtar kelimesi tanımlanmış ise döngü o satırda duracak ve sonlanacaktır.

 

 

            Yukarıdaki kod da gördüğümüz break deyimi sayim isimli değişkenin 5 değerine sahip olma anında çalışacaktır. Dolayısıyla sayim isimli değişkenin değeri 5 olduğun da döngü sonlandırılacaktır. Aşağıda while ve do while yapıları için kod örnekleri listelenmektedir.

 

 

Not: break anahtar kelimesi ile döngüden çıkıldıktan sonra döngü içerisinde ve break anahtar kelimesinin altında yer alan kodlar çalıştırılmaz.

 

While:

 

Do while:

 

            Bir başka anahtar kelime ise continue. Continue anahtar kelimesi break ile hemen hemen aynı mantığa sahiptir. Continue anahtar kelimesi de derleyici tarafından okunduğu anda döngü içerisinde ve continue anahtar kelimesi altındaki kodlar çalıştırılmaz. İşte tek fark bu noktada ortaya çıkmaktadır. Break altında ki kodları çalıştırmadan döngüden çıkarken, continue altındaki kodları bir seferlik çalıştırmadan döngüde tekrar iterasyon yapılmasını sağlayacaktır. Yani continue anahtar kelimesi çalıştığı anda altında bulunan kodları pas geçip döngüyü devam ettirecektir. Örnek olarak sadece ekrana 1 den 10 a kadar sayim isimli değişkenin değerini yazan ufak bir program geliştirelim.

 

 

            Yukarıdaki kod parçacığı çalıştırıldığı takdirde kullanıcıya 1 den başlamak üzere 10 a kadar MessageBox ile mesaj verilecektir. Yani kullanıcıya toplam 10 adet mesaj kutusu gösterilecek. Fakat yukarıdaki kodda yorum satırı olarak işaretlediğimiz bölgeyi aktif hale getirirsek, kullanıcıya 9 adet mesaj kutusu gösterilecektir. Örn:

 

 

            Yukarıdaki örnekte kullanıcının karşısına ?Döngü değeri: 5? gibi bir mesaj kutusu çıkmayacaktır. Sebep ise sayim isimli değişkenin değerinin 5 olması durumunda continue parametresinin verilmiş olmasıdır. Derleyici programı çalıştırırken if satırı doğrulandığı takdirde continue komutunu alacak ve for satırına geri dönecektir. Dolayısıyla sayim isimli değişkenin 5 değeri için MessageBox.Show(); satırı çalıştırılmayacaktır.

 

 

            Böylelikle C# Biliyorum ? 3 makalemizin sonuna geldik. Seri olarak devam edecek makalelerimizden dördüncüsünde metotlara giriş yapıyor olacağız.

            Başka bir makalemizde tekrar görüşmek üzere hepinize iyi çalışmalar.

 

 

 

Bilge Adam Bilgi Teknolojileri Akademisi

Bireysel Yazılım Geliştirme Eğitmeni - Beşiktaş

 


C# ile internet uzerinden dosya indirmek [ File Download in Windows Applications]

C# ile Windows, Mobile uygulamalarinda internet uzerinden dosya indirmek (File Download)


Windows form projeniz de formun üzerinde

URL bilgisi için bir textBox : txtUrl,

indirilen dosyanın nereye yazılacağı hakkında ise bir diğer textbox : txtHedef

olduğunu varsayalım. Aşağıdaki kod parçası internet üzerinden dosya transfer etmenizi sağlayacaktır.

 

Not : Eğer bir proxy server kullanıyorsanız o zaman WebProxy sınıfı aracılığı ile internete çıkış sağlamalısınız.WebProxy kodlarını aşağıdaki linkte bulabilirsiniz :

http://www.boraburgucugil.com/blog.aspx?bId=15

WebRequest req = WebRequest.Create(txtUrl.Text);

HttpWebResponse cevap = (HttpWebResponse)req.GetResponse();

Stream akim = cevap.GetResponseStream();

FileStream yaz = new FileStream(txtHedef.Text + "\\" + Path.GetFileName(txtUrl.Text), FileMode.Create);

BinaryReader okuyucu = new BinaryReader(akim);

BinaryWriter yazici = new BinaryWriter(yaz);

try

{

while (true)

{

yazici.Write(okuyucu.ReadByte());

}

}

catch

{

}

finally

{

yaz.Close();

okuyucu.Close();

yazici.Close();

}

MessageBox.Show("Download Complete");


C# ile Windows, Mobile uygulamalarda proxy üzerinden internete çıkış sağlamak

Eğer projenizin çalıştığı ağ internete bir proxy server aracılığı ile çıkıyorsa sizin programınızın da internet explorer daki ayarları uygulaması gerekir. Örnek

WebProxy wp = new WebProxy(txtSunucu.Text, Convert.ToInt32(txtPort.Text));

wp.Credentials = new System.Net.NetworkCredential(txtKullaniciAdi.Text, txtSifre.Text, txtDomain.Text);

HttpWebRequest.DefaultWebProxy = wp;

kullanıcıdan proxy server bilgisini ve port numarasını almalısınız. Bir de Proxy server üzerinde yetki sahibi bir kullanıcı adı, şifre ve domain ismini programa tanıtmalısınız.

Not : Eğer kullanıcı adında domain bilgisi geçiyor ise

Örn : kullaniciadi@myDomain.com gibi

credential bildirimini aşağıdaki gibi yapmalısınız :

wp.Credentials = new System.Net.NetworkCredential(txtKullaniciAdi.Text, txtSifre.Text);

 


XML Web Services

XML Web Servisleri içerisinde kullanılan WebMethod lara verilen Attribute ler ile ilgili kısa açıklamalar :

BufferResponse : Web Servislerde default olarak true degerine sahip olan bu özellik Web Servis den kullanıcılara gönderilecek olan cevap öncelikle önbelleklensin sonra mı gönderilsin yoksa önbellekleme yapılmadan gönderilsin mi, bunun kararını verir. Gönderilen cevabın önbelleklenmesi mesajın bütününün hazırlanması ve sonra gönderilmesi anlamındadır.

 

CacheDuration : CacheDuration özelliği ASP.NET sitelerinden alışık olduğumuz önbellekleme yani cache işlemi için geçerlidir. Saniye cinsinden bir parametre ister.

[WebMethod(CacheDuration=120)] gibi

Yukarıda ki bildirim de web servis metotu 2 dakika boyunca kullanıcılara aynı cevabı verecektir. Ufak bir açıklama, gelen her parametre degerine göre ayrı bir cache otomatik olarak oluşturulacaktır.

 

Description: Açıklamaya gerek var mı J

 

EnableSession : Default değeri false olan bu özelliğin amacı webmethod içerisinde Session isimli nesnenin kullanılabilmesini sağlamaktır. Fakat bu özellikten faydalanırken Web Servislerinde ki stateless yapıdan dolayı Client uygulama üzerinde CookieContainer kullanılmalıdır. Örnek için bkz :

http://www.yazilimuzmani.com/Articles/Details.aspx?aId=1000000438

 

MessageName : MessageName özelliği ise Webservisler de Metot overloading yapmak istediginizde kullanmak zorunda kalacağınız bir özelliktir. Web Servisler de bir metotu overload ederseniz kurallara uygun olsa dahi, MessageName özelliğinin kullanılması gerektiğine dair bir hata alacaksınız. O yüzden kullanım aşağıdaki gibi olmalıdır.

    [WebMethod(MessageName="HelloWorldSimple")]

    public string HelloWorld() {

        return "Hello World";

    }

 

    [WebMethod(MessageName="HelloWorldAdvanced")]

    public string HelloWorld(string name)

    {

        return "Hello " + name;

    }

 

TransactionOption : Web Servislere Transaction özelliğinin eklenmesi ile birlikte artık COM+ mantığına yakın bir şekilde Transaction yönetimi yapabiliyorsunuz.

[WebMethod(TransactionOption = TransactionOption.RequiresNew)]


C# Biliyorum - 2

         Bu makalemizde C# Biliyorum makaleleri serimizin ikincisinde C# içerisindeki döngülere ve kontrol mekanizmalarına değiniyor olacağız. Öncelikle bir önceki makalemizde ki bilgilerimizin üstüne yeni bir kat çıkacağımızı bu yüzden bir önceki makaledeki bilgileri unutmamamız gerektiğini unutmamanın da pratik ile sağlandığını belirtelim ve makalemize başlayalım.

            Kimimizin VB içerisinde kimimizin ise başka programlama dilleri içerisinde karşılaştırmak için kullandığımız kontrol mekanizmalarından en önemlisi IF yapısıdır. If yapısını en temel ifade ile anlatmaya çalışırsak, bir değeri başka bir değer ile karşılaştırıp aynı ise veya farklı ise  bazı işlemler gerçeklemek için kullandığımız kontrol yapısı diyebiliriz. Yani :

 

 

Yukarıda görülen resimdeki gibi bir program yazdığımızı düşünelim. Kullanıcıdan 1 ile 10 arasında bir rakam talep ediyoruz. Kullanıcının doğru girip girmemesi kendi insafına kalmış.

 

Not: Şimdilik kullanıcının örf ve adetlere uygun bir şekilde sadece rakam gireceğini varsayıyoruz. Karakter girerse ne olacağı makalemizin konusunun dışında kalıyor. Bu konuyu başka bir makalede irdeliyor olacağız.

 

txtTahmin isimli textBox kontrolüne kullanıcı bir rakam girecek. Daha sonra biz kod tarafında oluşturacağımız rastgele (Random) bir sayıyı alttaki txtSonuc isimli TextBox a yazacağız. Eğer iki sayı birbiri ile aynı ise ekrana MessageBox.Show() metodu yardımı ile bir uyarı mesajı vereceğiz.

            Bu karşılaştırmayı VB içerisinde yapmak için aşağıdaki gibi bir kod yazmamız yeterli oluyordu :

 

 

 

 

 

 

 

 

 

 

 

Yukarıdaki kodda eğer txtTahmin.text = txtSonuc.text ise yani tahmin textboxunun değeri sonuc textboxunun değerine eşit ise 5 numaralı satırdaki kod, eğer eşit degil ise 7 numaralı satırdaki kod çalışıyordu. Öncelikle bu kodun C# içerisindeki karşılığını görelim sonra biraz If kontrol mekanizmasını açıklayalım :

 

 

If kontrol mekanizması verilen iki değeri belirttiğimiz koşula göre karşılaştırıp geriye boolean (true / false) türden bir bilgi döndürür. If yapısını şema ile anlatmak istersek eğer

 

 

Bu şekilde bir şema açıklayıcı olacaktır. If satırında ?= =? olarak belirttiğimiz ifade koşulumuzdur. Yani solundaki değer ile sağındaki değerin birbirine eşit olup olmadığına bakıyor ve boolean türden bir değer döndürüyor. Bunun dışında hepimizin bildiği diğer karşılaştırma ifadeleri C#'ta da aynıdır

 

VB

C#

=

= =

>=

>=

<> 

!=

 

Visual Basic ile kodlama yaparken, if içerisinde tek satır değilde birden fazla satırın işlem görmesini istiyorsak özel bir şey yapmamıza gerek yoktu fakat C# içerisinde bunun için

süslü parantezleri kullanıyoruz.

{

 

}

 

Yukarıdaki örnekten ilerlemek istersek kullanıcı sayıyı doğru tahmin edemediğinde txtTahmin isimli textbox 'ın içeriğini temizleyelim :

 

 

Yukarıdaki şekilde de gördüğümüz gibi else bloğunda iki satır kod çalıştırmak istediğim için, iki satır kodu süslü parantezler arasına alarak çalışmalarını sağladık.

 

SWITCH :

 

Şimdi gelelim bir başka kontrol mekanizmasına. If gibi çalışan Visual Basic de Select Case yapısı olarak bildiğimiz yapının C# taki karşılığı Switch Case dir. Bu yapı bize ne gibi bir avantaj sağlıyor bunu görüyor olacağız.

 

 

 

Bu şekilde bir proje geliştireceğimizi düşünelim. Kullanıcı cmbAylar isimli comboBox kontrolünden bir eleman seçecek. Bizde o ayın hangi Mevsimde olduğunu bulup txtMevsim isimli textBox kontrolüne yazıyor olacağız.Öncelikle yapıyı inceleyelim :

 

Şema :

 

Yukarıdaki şemada görüldüğü gibi switch için şöyle bir tanım kullanmamız doğru olacaktır. Switch, birden fazla if else bloklarının okunabilirlik açısından daha kolay kodlanmasıdır. Mesela kullanıcıdan aldığımız bir sayının 1 ile 5 arasında hangi rakama karşılık geldiğini bulmak için if deyimini seçtiyseniz :

 

(VB) :

 

 

 

(C#) :

 

 

Bahsettiğimiz programı VB veya C# ile if yapısını kullanarak yazmak istiyorsak  bu şekilde kodlama yapabiliriz. Fakat bu kodlama öncelikle okunabilirlik açısından çok iyi değil. Switch deyimi ile bu okunabilirliği arttırabiliriz.Bunun dışında yukarıdaki if bloklarını else if deyimi ile değil, hepsini sadece if deyimi ile kodlasaydık, program akışı sırasında tüm if deyimleri okunacaktı ve yorumlanacaktı. Bu durumda da if bloklarında sadece MessageBox.Show("x rakamı girildi") gibi bir kod bloğu yerine uzun süren hesaplamalar veya veritabanı ile ilgili işlemler yapılıyor olsaydı, her bir satır için tüm if deyimleri tekrar tekrar kontrol edilecekti.

İşte ikinci olarak da bu sorundan kurtulmak için switch yapısını kullanıyor olacağız. Şimdi gelelim yukarıdaki ufak programın switch ile yapılmasına :

 

(VB) :

 

 

(C#) :

 

 

Çalışma mantığına değinecek olursak,

  • switch {} parantezleri arasında ki case blokları switch (koşul) satırındaki koşulun sonucu için seçenekleri sunar.
  • default : deyimi switch deyiminde tanımlanan case seçenek bloklarından hiçbirinin doğrulanamaması durumunda çalıştırılacak olan seçenek bloğunu ifade eder. Yukarıdaki örnekten gidecek olursak, kullanıcı eğer 7 rakamını girerse TextBox kontrolüne bu durumda switch yapısındaki hiçbir case bloğu çalışmayacaktır. Fakat case bloklarından sonra birde default deyimi ile tanım yaparsak case bloklarımızın hiçbiri çalışmaz ise default deyimi çalışacaktır.

 

  • Her case bloğunun bitişi break anahtar kelimesi ile tanımlanır.break anahtar kelimesi case bloğunun bittiğini ve başka case bloklarının kontrol edilmemesi gerektiğini, yani switch yapısından artık çıkılabilineceğini söyler.

 

Switch yapısı ile ilgili b,r konudan daha bahsedelim. Bazen girilen bir sayılın herhangi bir aralıkta olup olmadığını kontrol etmemiz gerekebilir. Mesela bizim mevsim örneğimiz bu konu için uygun olacaktır. Önce örneğimizi yapalım sonrada yorumlayalım.

 

 

Yukarıdaki kodda gördüğümüz gibi eğer seçilen ay Aralık, Ocak, Şubat aylarından herhangi biri ise Kış Mevsimi bilgisini txtMevsim isimli kontrolün text özelliğine yazacağız. Bunun için 3 tane case bloğuna ihtiyacımız var.Ama 3 case bloğunun içeriğini teker teker yazmaktansa yukarıdaki şekilde olduğu gibi birden fazla case bloğunun aynı kodları çalıştırmasını sağlayabiliriz.Yukarıdaki örnekte comboBox içerisinden seçilen elemanın index ini kontrol ediyoruz. Koşul olarak onu bildirdik ve çıkabilecek muhtemel bütün sonuçları case bloklarında tanımladık. cmbAy isimli combobox içerisinde 12 ayın  her birine karşılık gelen 12 adet eleman bulunmakta.

 

0: Ocak

1: Şubat

2: Mart

3: Nisan

4: Mayıs

5: Haziran

6: Temmuz

7: Ağustos

8: Eylül

9: Ekim

10: Kasım

11: Aralık

 

Bu elemanlardan

0,1,11 indexli olanlardan herhangi biri seçilirse txtMevsim isimli textbox ta Kış,

2,3,4   indexli olanlardan herhangi biri seçilirse txtMevsim isimli textbox ta İlkbahar,

5,6,7   indexli olanlardan herhangi biri seçilirse txtMevsim isimli textbox ta Yaz,

8,9,10 indexli olanlardan herhangi biri seçilirse txtMevsim isimli textbox ta Sonbahar,

 

bilgisi görünecek. Bu durumda kodlama yaparken

 

case 0:

case 1:

case 11:

            txtMevsim.Text := "Kış Mevsimi";

break;

 

kodları ile 3 seçenekten hangisi seçilirse seçilsin bu kodun çalışmasını istediğimizi bildirmiş olduk.

 

Switch kontrolünün kullanım kurallarından bahsedecek olursak.

  • Aynı seçenek için birden fazla case tanımlanamaz.
  • default bloğunun tanımlanması isteğe bağlıdır zorunlu değildir.
  • Seçenekler değişken olamaz.
  • Seçenekler tamsayı veya string ya da char dediğimiz veri tiplerinden olabilir.

 

 

Böylelikle bir makalemizin daha sonuna geldik. Bir sonraki makalemiz de C# içerisindeki döngü yapılarına değiniyor olacağız.

 

Başka bir makalemizde tekrar görüşmek üzere hepinize iyi çalışmalar.

 

Bora BURGUCUGİL

bora.burgucugil@bilgeadam.com

---------------------------------------------

Bilge Adam Bilgi Teknolojileri Akademisi

Bireysel Yazılım Geliştirme Eğitmeni - Beşiktaş

 


Visual Basic'den C#'a geçiş

         Bu makalemizde Visual Basic kodlamadan, C# kodlamaya geçişi inceliyor olacağız. Öncelikle bazı gerekli olan sembollerle başlayalım makalemize. C# için kısa bir tanım yapacak olursa C# için C++, java ve Visual Basic dillerini bir araya getirerek ortaya bir harman çıkarıldığı söylenir. Zaten bu yüzdendir ki Microsoft C# diline fazlasıyla güvenmektedir. Peki C# dilinin ne gibi kalıpları ve kesin kuralları var acaba. Öncelikle C# kodlaması yaparken dikkat etmemiz gereken noktalar var bunlardan en önemlisi hemen hemen her kod satırımızın noktalı virgül ile sonlanmasıdır.

Neden hemen hemen dediğimi makalenin ilerleyen bölümlerinde görüyor olacağız. Şimdilik ön fikir olması amacıyla şunu söyleyelim. C# ta her satırın sonuna noktalı virgül (;) yazmak zorundayız. Ama if , for , while , try..catch blokları vs. karşılaştırma ifadelerinin veya döngülerin yada kontrol bloklarının sonuna ve de tanımlamaların örnek olarak class veya metot tanımlaması gibi yerlerde satırların sonuna noktalı virgül yazmıyoruz.C# ın dikkat edilmesi gereken ve asla unutulmaması gereken özelliklerinden biride Case Sensitive bir dil olmasıdır. Bu ne demek ?

C# ta tanıttığınız bir değişken veya kullanacağınız herhangi bir komutu tam ve doğru yazmalısınız, küçük harflerine ve büyük harflerine dikkat ederek yazmalısınız. Bu yüzden de bir C# programcısının ctrl+space kombinasyonu nu uyurken bile tekrarlaması her zaman doğaldır.

 

Konumuza değişken tanımlamaları ile başlayalım.

 

VB içerisinde :

 

 

şeklinde tanıttığımız değişkenleri CSharp içerisinde :

 

 

şeklinde tanıtıyoruz. Bunun anlamı nedir? Visual Basic içerisinde değişken tanımlamayı :

 

Dim değişken_adi As veri_tipi

 

formatında yaparken, C# içerisinde :

 

Veri_tipi değişken_adi;

 

formatında yapıyoruz.

 

Bunun dışında değişkenlere değer atamada hiçbir fark yoktur. Değişken adı = değer gibi bir atama satırı c# içerisinde de kabul görecektir.

 

Bu noktada biraz Visual Basic içerisinde sağlanmış kolaylıkların C# içerisinde olmamasından bahsedelim. Bunlardan en çok göze batanı tip dönüşümüdür. Visual Basic içerisinde :

 

 

Şeklinde bir atama yaptığınızda yani string tipten bir değişkeni alıp integer tipten sayi isimli değişkene yazdığınızda VB sizin için dönüştürme işlemini gerçekleştirecektir.

Programı çalıştırdığınızda ekrana ilk önce 0(sıfır) yazan bir mesaj kutusu daha sonra da yazi değişkeninin içeriği olan ?? sıfır karaktere sahip string türden veri içeren bir mesaj kutusu göreceksiniz. Yani programda sorun çıkmayacaktır ve çalışacaktır, fakat C# dilinde durum biraz farklı olacaktır

 

 

Resimde de gördüğümüz gibi C# içerisinde VB de gerçekleşen otomatik dönüştürme gerçekleşmiyor. Bu dönüştürme işlemini C#, programcının yapmasını ister. Bunun dışında resimde görüldüğü gibi ilk mesaj kutusu satırının da altı çizilmiştir. Bunun sebebi ise yine aynı şekilde tür dönüşümünü C#?ın sizden beklemesidir.

 

sayi = yazi; satırın da yazi değişkenini integer tipine

 

MessageBox.Show(sayi); satırında ise sayi değişkenini string veri tipine çevirmenizi bekler derleyici.

 

Kodu doğru yazmak istersek. Yapmamız gereken şunlardır:

 

 

Demek ki C# içerisinde tür dönüştürmeyi asla unutmuyoruz. Şimdi biraz yukarıdaki kodları açıklayalım. Değişkenlerimizi tanıttıktan sonra formumuzun load olayında bir değer ataması yapıyoruz ve integer bir değişkene string türden veriyi aktarıyoruz. Bunu yapabilmek için .Net Framework içerisindeki hazır ve de nazır bulunan, bizim kullanmamızı bekleyen sınıflardan biri olan Convert sınıfının ToInt32() metodunu kullanıyoruz. Metot bizden string değeri alıyor ve geriye integer türden değer döndürüyor. Bunun dışında yukarıdaki kodlarda gördüğümüz ToString() isminde bir kod daha var bu ne işe yarar dersek bu kod ise her tipten değişkenin üzerinde bulunan bir metottur. Tanıttığınız her değişkenin sonuna bir nokta koyduğunuzda ToString() metodunu görebilirsiniz, kullanabilirsiniz. Bu metodun yaptığı iş ise değerin veri tipi ne olursa olsun belirttiğiniz değişkenin değerini string olarak geriye döndürmesidir. Yukarıda ki kodda MessageBox.Show() metodu string bir değer istemektedir, ekrana yazacağı mesaj için. Bizim verdiğimiz değişkenin veri tipi ise integer olduğu için yine bir dönüştürme gereklidir. Ama bu sefer Convert sınıfından faydalanmamamızın sebebi ToString() metodunun tip ne olursa olsun her değişkenin üzerinde bulunuyor olmasıdır.

 

 

Not : Yukarıdaki resimde string yazi tanımlamasında yazi değişkeninin altının yeşil renk ile çizilmiş olmasının sebebi sadece bir uyarı almamızdır. Programın çalışması engellenmez ama uyarı programcıya gösterilir. Uyarının içeriği yazi isimli string türden tanıtılmış değişkenin bir ilk değer almamış olmasıdır. İlk değeri kodlayan tarafından verilmemiş bir string değişkenin ilk değeri derleyici tarafından null olarak atanır.

 

Şimdi biraz ilerleyelim ve gelelim dizilere. Tabiî ki dizilerin işleyişi anlamında hiçbir programlama dilinde fark oluşmayacaktır. Ama tanımlanırken bazı farklılıklar oluşabiliyor özellikle bizim makalemizin konusu olan C# ile VB arasında :

 

VB içerisinde

 

 

Şeklinde tanımlanan integer tipten bir dizi 6(altı) adet göze(elemana) sahip olacaktır. Yani Visual Basic içerisinde tanımlanan bu diziyi bir çekmeceye benzetecek olursak :

 

 

Yukarıdaki resimde görüldüğü gibi Visual Basic içerisinde bir dizi tanımlandığında kaç elemana sahip olacağı belirtildiği zaman Örnek 5 yazıldığında 5 indexli eleman açılana kadar göz eklenmeye devam edilecektir. Yukarıdaki dizi tanımı o zaman şöyle düşünülebilinir. 6 gözlü bir dizi, en son indisi 5. Programlama da her zaman diziler 0(sıfır)  indis ile başlar (indis = index). Dizinin kaç gözlü olduğunu saymaya çalıştığımızda ise 1 ile başlayacağımız için 6 gözlü bir dizi şeklinde bir ifade kullanıyoruz. Fakat C# içerisinde işler biraz değişik :

 

 

C# içerisinde yukarıda görüldüğü gibi tanımlanan bir dizi 5 elemana sahip olacaktır. Ve doğal olarak en son indisi 4 olacaktır. Bu da demek oluyor ki C# içerisinde diziye kaç gözlü olacağını söylersiniz, Visual Basic te dizinin en son kaçıncı indisi alacağını belirtirsiniz. Visual Basic örneğinde proje çalıştırıldığında ekrana 6 yazarken C# projesi çalıştırıldığında ekranda 5 değeri görülecektir.

 

Diziler konusunu öğrendiğimize göre Visual Basic içerisinde kullandığımız sub ve function ların C# içerisindeki karşılıklarını da görelim.

 

VB içerisinde kodlama yaparken bazı kodları tekrar tekrar yazmamız gerekebilir. Genellikle hesaplama işlemlerinde bu sorunla çok karşılaşırız. Bir satış programında kullanıcıdan kaç adet ürün alacağı bilgisini istersiniz ve birim fiyat sizin veritabanınızda sorgulanmayı beklemektedir. Sizde satış ekranında iken bu bilgiyi veritabanından okursunuz daha sonra adet ile birim fiyat değerini çarparsınız. Üzerinden KDV ayırırsınız. Hatta ürünün veritabanında tanımında belki genel bir iskonto  oranı vardır, onu da hesaplayıp toplam tutardan düşmeniz gerekmektedir. Sadece satış ekranını düşündüğümüzde her şey çok güzel ve sorunsuzdur. Sadece satışı yaparken okuyacaksınız çarpacaksınız böleceksiniz ve çıkartacaksınız. İşlem bu kadar. Fakat senaryoyu şöyle değiştirdiğimizde aynı projede birde stok modülü olsun ve bu sefer siz müşterisiniz ve bir de toptancınız var. Toptancıdan kaç adet ürün alacağınızı belirteceksiniz toptancı size birim fiyatı ile istediğiniz adeti çarparak, üzerine KDV sini hesaplayıp ekleyecek ve yine tanımlı ise size iskonto yapıp bunu toplam tutardan düşecek. Hala bir sorun yok ama siz aldığınız ürünlerin stok ve fiyat bilgilerini tutarak projenizde bir maliyet analizine ulaşmak istiyorsanız bu alış bilgilerinin de hepsini veritabanınızda tutmanız gerekecektir. Dolayısıyla biraz önce satış için yaptığınız hesaplamaların aynısını bu sefer kendi aldığınız ürün için yapıp veritabanınıza yazmanız lazım ki ileride bir üründen ne kadar kar ettiğinizi öğrenebilesiniz. Bu örnekten çıkartacağımız sonuç şu olmalıdır. Hem satış hem de stok için aynı kodu iki kere yazacağımıza bu hesaplama kodunu bir kere yazarız, ve hesaplama yapacak olan yerlerden bu kodları çağırıp çalıştırırız. İşte bu aşamada karşımıza VB içerisinde Sub veya functionlar çıkıyordu. Sub da function da içerisine yazdığımız bir grup kodu çalıştırmaya yarıyordu, aralarındaki tek fark subların sadece verilen kodları çalıştırması, functionların ise çalıştırdıktan sonra geriye bir değer döndürebiliyor olmalarıydı. O zaman hemen VB içerisinde bir sub örneği görelim :

 

(Not : Sub ların programlama da ki karşılığı prosedür(procedure), functionlar ise aynı şekilde fonksiyon ismini alırlar.)

 

 

Resimde görüldüğü üzere FiyatHesapla isimli sub, class üzerinde tanımlanmış netTutar isimli değişkene aldığı parametreler üzerinden bir hesap yapıp değer aktarıyor. Bunun birde function olarak karşılığını görelim dersek :

 

 

VB içerisinde Function tanımını da bu şekilde yapıyorduk. Şimdi gelelim bu programın C# ile kodlanmış haline. C# içerisinde prosedürler ve fonksiyonlar metot ismi altında toplanmıştır sub veya function gibi keyword ler ile ayrılmazlar tanımlanmaları şu şekilde olmaktadır. Önce sub karşılığı ile başlayalım :

 

 

Yukarıdaki resimde görüldüğü üzere C# içerisinde Sub veya function keyword leri kullanılarak bir tanım yapılmamaktadır. Birde C# içerisinde function karşılığını görelim sonra yorumlamaya başlayalım.

 

 

Yukarıdaki iki resimden de anlaşılacağı üzere C# içerisinde Sub dediğimiz geriye değer döndürmeyen prosedürlerin yerini void olarak tanıttığımız metotlar almaktadır. Function ların yerini ise geriye herhangi bir tipten (Örn : string, int, double, decimal, herhangi bir sınıf veya herhangi bir dizi vs) değer döndüren fonksiyonlar almaktadırlar. Prosedür dediğimiz, VB içerisinde Sub olarak geçen ve C# ta da void olarak geçen metotlar geriye (VB) nothing (C#)null, yani hiçbir şey döndürürler. Bu yüzden C# içerisinde onlara void değer döndüren metotlar diyoruz. Fakat fonksiyonlar ise geriye bir değer döndürmek zorundadır. Bunu da VB içerisinde function tanımının sonunda belirtiyorduk veya belirtmezsek kendisi tahmin ediyordu J C# içerisinde ise metodu tanımlarken belirtiyorduk. Bunları anlattıktan sonra C# içerisinde metot  tanımlaması şablonunu görelim :

 

Metotun_dondureceği_veri_tipi   metotun_ismi   (aldığı_parametreler)

 

*En baştaki metodun döndüreceği veri tipi void veya bir veri tipi olmalıdır. Boş geçilemez.

*Bir Sub yazmak istiyorsak metodun geri  döndüreceği veri tipi yerine void yazıyoruz

*Bir Function yazmak istiyorsak metodun geri döndüreceği veri tipi yerine int string vs gibi veri tipini yazıyoruz.

*Metoda bir isim vermek zorundayız.

*En sona parantez açılıp kapatılmak zorundadır. Parantezler arasına senaryo gerektiriyorsa parametrelerimizi ekleriz.

*Metot parametre almadan çalışacak ise parantezler arasını boş bırakırız.

*Bu şekilde tanım yapıldıktan sonra { } süslü parantez bloğu yazılmak zorundadır.

Süslü parantezler arasına çalışmasını istediğimiz kodları yazarız. VB içerisinde kullandığımız EndSub, EndFunction gibi kod satırları C# içerisinde yazılmamaktadır.

 

Böylelikle C# Biliyorum -1 makalemizin sonuna geldik. Seri olarak devam edecek makalelerimizden ikincisinde kontrol mekanizmalarına ve döngülere değiniyor olacağız.

Başka bir makalemizde tekrar görüşmek üzere hepinize iyi çalışmalar.

 

Bora BURGUCUGİL

----------------------------------------------------------

Bilge Adam Bilgi Teknolojileri Akademisi

Bireysel Yazılım Geliştirme Eğitmeni - Beşiktaş


OpenCD-Rom Drive

API ile CD-ROM kapağını açmak için gerekli olan ufak kod parçası aşağıdadır.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace OpenCDROM_API

{

   public partial class Form1 : Form

   {

      [DllImport("winmm.dll")]

       static extern Int32 mciSendString(String command,

         StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

      public Form1()

      {

               InitializeComponent();

      }

      public void OpenCD()

      {

            IntPtr ptr = IntPtr.Zero;

            StringBuilder returnstring = new StringBuilder();

            mciSendString("set CDAudio door open", returnstring, 127, IntPtr.Zero);

      }

      private void Form1_Load(object sender, EventArgs e)

      {

               this.OpenCD();

      }

   }

}

 

İyi çalışmalar


Visual Studio 2008 Ajax Enabled Web Site

Herkese merhaba,
VS 2008 ile birlikte artık Ajax Enabled Web Site şablonu kaldırıldı. Sebep ise VS 2008 in Ajax ile tam destek halinde geliyor olması.

Artık normal bir ASP.NET Web Site açıyorsunuz ve sitenize Add New Item diyerek

  • Ajax Web Form
  • Ajax Master Page
  • Ajax Client Control
  • Ajax Client Library
  • Ajax Enabled WCF Service

geliştirebiliyorsunuz.

İyi çalışmalar