<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yigit Kiran</title>
	<atom:link href="http://www.yigitkiran.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.yigitkiran.net/blog</link>
	<description>speculative execution</description>
	<lastBuildDate>Thu, 10 Mar 2011 16:16:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>C# Dersleri &#8211; 7: Windows Forms Uygulamalari</title>
		<link>http://www.yigitkiran.net/blog/2010/02/c-dersleri-7-windows-forms-uygulamalari/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/c-dersleri-7-windows-forms-uygulamalari/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 17:47:12 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersleri]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dersleri]]></category>
		<category><![CDATA[do]]></category>
		<category><![CDATA[dongu]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[program kontrolleri]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[while]]></category>
		<category><![CDATA[win forms]]></category>
		<category><![CDATA[windows forms]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=207</guid>
		<description><![CDATA[Uzun süredir devam eden C# derslerimizde geçtiğimiz yazida temel programlama konularını geride bıraktık ve artık siyah beyaz konsol pencerelerinden kurtulup Windows Forms uygulamalarının renkli dünyasına adım atmaya hazırız. Grafiksel kullanıcı arabirimi (GUI) diye tabir edilen arayüzler farklı programlama dillerinin işletim sistemleriyle entegre olarak kullanıcıları metin tabanlı programların sıkıcı ve monoton yapısından kurtarırlar. Özellikle konsol uygulamaları için Visual Studio kullanmayı tercih etmemiş olabilirsiniz ancak Windows Forms tarafında uygulama geliştirmek istiyorsanız bu alışkanlığınızdan hemen vazgeçmenizi öneririm. Windows Forms uygulamaları geliştirmek için yine Visual Studio’nun ücretsiz Express sürümlerini kullanabilirsiniz.

GUI kütüphanelerinin desteklediği farklı öğeleri kullanarak uygulamalarımıza farklı özellikler kazandırmak da oldukça kolaydır. Butonlar, metin kutuları, ikon ve sekmeler gibi kullanıcıların aşina olduğu bu öğeler ile C# uygulamalarımız hem göze hitap edecek hem de daha işlevsel olacaklar. Yazının başında Windows Forms konusuna değineceğimizi belirtsek de burada yapacağımız örnekleri Linux altında Mono kullanarak da yapabilmeniz mümkün. Bildiğiniz gibi platformdan bağımsız olarak çalışan .NET uygulamaları Linux altında Mono Projesi kapsamında çalışıyor ve Mono çok güçlü GUI araçlarına sahip.]]></description>
			<content:encoded><![CDATA[<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/114420037_f08201d9b8.jpg" rel="lightbox[207]"><img class="aligncenter size-full wp-image-214" title="114420037_f08201d9b8" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/114420037_f08201d9b8.jpg" alt="" width="500" height="375" /></a>Uzun süredir devam eden C# derslerimizde geçtiğimiz yazida temel programlama konularını geride bıraktık ve artık siyah beyaz konsol pencerelerinden kurtulup Windows Forms uygulamalarının renkli dünyasına adım atmaya hazırız. Grafiksel kullanıcı arabirimi (GUI) diye tabir edilen arayüzler farklı programlama dillerinin işletim sistemleriyle entegre olarak kullanıcıları metin tabanlı programların sıkıcı ve monoton yapısından kurtarırlar. Özellikle konsol uygulamaları için Visual Studio kullanmayı tercih etmemiş olabilirsiniz ancak Windows Forms tarafında uygulama geliştirmek istiyorsanız bu alışkanlığınızdan hemen vazgeçmenizi öneririm. Windows Forms uygulamaları geliştirmek için yine Visual Studio’nun ücretsiz Express sürümlerini kullanabilirsiniz.</p>
<p>GUI kütüphanelerinin desteklediği farklı öğeleri kullanarak uygulamalarımıza farklı özellikler kazandırmak da oldukça kolaydır. Butonlar, metin kutuları, ikon ve sekmeler gibi kullanıcıların aşina olduğu bu öğeler ile C# uygulamalarımız hem göze hitap edecek hem de daha işlevsel olacaklar. Yazının başında Windows Forms konusuna değineceğimizi belirtsek de burada yapacağımız örnekleri Linux altında Mono kullanarak da yapabilmeniz mümkün. Bildiğiniz gibi platformdan bağımsız olarak çalışan .NET uygulamaları Linux altında Mono Projesi kapsamında çalışıyor ve Mono çok güçlü GUI araçlarına sahip.</p>
<p><span id="more-207"></span></p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim56.png" rel="lightbox[207]"><img class="aligncenter size-medium wp-image-212" title="Resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim56-300x173.png" alt="" width="300" height="173" /></a>Visual Studio GUI konusunda çok güçlü araçlara sahip.</p>
<p>Yakın zamana kadar konu arayüz tasarımı olduğunda deneyimli programcılar bile temkinli davranır, uygulama dizaynının yanında programda kullanılacak arayüz araçlarının kullanımı hakkından uzun bir ön çalışma yaparlardı. Ancak Visual Studio, Windows Forms uygulamaları hazırlamak için çok kapsamlı yardımcılara sahip ve GUI araçlarının farklı pencerelerde kullanımını gerçekten oldukça kolaylaştırıyor. Farklı araçların sahip olduğu birçok özellik sağ tarafta bulunan bölmeden fare tıklamalarıyla değiştirilebilirken, öğelere ait olaylar yine çok kolay bir şekilde görülebiliyor ve programlanabiliyor. Formlar üzerine öğeler eklemek, boyutunu değiştirmek, bu öğeleri konumlandırmak, aksiyonlarını ayarlamak ve olayları tanımlamak gibi birçok ince detayı sadece farenizi kullanarak yapabilmek bizlere gerçekten önemli miktarda hız kazandırıyor.</p>
<p><strong>İlk Uygulamamız</strong></p>
<p>Sanırım en iyisi bir “Merhaba Dünya” uygulaması hazırlayarak anlattıklarımızın ne kadar kolay olduğunu deneyerek görmek. Visual Studio’yu açtıktan sonra New Project tuşuna tıklıyor ve artık “Windows Forms Application” öğesini seçiyoruz. Bu aşamadan sonra gri bir tual şeklinde boş formumuz karşımıza çıkacaktır. Dikkat ettiyseniz Formların ve üzerine eklediğiniz birçok aracın köşelerinde ve kenarlarının ortalarında bulunan daireler bu öğelerin yeniden boyutlandırılabilmesine olanak tanır. Kullanabileceğimiz bütün forms araçları ise solda bulunan araç kutusu (Toolbox)  içerisinde çeşitli kategorilere ayrılmış bir şekilde bizi beklemekte. Dilerseniz burada bütün öğelerin bulunduğu ilk sekmeyi açın ve buradan bir düğme (button) öğesini fareniz ile formun üzerinde istediğiniz yere taşıyın. Bu şekilde araçları taşırken çıkan kılavuz çizgileri ile doğru hizalama yapabildiğimizi ve birçok aracın düzenli bir şekilde yerleştirilebildiğini de hatırlatalım.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim17.png" rel="lightbox[207]"><img class="aligncenter size-full wp-image-208" title="resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim17.png" alt="" width="366" height="358" /></a>Çoğunlukla faremizi kullanarak bir Forms uygulaması hazırladık!</p>
<p>Dizayn ekranında bulunan her türlü öğenin sahip olduğu stil, fonksiyon ve değişkenleri değiştirmeye yönelik birçok özelliği bulunmaktadır. Bu özellikleri görebilmek ve değiştirebilmek için bu öğelere sağ tuşla tıklayıp özellikler (Properties) seçeneğini seçerseniz, ekranın sağ tarafında ilgili bölmesi açılacaktır. Örneğin yeni yerleştirdiğimiz butonu düşünecek olursanız burada fare ile değiştirebildiğimiz konum ve boyut özelliklerinden, butonun rengi, biçimi, üzerindeki yazı ve bu yazının stili gibi birçok ince ayara ulaşabilmemiz mümkün.</p>
<p>Dilerseniz ilk örneğimizi tamamlamak için butonun üzerine bir tane metin kutusu (TextBox) aracını da araç kutusundan seçerek formumuza yerleştirelim. Uygulamamız buraya yazacağımız değeri alarak bir mesaj kutusu içerisinde gösterebilen temel bir uygulama olacak. Ancak yine de metin kutusunun başına bir açıklama koymak isteyebiliriz ve bunun için tek yapmamız gereken araç kutusundan bir etiket (Label) nesnesini faremiz ile forma eklemek olacaktır. Özellikler bölmesinde bulunan Text değerlerini değiştirerek bu öğelerin metin değerlerini istediğimiz gibi ayarlayabiliriz. Yeni eklediğimiz Label ve Button nesnesinin bu değerini de ayarladıktan sonra sıra geldi butona basıldığında nelerin olacağını ayarlamaya.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim27.png" rel="lightbox[207]"><img class="aligncenter size-full wp-image-209" title="Resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim27.png" alt="" width="261" height="602" /></a>ToolBox içerisinde birçok araç mevcut.</p>
<p><strong>Events </strong></p>
<p><strong> </strong>Dilimize “olaylar” olarak çevirebileceğimiz events, bir öğenin belirli şartlar altında yapacağı aksiyonları belirleyen fonksiyonları uygulamaya ekler. Uygulamanın çalışması esnasında farenin bir öğenin üzerine gelmesi, belirli bir tuşa basılması veya seçili duruma gelmesi gibi kullanıcı tarafından meydana getirilen bu olaylar, programda bulunan belirli bir fonksiyonu tetikleyerek istediğimiz aksiyonun gerçekleşmesini sağlar. Birçok araç için en çok kullanılan olayların fonksiyonları, o aracı bir formun üzerine sürükledikten sonra üzerine fare ile çift tıklarsanız otomatik olarak kod sayfasına eklenecektir. Ancak bunlardan farklı bir olay için fonksiyon tanımlamak isterseniz, bunu Properties bölmesinde bulunan Event butonuna tıklayarak çıkan olay listesinden ilgili olaya çift tıklayarak gerçekleştirebilirsiniz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim65.png" rel="lightbox[207]"><img class="aligncenter size-full wp-image-213" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim65.png" alt="" width="283" height="605" /></a>Araçlar değişik olaylara yanıt verebiliyorlar.</p>
<p>Bizde ilk örneğimizde eklediğimiz düğmeye tıklandığında bir mesaj kutusu ile kullanıcılarımıza selam vermek istiyoruz. Bunun için dizayn ekranında eklediğimiz butona çift tıklayarak onun olay fonksiyonunun (button1_Click) yaratılmasını sağlıyoruz. Daha sonra bu fonksiyona bir mesaj kutusu içerisinde önceden eklediğimiz metin kutusundan alacağımız değerle birlikte bir mesajı aşağıdaki kod ile yazdırabiliriz:</p>
<pre class="brush: c#; ">

private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show(&quot;Merhaba, &quot; + textBox1.Text + &quot;!&quot;);

}
</pre>
<p>Burada MessageBox, Windows Forms kütüphanesi altında bulunan mesaj kutularına ait nesnedir. İçerisine aldığı string tipindeki değişken değerini göstermeye yarar ve konsol uygulamalarında sıkça kullandığımız Console.WriteLine() fonksiyonu gibi kullanıcıya mesaj vermekte kullanılır. Burada dikkat etmemiz gereken diğer bir nokta textBox1 ismindeki değişkendir. Formumuza ekleyeceğiniz bütün araçlar, isminin küçük harfle başlayan ve sonunda bir numara görebileceğiniz değişkenler yardımıyla kod içerisinde kontrol edilebilir.  İlk örneğimizi bitirdikten sonra diğer araçların kullanımını öğrenmeye devam edebiliriz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim37.png" rel="lightbox[207]"><img class="aligncenter size-full wp-image-210" title="Resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim37.png" alt="" width="287" height="604" /></a>Button aracının özellikleri.</p>
<p>En önemli GUI nesneleri arasında sayabileceklerimizden biri hiç şüphesiz diğer araçları içinde bulunduran panellerdir. .NET içerisinde bulunan panel araçlarından biri olan sekmeler ise programcılar tarafından en çok sevilenlerden biridir. Dilerseniz ikinci örneğimize geçmeden önce formumuza bir sekme kontrolü (TabControl)  aracı ekleyerek ikinci örneğimizi farklı bir sekmede hazırlayalım. Sekmeler tabPage adı verilen yapraklardan oluşur ve sekme kontrol nesnesine sağ tuşla tıklayınca menüden  “Add Tab” seçeneği ile bu yaprakların yenilerini eklemek mümkündür. Biz ikinci örneğimizde doğumumuzdan itibaren kaç gün geçtiğini hesaplayan küçük bir uygulama hazırlayacağız ve bunun bütün bileşenlerini ikinci sekmemizde bulunduracağız.</p>
<p>Dizayn ekranında formda bulunan ikinci sekmeye tıkladığınızda boş bir panel elde etmiş olacağız. Bu alana doğum günümüzü girmemiz için bir metin kutusu ekleyebilirdik ancak bu tür tarih konularında kullanıcılara daha kolay bir arayüz sağlayan DateTimePicker aracı işimize daha çok yarayacaktır. Bu aracı formumuza ekledikten sonra altına bir buton yerleştirerek şimdiki zamanla seçilen tarih arasında kaç gün geçtiğini hesaplayan fonksiyonu çalıştıracak bir tetikleyici bulundurabiliriz. C# içerisinde geçerli tarih ve saat  değerlerini tutmak için hazırlanmış bir veri tipi bulunur. DateTime ismindeki bu veri tipleri 1970 yılı Ocak ayından beri artan bir değere sahiptir ve bu değere göre zamanı saklar. Sakladığı değer long tipinde bir sayı olsa da, tarihsel bir değer istediğimiz zaman bize yıl, hafta, gün ve saat gibi farklı aralıklarda istediğimiz türden veri döndürebilen fonksiyonları bulunmaktadır. DateTime nesnelerinin bir diğer kullanım alanı da Now isimli özelliğinin “çağırıldığı zamanı” döndürerek zaman aralığı hesaplamalarında bize yardımcı olabilmesidir.</p>
<pre class="brush: c#; ">

private void button2_Click(object sender, EventArgs e)

{

//Örnek 2

DateTime dt = dateTimePicker1.Value;

DateTime simdikiZaman = DateTime.Now;

TimeSpan zaman = simdikiZaman - dt;

MessageBox.Show(&quot;Siz dogduktan sonra &quot; + zaman.Days +&quot; gün geçmis. &quot;);

}
</pre>
<p>Ancak iki zaman arasında matematiksel işlem yapmak kolay olmayacağı için TimeSpan isimli başka bir nesneden de yardım almamız gerekebilir. Biz de örneğimizde butonumuzun tıklanma olayına önce DateTimePicker nesnesinin sahip olduğu değeri ve şimdiki zamanı saklayan iki adet DateTime nesnesi oluşturarak başlıyoruz. Daha sonra eklediğimiz bir TimeSpan objesi bu öğelerin arasındaki zamanı saklamak için kullanılıyor. En son yaptığımız işlem ise ortaya bir mesaj kutusu çıkararak bu iki tarih arasında kaç gün olduğunu kullanıcıya bildirmek oluyor.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim48.png" rel="lightbox[207]"><img class="aligncenter size-full wp-image-211" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim48.png" alt="" width="313" height="327" /></a>İkinci örneğimizin dizayn görüntüsü.</p>
<p>Windows Forms uygulamalarına giriş yapmamızı sağlayan örneklerimizde bazı kullanıcı arayüzü araçlarını tanıtma fırsatımız oldu. Aralarında renk seçmeye yarayan ColorDialog gibi aşina olduklarımızdan, seri porttan veri gönderip almaya yarayan araçlara kadar birçok çeşit bulunan bu araçları, sahip olduğu özellikleri ve olayları boş zamanlarınızda incelemenizi tavsiye ederim. C# ve .NET ile geliştirilmesi çok kolay bir hal alan Forms uygulamaları, internet tabanlı uygulamalar ne kadar gelişse de günümüzde hala oldukça yoğun kullanıma sahip olan ve kullanıcıya gerçekten birçok kolaylık sağlayan bir yapıya sahip. Hazırladığınız uygulamayı kullanıma açmadan önce farklı bilgisayarlarda, çözünürlüklerde ve farklı sürüm Windows işletim sistemlerinde denemeniz de önemli. Örneğin bir takım araçların stil ve görünüm özellikleri farklı Windows temaları altında bile değişiklik gösterebilir.</p>
<p>Bu yazıyla birlikte blogumdaki C# dersleri serisinin sonuna geliyorum..  Dersler hakkındaki görüşlerinizi benimle paylaşırsanız çok sevinirim, umarım bu yazılar bazılarına yardımcı olabilmiştir! :) Sizden gelen görüşlere göre derslere devam edebilir yada farklı konularda buna benzer yazılar hazırlayabilirim, yeter ki fikirlerinizi belirtin :)</p>
<p>p.s. Bu yazı Ocak 2009 tarihinde yazılmıstır.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/c-dersleri-7-windows-forms-uygulamalari/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 6: Fonksiyonlar ve Sinif Yapilari</title>
		<link>http://www.yigitkiran.net/blog/2010/02/c-dersleri-6-fonksiyonlar-ve-siniflar/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/c-dersleri-6-fonksiyonlar-ve-siniflar/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 17:35:59 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersleri]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[command promt]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dersleri]]></category>
		<category><![CDATA[do]]></category>
		<category><![CDATA[dongu]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[fonksiyon]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[program kontrolleri]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[sinif]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[while]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=195</guid>
		<description><![CDATA[İlk derslerimizden itibaren hazırladığımız konsol uygulamaları ile C# temel yapılarını inceliyoruz. Bu dersimizde daha önce değinme fırsatı bulamadığımız fonksiyon, sınıf ve obje yapılarını inceleyerek eğitimimizin C# temellerine dair bölümünü tamamlayacağız. Önümüzdeki eğitimler içerisinde Visual Studio altında Windows Forms uygulamaları geliştirerek her ay farklı bir alanda uygulama geliştirme fırsatı yakalayacağız ve siyah komut satırı ekranına veda edeceğiz.

Veri yönetim biçimleri her programlama dilinde farklıdır. Nesne tabanlı programlama dillerinde ise çalışma sırasında bütün veriler nesnelere dönüşür ve referans ya da doğrudan bağlantıyla program akışı içerisinde kullanılırlar. C# altında da bütün veri tipleri ikiye ayrılır: temel tipteki nesneler ve sınıf referansı nesneleri. Temel tipteki nesneler önceki örneklerimizde bolca kullandığımız, byte, sayı, karakter veya metin değeri alan int, char veya string gibi C# içerisindeki dahili tiplerdir. Diğer veri tipleri ise bizim yazdığımız sınıflar (class) kullanılarak üretilen nesnelerdir.. Sınıflar nesne yönelimli programlamanın çekirdeğini oluşturan en küçük yapılar olarak projenizin sürdürülebilirliği, geliştirilebilir ve güvenliğine katkıda bulunur.

Ancak sınıf yapısına geçmeden önce, sınıfları oluşturan diğer bir önemli unsur olan fonksiyonlara değinmeliyiz. Programlama dillerinin en çok kullanılan özelliklerinden biri olan fonksiyonlar, belirli parametreler alarak çalışan ve kendi içinde belirlenen hesaplamayı yaparak cevabı çağrıldığı yere döndürebilen yapılardır. Özellikle uygulamamızın kodlarında birbirini tekrar eden yerler olduğunda veya birçok yerde kullanacağımız bir fonksiyonu defalarca yazmamız gerektiğinde fonksiyonlar yardımımıza koşar. ayrıca fonksiyon kullanmak, bu çok tekrar eden kodlarda herhangi bir değişiklik yapmamız gerekirse tek yerden bu değişikliği bütün uygulama çerçevesinde gerçekleştirmemize olanak verir.]]></description>
			<content:encoded><![CDATA[<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik3.jpg" rel="lightbox[195]"><img class="aligncenter size-full wp-image-196" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik3.jpg" alt="" width="500" height="375" /></a>İlk derslerimizden itibaren hazırladığımız konsol uygulamaları ile C# temel yapılarını inceliyoruz. Bu dersimizde daha önce değinme fırsatı bulamadığımız fonksiyon, sınıf ve obje yapılarını inceleyerek eğitimimizin C# temellerine dair bölümünü tamamlayacağız. Önümüzdeki eğitimler içerisinde Visual Studio altında Windows Forms uygulamaları geliştirerek her ay farklı bir alanda uygulama geliştirme fırsatı yakalayacağız ve siyah komut satırı ekranına veda edeceğiz.</p>
<p>Veri yönetim biçimleri her programlama dilinde farklıdır. Nesne tabanlı programlama dillerinde ise çalışma sırasında bütün veriler nesnelere dönüşür ve referans ya da doğrudan bağlantıyla program akışı içerisinde kullanılırlar. C# altında da bütün veri tipleri ikiye ayrılır: temel tipteki nesneler ve sınıf referansı nesneleri. Temel tipteki nesneler önceki örneklerimizde bolca kullandığımız, byte, sayı, karakter veya metin değeri alan int, char veya string gibi C# içerisindeki dahili tiplerdir. Diğer veri tipleri ise bizim yazdığımız sınıflar (class) kullanılarak üretilen nesnelerdir.. Sınıflar nesne yönelimli programlamanın çekirdeğini oluşturan en küçük yapılar olarak projenizin sürdürülebilirliği, geliştirilebilir ve güvenliğine katkıda bulunur.</p>
<p>Ancak sınıf yapısına geçmeden önce, sınıfları oluşturan diğer bir önemli unsur olan fonksiyonlara değinmeliyiz. Programlama dillerinin en çok kullanılan özelliklerinden biri olan fonksiyonlar, belirli parametreler alarak çalışan ve kendi içinde belirlenen hesaplamayı yaparak cevabı çağrıldığı yere döndürebilen yapılardır. Özellikle uygulamamızın kodlarında birbirini tekrar eden yerler olduğunda veya birçok yerde kullanacağımız bir fonksiyonu defalarca yazmamız gerektiğinde fonksiyonlar yardımımıza koşar. ayrıca fonksiyon kullanmak, bu çok tekrar eden kodlarda herhangi bir değişiklik yapmamız gerekirse tek yerden bu değişikliği bütün uygulama çerçevesinde gerçekleştirmemize olanak verir.</p>
<p><span id="more-195"></span></p>
<p><strong>Fonksiyon Kullanımı </strong></p>
<p>Bütün fonksiyonlar stabil bir yapı içerisinde tanımlanır ve fonksiyona ait kodlar geçmiş eğitimlerde gördüğümüz döngülerde olduğu gibi süslü parantezler { ve } arasına yazılır. Yine burada önemli olan, bu parantezler ile kod blokları oluşturduğumuz için parantezi kapattıktan sonra noktalı virgül kullanmamamız gerektiği. Kodumuzu yer aldığı alandan önce fonksiyonun erişim parametreleri, döndüreceği değer, ismi ve varsa aldığı parametreler yazılmalıdır. Fonksiyonlar amaçlarına göre kendi yazıldığı sınıf içerisinde kullanıldığı gibi, başka sınıflar tarafından da ilgili sınıfın bir nesnesi yaratılarak kullanılabilirler. Bir fonksiyonu çağırmak için, eğer aynı sınıf içerisinde ise fonksiyon(parametreler) şeklinde çağırabilir, farklı bir sınıf içerisinde tanımlıysa ileride değineceğimiz şekilde o sınıftan bir nesne yaratarak çağırabiliriz. Bu sayede birçok sınıf birlikte çalışabilir ancak bazı fonksiyonlar sadece o sınıfın kendi iç işleyişi için gereklidir ve o dışarıdan çağırılmaması hatalara neden olmaması adına önemlidir. Bu yüzden fonksiyon tanımlamalarına başlarken ilk önce bir erişim denetliyici parametre kullanarak ilgili fonksiyonun hangi sınıflar tarafından görülebileceğini belirtebiliriz. Kullanabileceğimiz farklı değişkenlerden en önemlileri “public” ve “private”’dir. Eğer bir fonksiyonun uygulamanın bütün sınıfları tarafından çağrılmasında bir sakınca yoksa onu ortak yani “public” olarak tanımlamalıyız. Ancak tersi bir durum içi gizli (private) bir fonksiyon olarak tanımlayarak ilgili sınıf dışından kullanılmasını engelleyebiliriz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-3.png" rel="lightbox[195]"><img class="aligncenter size-full wp-image-201" title="Resim 3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-3.png" alt="" width="445" height="106" /></a>Örnek fonksiyon deklerasyonu</p>
<p>İkinci adım olarak fonksiyonumuzun dönüş parametresini belirlemeliyiz.  Hesap yapmakla görevli bazı fonksiyonlar, hesaplamaları yapacakları değerleri parametre olarak aldıktan sonra, ilgili işlemleri kendi içinde yapar ve yaptığı hesabın sonucunu geri döndürebilir. Biz bu dönen değeri başka bir değişkene atayabilir ya da ekranda yazdırabiliriz. İlk örneğimizde konsolda çalışan basit bir hesap makinesi hazırladık. Burada gördüğünüz gibi Islemler isminde bir sınıfımız bulunmakta ve bu sınıfın içerisinde Topla ve Carp adında iki fonksiyon mevcut. Ondalık sayı değerini ifade eden double türünden değerleri toplayabilen ve çarpabilen bu fonksiyonlar başka sınıflardan da çağırılabildiği için public olarak erişilebilir kılınmış ve sonuç olarak bir ondalık değer döndürebileceğinden double türünden bir dönüş değeri tanımlanmış.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-1.png" rel="lightbox[195]"><img class="aligncenter size-full wp-image-199" title="Resim 1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-1.png" alt="" width="352" height="223" /></a>İlk örneğimizin ekran çıktısı</p>
<p>Ancak fonksiyonların her zaman bir değer döndürmeleri zorunlu değildir. Örneğin ekrana yazı yazdıran veya veritabanına girdiler ekleyen bir fonksiyonun çağrıldığı yere bir değer döndürmesi gereksizdir. Böyle durumlarda döndürülecek değerin olmadığını belirten void ifadesi yazarak fonksiyonumuzu tanımlıyoruz. Fonksiyonların döndürmesi gereken değerler olduğunda ise, bu değeri hesaplandıktan sonra return anahtar sözcüğünü kullanılarak çağrıldığı noktaya iletebiliriz. Örneğimizdeki Topla ve Carp fonksiyonları da aldığı değerleri basit olarak matematiksel bir işlem yaptığı için bunları direk return ifadesinin yanında gerçekleştirebiliyoruz. Burada dikkat etmemiz gereken nokta, return ifadesinin fonksiyonu sonlandırdığını bilmek. Bu ifadeden sonra fonksiyondan çıkılacağı için “return”’ü bütün işlemlerini bitirdikten sonra ya da bazı koşullar sağlandığında çıkmak isterseniz if gibi ifadelerin içerisinde kullanmamız gerekiyor.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim64.png" rel="lightbox[195]"><img class="aligncenter size-full wp-image-197" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim64.png" alt="" width="358" height="270" /></a>IntelliSense programcılara çok büyük kolaylı sağlıyor.</p>
<p>Dönüş tipini belirledikten sonra fonksiyonumuza bir isim verip, parantezler içerisinde fonksiyonun alacağı ifadeleri tanımlıyoruz. Fonksiyon içinde kullanılacak parametreler burada vereceğimiz isimler ile anılan lokal değişkenler haline gelirler. Ayrıca parametre isimlerinden önce mutlaka veri tiplerini de belirmemiz gerekmekte.</p>
<p><strong>Sınıf ve Nesneler</strong></p>
<p>Daha önce bahsettiğimiz gibi, belirli fonksiyonların sınıflar altında gruplanarak uygulama içerisinde belirli bir işlevi yürütmeye çalışırlar. Geçtiğimiz eğitimlerden hatırlayacak olursanız, C# ta uygulamalar, Main ismindeki özel bir fonksiyon ile başlar. Yani programımız çalışırken bu Main fonksiyonu aranır ve bütün işlemler bu fonksiyon ile başlatılır. Önemli olan bir nokta, bütün program içerisinde sadece bir adet Main fonksiyonunun olması gerektiğidir. Programımız sahip olduğu nesneleri kullanarak işlevlerini yerine getirir ve sınıflar bu nesnelerin yaratılması için gerekli bir kalıp görevi görür.</p>
<p>Yaratılan nesneler kendi isimleriyle çağırılırlar ve bağlı bulunduğu sınıfın fonksiyonlarını çalıştırmamıza imkân verirler. Bir sınıftan yeni bir nesne yaratmak için ise yeni anlamına gelen “new” anahtar sözcüğünden yararlanıyoruz.</p>
<p>Ornek nesneİsmi = new Ornek();</p>
<p>Şeklinde örnek bir sınıfa dair yeni bir nesne yaratabiliriz. Daha sonra nesneİsmi bu nesnenin referansı haline gelecek ve kodun ilerleyen kısmında bu nesneyi temsil edecektir. Herhangi bir nesnenin içerdiği fonksiyonlara, o nesnenin yanına bir nokta koyarak ulaşabiliriz. Bu gibi durumlarda noktadan sonra ilgili fonksiyonun ismini yazmamız gerekse de Visual Studio’nun IntelliSense adı verilen özelliği, siz nokta işaretini koyduğunuz anda kullanabileceğiniz fonksiyonları imlecin sonunda size listeliyor. Bütün geçerli değişkenleri, fonksiyonları ve aldığı parametreleri görebileceğimiz bu liste gerçekten çok büyük bir zaman avantajı sağlamakta.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-4.png" rel="lightbox[195]"><img class="aligncenter size-full wp-image-202" title="Resim 4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-4.png" alt="" width="448" height="431" /></a>Örnek sınıf ve isim uzayı kullanımı</p>
<p>Yeni bir sınıf yaratmak için sağ tarafta bulunan Solution Explorer içerisinde projemize sağ tuşla tıklayıp, New Item -&gt; Class seçeneğini seçebiliriz. Burada görebileceğimiz gibi sınıf (class) ismi otomatik olarak atanacaktır. Burada class anahtar sözcüğünden sonra sınıfımızın ismini yazıyor ve sonraki kod blokları içerisine ilgili kodlarımızı yazıyoruz. Burada dikkat çekici diğer bir ifade ise namespace ifadesiyle tanımlanan isim uzaylarıdır. İsim uzayları c# içerisindeki sınıfların gruplandığı, içerisine toplanan belirli gruptaki sınıfların bir katman olarak kullanılabildiği üst yapıdır. Aynı gruptaki bütün sınıflar, aynı isim uzayı içerisinde çalışmalıdır ve bu isim uzaylarının isimleri namespace ifadesinin yanında belirtilir.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-5.png" rel="lightbox[195]"><img class="aligncenter size-medium wp-image-203" title="Resim 5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-5-300x136.png" alt="" width="300" height="136" /></a>Bütün uygulamalar Main fonksiyonu ile başlarlar..</p>
<p>Sınıflar içerisinde bütün fonksiyonların ve diğer sınıfların görebileceği değişkenler oluşturmak ta mümkündür. Global değişken denilen bu tipler, başına yazılan bir erişim denetleyicisi sayesinde diğer sınıflar tarafından görünebilirliğini değiştirebilir. Fonksiyonlar içerisindeki lokal veriler ile çakışmaması için bu değişkenlere farklı bir isim atamak doğru bir karar. Yine de bir fonksiyon içinde this.GlobalDeğişkenAdı biçiminde bu değişkenlere ulaşmak mümkündür.</p>
<p>Sınıflar için oldukça önemli olan bu global değişkenlerin ilk atamalarının yapılması ise diğer bir önemli konu. Nesneleri oluşturmak için bir kalıp olarak kullandığımız sınıflar, bu değişkenlerin aldığı değerler ile birbirinden farklı nesneler üretebilirler. Bu değişkenlere değer veren fonksiyonlar oluşturabileceğimiz gibi, direk nesne oluşumunda da bu değişkenlere değerini atayabiliriz. Yapılandırıcı (constructor) denilen özel yapılar bir nesne oluşturulmadan bu atamaları ve varsa farklı işlemleri yapmamıza olanak verir.  Yapılandırıcı oluşturmak için herhangi bir dönüş tipi olmayan ve sınıfla aynı isimdeki fonksiyonları kullanırız. Örneğin Arac isimli bir sınıfımız varsa;</p>
<p>public Arac(int hiz, string renk)  { … }</p>
<p>Şeklinde bu sınıfa örnek bir yapılandırıcı oluşturabiliriz. Buradaki “hiz” ve “renk” değerleri, Arac sınıfının ilgili global değişkenlerini atamakta kullanılabilirler. Bu aşamadan sonra yapılandırıcı kullanılarak oluşturulan nesneler gerekli başlangıç değerlerini alarak oluşmuş olurlar. Bir örnek vermek gerekirse, aynı Arac sınıfından bu şekilde yeni nesne yaratabiliriz:</p>
<p>Arac yeniArac = new Arac(180, “mavi”);</p>
<p>Burada new ifadesinin yanında Arac sınıfının yapılandırıcısı doğrultusunda değerler vererek sınıfı başlangıç değerleriyle yaratabiliyoruz. Son olarak ikinci örneğimize bakacak olursak, yarattığımız bir Saat sınıfının saat, dakika ve saniye olmak üzere 3 global değişkeni bulunmakta. Bu değişkenler bir yapılandırıcı sayesinde nesne yaratıldığında değer alıyor ve SaatiGoster fonksiyonu ile ekrana yazdırılıyorlar. Saati gösteren fonksiyonumuzu döneceği bir değer bulunmadığı için void ifadesi ile yaratıyoruz. Konsol uygulamalarında göstereceğimiz bu son örnek ile C# derslerinin bu bölümünü tamamlıyoruz.. Bir sonraki yazıda görüşmek üzere ;)</p>
<p>p.s. Bu yazı Aralık 2008 tarihinde hazırlanmıştır.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-2.png" rel="lightbox[195]"><img class="aligncenter size-medium wp-image-200" title="Resim 2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim-2-300x144.png" alt="" width="300" height="144" /></a>İkinci örneğimizin sonuç ekranı</p>
<p>Örnek Kod 1:</p>
<pre class="brush: c#; ">

//1. Örnek

class Islemler

{

public double Topla(double a, double b)

{

return a + b;

}

public double Carp(double a, double b)

{

return a * b;

}

public static void Main()

{

//Once sınıfımızdan bir nesne yaratıyoruz.

Islemler hm = new Islemler();

//Örnek olarak 10 ve 20 sayısını kullanıyoruz.

Console.WriteLine(“Toplam: ” + hm.Topla(10, 20) + “\nÇarpım: ” + hm.Carp(10, 20));

}

}
</pre>
<p>Örnek Kod 2:</p>
<pre class="brush: c#; ">

//2. Örnek

class Saat

{

public int saat;

public int dakika;

public int saniye;

public Saat(int yeniSaat, int yeniDakika, int yeniSaniye)

{

saat = yeniSaat;

dakika = yeniDakika;

saniye = yeniSaniye;

}

public void SaatiGoster()

{

Console.WriteLine(&quot;Saatimiz: &quot; + saat + &quot;:&quot; + dakika + &quot;:&quot; + saniye);

}

static void Main(string[] args)

{

//Saat sınıfından yapılandırıcıyı kullanarak bir nesne yaratıyoruz.

Saat saatim = new Saat(22, 10, 56);

//SaatiGoster fonksiyonunu cagiriyoruz.

saatim.SaatiGoster();

}

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/c-dersleri-6-fonksiyonlar-ve-siniflar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 5: Diziler</title>
		<link>http://www.yigitkiran.net/blog/2010/02/c-dersleri-5-diziler/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/c-dersleri-5-diziler/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 01:39:02 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersleri]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[cok boyutlu diziler]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dersleri]]></category>
		<category><![CDATA[dizi]]></category>
		<category><![CDATA[diziler]]></category>
		<category><![CDATA[do]]></category>
		<category><![CDATA[dongu]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[program kontrolleri]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[tek boyutlu diziler]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[while]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=185</guid>
		<description><![CDATA[Derslerimizin ilk konularından biri olan değişkenlerin programlarımızın bazı değerleri hafızasında tutmak istediği zaman kullanıldığını biliyoruz. Farklı tiplerde String, int gibi sayı veya metin değerleriyle oluşturduğumuz değişkenlerin yanı sıra, kendi yarattığımız nesnelerin de değişkenler vasıtasıyla bellekte saklanabildiğine de önceki aylarda şahit olmuştuk. Ancak hazırladığımız uygulamalardaki verileri tek tek işlemek genel olarak uzun zaman alan ve bu verilerin sayısı arttığında kontrol etmesi güç bir görev. Bu yazımda temel programcılık öğelerinden biri olan diziler konusuna değinerek birçok değeri bir değişken içerisinde kullanabilmeye değineceğim.

Programlama dillerinde dizileri kullanmak bizi birçok satırda yazacağımız kod satırlarından ve birçok değişkenin yarattığı karışıklıktan kurtararırken, aynı işlemleri tek satır bir koda dönüştürerek daha basite indirgenmiş anlaşılır bir hale getirir. Örneğin 10 tane değişkenle işlem yapabilen bir uygulamayı yazmak çok zor değildir, ancak binlerce sayı kullanarak hesaplama yapmamız gerektiğinde bütün değerler için yeni bir isim bularak yeni değişkenler yaratmamız tamamen bir vakit kaybıdır. Dizilerin kullanımı bize zamandan kazanç sağlar ve daha sağlıklı kodlar üretmemize olanak tanır. Temelde sıralı olmayan elemanların bir araya gelmesiyle oluşan diziler, belirli bir sayıda veriyi bir değişkene bağlar ve bu değişken üzerinden döngü yapılarıyla bütün verilere çok hızlı bir biçimde arama, sıralama, değiştirme gibi işlemleri uygulamanıza imkân verir. Dizi tipindeki bir değişken içerisinde istediğimiz kadar veri tutmamız mümkündür, ancak burada önemli nokta bütün verilerin tiplerinin aynı olması gerektiğidir.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code2.jpg" rel="lightbox[185]"><img class="aligncenter size-full wp-image-186" title="code2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code2.jpg" alt="" width="450" height="351" /></a>Derslerimizin ilk konularından biri olan değişkenlerin programlarımızın bazı değerleri hafızasında tutmak istediği zaman kullanıldığını biliyoruz. Farklı tiplerde String, int gibi sayı veya metin değerleriyle oluşturduğumuz değişkenlerin yanı sıra, kendi yarattığımız nesnelerin de değişkenler vasıtasıyla bellekte saklanabildiğine de önceki aylarda şahit olmuştuk. Ancak hazırladığımız uygulamalardaki verileri tek tek işlemek genel olarak uzun zaman alan ve bu verilerin sayısı arttığında kontrol etmesi güç bir görev. Bu yazımda temel programcılık öğelerinden biri olan diziler konusuna değinerek birçok değeri bir değişken içerisinde kullanabilmeye değineceğim.</p>
<p>Programlama dillerinde dizileri kullanmak bizi birçok satırda yazacağımız kod satırlarından ve birçok değişkenin yarattığı karışıklıktan kurtararırken, aynı işlemleri tek satır bir koda dönüştürerek daha basite indirgenmiş anlaşılır bir hale getirir. Örneğin 10 tane değişkenle işlem yapabilen bir uygulamayı yazmak çok zor değildir, ancak binlerce sayı kullanarak hesaplama yapmamız gerektiğinde bütün değerler için yeni bir isim bularak yeni değişkenler yaratmamız tamamen bir vakit kaybıdır. Dizilerin kullanımı bize zamandan kazanç sağlar ve daha sağlıklı kodlar üretmemize olanak tanır. Temelde sıralı olmayan elemanların bir araya gelmesiyle oluşan diziler, belirli bir sayıda veriyi bir değişkene bağlar ve bu değişken üzerinden döngü yapılarıyla bütün verilere çok hızlı bir biçimde arama, sıralama, değiştirme gibi işlemleri uygulamanıza imkân verir. Dizi tipindeki bir değişken içerisinde istediğimiz kadar veri tutmamız mümkündür, ancak burada önemli nokta bütün verilerin tiplerinin aynı olması gerektiğidir.</p>
<p><span id="more-185"></span></p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim47.png" rel="lightbox[185]"><img class="aligncenter size-full wp-image-190" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim47.png" alt="" width="286" height="342" /></a>Diziler birçok değişkeni bünyesinde barındırırlar..</p>
<p><strong>Dizilerin Kullanımı</strong></p>
<p>Tanımlandıktan sonra bilgisayarınızın belleğine yazılan bu diziler, 0’dan başlayan indekslere (indis olarak da adlandırılır) sahiptir ve dizi içerisinde belirli bir sıradaki elemana erişim bu indeks ile gerçekleştirilir. Programlama diline göre farklılık gösteren başlangıç indeksinin 0 olması, örneğin 5. elemanı getirmek için indeksi 4 olan öğeyi çalıştıracağınız anlamına geldiği için dikkatli olmamızı gerektirir. Yeni bir dizi yaratma işlemi 2 adımda gerçekleşir. Primitif değişkenler yaratırken yaptığımız gibi diziyi tanımlarız ve bundan sonra bir nesne yaratırken kullandığımız “new” anahtar sözcüğü ile dizimizi oluşturabiliriz. Bu iki adımda değişkenlerden farklı olarak kare parantezler kullanarak yarattığımız şeyin bir dizi olduğunu belirtiyoruz. Örneğin 5 elemanı olan bir int dizisi yaratmak için:</p>
<p>int[] ornek = new int[5];</p>
<p>ifadesini kullanmamız yeterli. Böylece “ornek” isminde 5 adet sayıyı barındıran bir dizi değişkeni yaratmış oluyoruz. Dizimizin barındırdığı elemanlara erişmek için indeks sayıları kullanıldığından yukarıda bahsetmiştik. Değişken ismine bitişik yazdığımız kare parantezleri kullanarak bu indeks sayılarını belirtebilir ve istediğimiz elemana erişebiliriz. Örneğin yukarıda yarattığımız 5 elemanlı dizinin son elemanını değiştirmek için</p>
<p>ornek[4] = 100;</p>
<p>yazmamız yeterli. Eğer bu elemanı daha sonra bir işlem içerisinde kullanmak veya yazdırmak istiyorsak yine indeksini belirterek kullanmamız mümkün. Aşağıdaki kod ile aynı elemanımızı konsola yazdırabiliriz:</p>
<p>Console.WriteLine(ornek[4]);</p>
<p>Dizilerin kullanımında aklımızda bulundurmamız gereken en önemli husus ise, her dizinin yaratılırken boyunun belirlenmesi gerektiğidir. Hatırlarsanız “ornek” isimli dizimizi yaratırken kullandığımız new int[5] ifadesindeki 5 bu dizinin boyutunu belirler. Belirlediğimiz boyut kadar bilgisayarın belleğinde (RAM) yer ayrıldığı için dizileri oluştururken mutlaka boyutunu belirlememiz gerekir ve bu boyutu daha sonradan değiştirmemiz mümkün değildir. Varolan bir dizinin boyutunu değiştirmenin tek yolu yeni bir dizi oluşturup mevcut dizinin bütün elemanlarının bir döngü içerisinde yeni diziye aktarılmasıdır. Eğer dizi yapınızın boyutunun dinamik olarak artması önemli ise, daha farklı bir veri yapısı (ör: ArrayList) da kullanabilirsiniz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim63.png" rel="lightbox[185]"><img class="aligncenter size-full wp-image-192" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim63.png" alt="" width="421" height="458" /></a> İlk örneğimizin ekran görüntüsü..</p>
<p>Aslında değişkenlerin bir kümeyi oluşturduğu veri yapıları olan dizilerin bir diğer özellikleri ise boyutlarıdır. Yukarıda bahsettiğimiz tek bir indeks sayısı olan diziler gibi olanlar tek boyutlu, satır ve sütun olarak veri depolayabilenlere çift boyutlu diziler denir. Günümüzde bazı dillerde bulunan ikiden fazla boyut destekleyen çok boyutlu dizileri C# içerisinde oluşturmamız mümkündür ancak bunların kullanım alanları kısıtlıdır.</p>
<p><strong>Tek Boyutlu Diziler</strong></p>
<p>Daha önce nasıl oluşturabileceğimizi gördüğümüz bu diziler ile ilgili olarak asıl bilmemiz gereken, onların döngüler içerisinde kullanımıdır. Geçtiğimiz ay değindiğimiz for veya while döngüleri ile dizilere eleman atamak, mevcut elemanları görüntülemek veya değiştirmek gerçekten çok fazla kullanılan ve çok hızlı yapıldığı için bir nevi hayatımızı kolaylaştıran işlemlerdir. Dizinin eleman sayısı kadar çalışan döngüleri özellikle tek boyutlu dizilerde kullanmak zor değildir. Yapmamız gereken tek şey dizilerin boyutunu döndüren “Length”  özelliğini kullanarak geçtiğimiz ay öğrendiğimiz sayaç kullanılan döngüler oluşturmak. İsterseniz ilk örneğimizde 100 elemanlı double tipinde bir dizi yaratalım ve 1’den 100’e kadar olan sayıları bu diziye dolduralım. Elemanları görüntüledikten sonra bütün hepsini ikiye bölerek tekrar konsolda görüntüleyelim. Cümleleri takip ettiyseniz burada yaptığımız dört farklı işlem bulunmakta. Önce diziyi dolduruyor, ekranda gösteriyor, sonra ikiye bölüp en sonunda tekrar görüntülüyoruz. Bütün bu işlemlerin bir for döngüsü içerisinde yapıldığı ilk örneğimizi Örnek Kod 1 içerisinde (yazının altında) bulabilirsiniz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim3.gif" rel="lightbox[185]"><img class="aligncenter size-full wp-image-189" title="Resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim3.gif" alt="" width="407" height="337" /></a> C# çok boyutlu dizilere de destek veriyor..</p>
<p>Hazırladığımız döngüleri inceleyecek olursak, hepsinde bir “i” sayaç değişkenimiz bulunmakta ve bu değişken 0’dan başlayarak dizi boyutuna gelmeden durmaktadır. İşte dizilerin döngü ile etkileşime geçebilmesi bu değişken sayesinde gerçekleşiyor. Sayacı dizimizin indeks sayısı olarak kullanabiliyoruz ve sayaç her döngüde değiştiği için bizde sürekli dizimizin farklı bir elemanına varolan işlemi uygulamış oluyoruz. Örneğimizde dikkat edeceğimiz diğer bir nokta ise, bizim dizi elemanlarını eşitlemek istediğimiz sayı değerleri 1’den başlıyordu ancak biz sayacımızı yine de 0’dan başlattık. Dizilerin indeks sayısı 0 olduğundan ve döngü sayacını dizimizin indeksi olarak kullandığımızdan “i” değişkenini bu değerler ile tanımlamak zorunda kaldık.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim55.png" rel="lightbox[185]"><img class="aligncenter size-full wp-image-191" title="Resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim55.png" alt="" width="514" height="417" /></a> İki boyutlu diziler tablo yapısındadır.</p>
<p><strong>Çok Boyutlu Diziler</strong></p>
<p>Dizilerin birçok farklı alanlardaki kullanımı, onun tek düze gidişatını bozmamızı gerektirebilir. Sakladığımız değerler ile ilişkili başka değerleri de bu verinin bulunduğu satırda bir tablo gibi tutmamızı gerektiren pek çok uygulama vardır. Örneğin matris işlemleri, birçok oyundaki veriler genelde iki boyutlu diziler ile çalışırlar. Excel gibi çizim tablolarından alışık olduğumuz satır ve sütun mantığı burada da geçerli olmakla beraber, bu dizileri kontrol edebilmek için boyut sayısı kadar iç içe döngüye de ihtiyaç duyarız. Çok boyutlu dizilerin C# içerisindeki söz diziminin mevcut diğer programlama dillerinden farklı olduğunu da söylemekte fayda var. Yine 2 adımda oluşturduğumuz dizilerimizi tanımlama sırasında yazdığımız köşeli parantezlerin içerisine virgül koyarak bir boyut daha artmasını sağlıyoruz. Yani buraya iki adet virgül koyarsanız diziniz üç boyutlu olacaktır. Bundan sonra oluşturma sırasında aynı şekilde boyut değerlerini, araya bu virgüller gelecek şekilde yazmanız yeterli.</p>
<p>double [,] ikiBoyutlu = new double[10,30];<br />
int[, ,] ucBoyutlu = new int[3, 5, 8];</p>
<p>Şeklinde çok boyutlu dizilerinizi oluşturabilirsiniz. İsterseniz konuyu daha iyi anlayabilmek için Tablo 2 içerisinde verdiğimiz örneği inceleyelim. Bu uygulamamıza 10’a 30’luk iki boyutlu dizi oluşturarak başlıyoruz. Bu tanımlamadan sonra gördüğünüz iç içe for döngüleri aslında çok boyutlu dizinin bütün elemanlarına giden aynı döngüler. Sadece ilkinde bütün dizi elemanları doldurulurken ikinci döngüde bu elemanlar konsola yazdırılıyor.  İç içe döngülere dair bilmemiz gereken tek şey dışarıdaki döngünün satırlar, içerideki döngünün sütunları kontrol ettiği.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim16.png" rel="lightbox[185]"><img class="aligncenter size-full wp-image-187" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim16.png" alt="" width="381" height="372" /></a>İkinci örneğimizin ekran görüntüsü..</p>
<p>Döngüler ile dışarıdan içeriye doğru tablo şeklindeki veri yapımızın bütün elemanlarını seçerken tek boyutlu dizilerden farklı olan diğer bir nokta da, Length özelliğinin bu tür dizilerde kullanımının çok tehlikeli olması!  Satırlar arasında ilerleyen dışarıdaki for döngüsü için sadece satır sayısı, sütunlar arasında gezen içerideki for döngüsü için sadece sütun sayısı önemlidir. Bir dizinin bütün elemanlarının sayısını döndüren “Length” özelliği ise satır ve sütun kavramlarını gözetmediğinden for döngülerinde indeks sayısının taşması sonucu birçok hatanın ortaya çıkmasına yol açabiliyor. Bunun çözümü ise örneğimizde görebileceğimiz gibi, dizilerin getLength(boyut) fonksiyonu ile istediğimiz boyutun uzunluğunu for döngümüzün içerisinde kullanmak. Fakat boyutların da 0’dan başlayan bir indeksi var ve bu yüzden satırlar için getLength(0), sütunlar için getLength(1)  yazarak kullandık.</p>
<p><strong>Son Sözler</strong></p>
<p><strong> </strong>İkinci örneğimizin bir tablo gibi görünmesini ise içerideki for döngüsünden sonra bir satır atlayıp elemanları konsola yan yana yazdırarak sağladık. Özellikle çok boyutlu dizilerin kullanımına alışmak maalesef önceki eğitimlerimizin konularına göre daha zor. İç içe for döngülerinin yapısını anlamak özellikle ilk görüşte bunu başarmak gerçekten çok zor. Ancak uygulama geliştirirken gerçekten fazla kullanılan temel konular olduğu için dizilere hükmetmeye çalışmanızın ilerideki projelerimiz açısından çok faydalı olacağını düşünüyorum. Bu yüzden diziler ile ilgili örneklerimizi geliştirerek değişik uygulamalar tasarlamanızı tavsiye ederim.</p>
<p>p.s. Bu yazı Kasım 2008&#8242;de yayımlanmıştır.</p>
<p>Örnek Kod 1:</p>
<pre class="brush: c#; ">

//Örnek 1

//double tipinde elemanlar içeren dizimizi oluşturuyoruz.
double[] ornek = new double[100];

//Dizimizi 1-100 arası sayılar ile dolduruyoruz.

for (int i = 0; i &lt; ornek.Length; i++)

{

ornek[i] = i + 1;

}

//Bütün dizimizin elamanlarını ekranda gösteriyoruz.

for (int i = 0; i &lt; ornek.Length; i++)

{

Console.WriteLine(ornek[i]);

}

//Bütün elemanları 2&#039;ye bölüyoruz.

for (int i = 0; i &lt; ornek.Length; i++)

{

ornek[i] = ornek[i] / 2;

}

//Elemanların son değerini tekrar ekranda görüntülüyoruz.

for (int i = 0; i &lt; ornek.Length; i++)

{

Console.WriteLine(ornek[i]);

}
</pre>
<p><strong> </strong></p>
<p>Örnek Kod 2:</p>
<pre class="brush: c#; ">

//Örnek 2

double [,] ornek = new double[10,30];

for (int i = 0; i &lt; ornek.GetLength(0); i++)

{

for (int k = 0; k &lt; ornek.GetLength(1); k++)

{

ornek[i, k] = i;

}

}

for (int i = 0; i &lt; ornek.GetLength(0); i++)

{

for (int k = 0; k &lt; ornek.GetLength(1); k++)

{

Console.Write(ornek[i, k]);

}

Console.WriteLine(&quot;&quot;);

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/c-dersleri-5-diziler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 4: Döngü Yapilari</title>
		<link>http://www.yigitkiran.net/blog/2010/02/c-dersleri-4-dongu-yapilari/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/c-dersleri-4-dongu-yapilari/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 01:19:51 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersleri]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dersleri]]></category>
		<category><![CDATA[do]]></category>
		<category><![CDATA[dongu]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[program kontrolleri]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[while]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=170</guid>
		<description><![CDATA[Programlamanın temellerini oluşturan if/else kontrol yapısını önceki yazımızda incelemiştik. Buraya kadar öğrendiklerimizle artık yazdığımız programın istediğimiz akışı takip edebilmesini ve belirlediğimiz koşullara göre farklı işlemler yapabilmesini sağlayabiliriz. Ancak bu koşullar bazen gerçekten fazla olabilir ve biz aynı kodu birçok kez çalıştırmak zorunda kalabiliriz. Bunun yanında birden fazla yapılacak işlem olduğunda aynı kod bloğunu sürekli tekrar yazmak programcıların çok tercih ettiği bir yöntem değildir. Tekrar edilen kodlar yazdığınız programı ileride modifiye etmenizi zorlaştırırken, karışık bir görüntü oluşturarak kodların okunaklığını azaltır. Örneğin 30 kişilik bir sınıfın notlarını girdiğiniz ve size not ortalamasını çıkaran bir programda, kullanıcıdan her notu almak için kod tekrarı yapmamız oldukça büyük zaman kaybına neden olur.

Üstelik karekök hesaplayan algoritmalarda olduğu gibi bazı durumlarda yapmamız gereken işin ne zaman tamamlanacağını önceden kestirmemiz de imkansızdır. İşte bu tip uzun tekrarlar ya da iştediğimiz şart oluşana kadar aynı işlemin yapılmasını istediğimiz durumlarda döngüleri kullanıyoruz. Önceki yazılarımızda bahsettiğimiz gibi, normalde uygulamamız çalışırken kodlar yukarıdan aşağıya satır satır işlenir ve son satır işlendikten sonra program sonlandırılır. Bizim kullanacağımız döngüler ise süslü parantezler kullanarak oluşturduğumuz kod bloğunun, belirli bir koşul sağlanmışken sürekli kendini başa alarak tekrar işlenmesine imkan tanıyor. C# içerisinde farklı tip döngüler olsa da bunların hepsi barındırdığı koşul sağlandıkça içerisindeki kod bloğunu çalıştırırlar ve koşul yanlış olduğunda sonlanırlar. Şimdi isterseniz bu döngü tiplerinin kullanımını örnekler ile inceleyelim.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code-vortex.jpg" rel="lightbox[170]"><img class="aligncenter size-full wp-image-179" title="code-vortex" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code-vortex.jpg" alt="" width="320" height="320" /></a>Programlamanın temellerini oluşturan if/else kontrol yapısını önceki yazımızda incelemiştik. Buraya kadar öğrendiklerimizle artık yazdığımız programın istediğimiz akışı takip edebilmesini ve belirlediğimiz koşullara göre farklı işlemler yapabilmesini sağlayabiliriz. Ancak bu koşullar bazen gerçekten fazla olabilir ve biz aynı kodu birçok kez çalıştırmak zorunda kalabiliriz. Bunun yanında birden fazla yapılacak işlem olduğunda aynı kod bloğunu sürekli tekrar yazmak programcıların çok tercih ettiği bir yöntem değildir. Tekrar edilen kodlar yazdığınız programı ileride modifiye etmenizi zorlaştırırken, karışık bir görüntü oluşturarak kodların okunaklığını azaltır. Örneğin 30 kişilik bir sınıfın notlarını girdiğiniz ve size not ortalamasını çıkaran bir programda, kullanıcıdan her notu almak için kod tekrarı yapmamız oldukça büyük zaman kaybına neden olur.</p>
<p>Üstelik karekök hesaplayan algoritmalarda olduğu gibi bazı durumlarda yapmamız gereken işin ne zaman tamamlanacağını önceden kestirmemiz de imkansızdır. İşte bu tip uzun tekrarlar ya da iştediğimiz şart oluşana kadar aynı işlemin yapılmasını istediğimiz durumlarda döngüleri kullanıyoruz. Önceki yazılarımızda bahsettiğimiz gibi, normalde uygulamamız çalışırken kodlar yukarıdan aşağıya satır satır işlenir ve son satır işlendikten sonra program sonlandırılır. Bizim kullanacağımız döngüler ise süslü parantezler kullanarak oluşturduğumuz kod bloğunun, belirli bir koşul sağlanmışken sürekli kendini başa alarak tekrar işlenmesine imkan tanıyor. C# içerisinde farklı tip döngüler olsa da bunların hepsi barındırdığı koşul sağlandıkça içerisindeki kod bloğunu çalıştırırlar ve koşul yanlış olduğunda sonlanırlar. Şimdi isterseniz bu döngü tiplerinin kullanımını örnekler ile inceleyelim.<span id="more-170"></span></p>
<p><strong>While Döngüsü</strong></p>
<p>Türkçe’ye  “sırasında” veya “-iken” olarak çevirebileceğimiz “while” anahtar sözcüğü, while(koşul) {kod} biçiminde döngü yaratmamızı sağlar. While yanında bulunan parantezler içerisinde yazılan koşul doğru olduğu sürece koşul parantezlerinden sonra gelen süslü parantezler içerisindeki kod bloğunu çalıştırılır. Bu döngü tipinin çalışma biçimini kafanızda canlandırmanız için hemen gerçek hayattan bir örnek verebiliriz. Örneğin su dolu bir sürahiyi bir bardak kullanarak başka bir kaba boşaltmak istiyoruz. Burada yapacağımız iş, sürahiden su dökerek bardağı doldurmak, sonra bardak içerisindeki suyu kaba dökmek olacaktır. Programlama mantığında düşünecek olursak, “sürahide su bulunması”nı koşul olarak seçersek istediğimizi gerçekleştirebiliriz. Şimdi bir while döngüsü kuracak olursak; sürahide su bulunması koşulu doğru olduğu sürece, yapacağımız işi tekrarlamış olacağız. Başlangıçta sürahide su varsa, bardağı suyla doldurup kaba boşalttıktan sonra koşulumuz hala doğru mu diye sürahiye bakıyoruz. Eğer sürahide hala su varsa bardağı tekrar dolduruyoruz ve bu sürahide su kalmayana kadar böyle devam ediyor. Sanırım döngünün çalışma mantığını bu şekilde aklımızda tutabiliriz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim15.png" rel="lightbox[170]"><img class="aligncenter size-full wp-image-172" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim15.png" alt="" width="362" height="261" /></a>While ile oluşturduğumuz sayısal döngü kalıbı for döngülerinde geçerlidir.</p>
<p>İlk örneğimiz, önceden tanımladığımız “sayı” ismindeki bir değişkenin değerinin tek ya da çift sayı olduğunu bulan bir program. Burada while döngüsü içerisindeki kod bloğunda sayıdan sürekli 2 çıkarıyoruz. Koşulda yazdığımız tanım gereği sayı 1 veya 0’a eşitlenmedikçe buradaki kod bloğu çalışıyor ve çıkarma işlemlerine devam ediliyor. Sayı değişkenimiz bu 0 yada 1 değerine ulaşırsa artık koşul doğru olmayacağından döngü sonlandırılıyor, ardından yazdığımız if kontrolü ile kalan sayı eğer 1 ise sayının tek, 0 ise çift olduğunu belirliyoruz.</p>
<p>Belirli koşullar altında işlem yapan döngülerin diğer bir kullanımının da, biz programcıları uzun ve kendini tekrar eden kod yazmaktan kurtarması için olduğunu söylemiştik. Çok basit olarak ekrana bir yazıyı bin kere yazdırmak isterseniz bunu yapabilen bir kod oluşturmanız, kodu kopyalayıp yapıştırarak hazırlasanız bile çok uzun zamanınızı alabilir. İşte böyle durumlarda, bir sayaç değişkeni yardımıyla while döngüleri ile bir işlemin istediğimiz sayıda gerçekleşmesini sağlayabiliriz. İlk yapmamız gereken, int tipinde bir değişken oluşturmak. Bu değişkene döngüye girmeden önce bir sayı değeri atıyoruz, while döngüsünün kod bloğunun sonunda değerini değiştirerek, döngü koşulunda bu değeri kontrol ediyoruz ve bu şekilde işlemlerin istediğimiz kadar tekrar edebilmesini sağlıyoruz.</p>
<p>İkinci örneğimizde bu senaryoyu işleyen bir program yazdık. Sayac isimli int tipinde değişkenimize 0 değerini atıyoruz. While döngüsünün kod bloğunda ekrana yazı yazdıran satırda işlemi bitirdikten sonra, bu sayac değişkenimizin değerini bir artırıyoruz. Önceki yazılarımızdan hatırlayacak olursak, bir değişkenin sonuna eklenen ++ ifadesi, onun değerini bir arttırmak anlamına geliyor. Döngümüzün koşul bölümüne de, işlemin kaç kere tekrarlanacağını belirlediğimiz boolean (doğru ya da yanlış değer döndüren) ifadeyi yazıyoruz. Örneğimizde kullandığımız “sayac &lt; 1000” ifadesi sayac 1000’den küçük olduğu sürece doğru (true) değerinde dönecek ve yazıyı bin defa ekrana yazdırmamızı sağlayacak. Keşke ilkokulda öğretmenimizin verdiği tahta doluncaya kadar aynı cümleyi yazdığımız cezalar için de böyle bir sistem olabilseydi J.</p>
<p><strong>For Döngüsü </strong></p>
<p>Yukarda örneğini verdiğimiz, sayaç kullanarak oluşturduğumuz sayısal döngüler programlamada çok sık kullanılır. Bu nedenle bu döngü kalıbını daha hızlı bir şekilde oluşturmaya yarayan for döngü tipi türetilmiştir. Kullanım şekli for(sayac oluşturma; koşul; artırım değeri) {kod} şeklinde olan bu komut ile daha hızlı sayısal döngü oluşturabiliyor ve ileride değineceğimiz sonsuz döngü oluşturma gibi hataların önüne geçmiş oluyoruz.</p>
<p>Üçüncü örneğimizi inceleyecek olursak, for ifadesi yanındaki parantezin içerisinin noktalı virgül “;” karakteriyle 3 farklı bölüme ayrılmış olduğunu görebiliriz. Sayaç değişkenimizi burada oluştururken dikkat etmemiz gereken başındaki tip ifadesini (genelde int kullanılır) unutmamamız gerektiği. İkinci bölümde yazdığımız koşul, while döngüsündeki koşul parantezinde olduğu gibi döngünün hangi koşulda devam edeceğini belirliyor. Son bölümde ise artırım değerimizi yazıyoruz. Burada yine sayac++ gibi bir ifade yazarak koşuldaki değere birer birer ulaşmaya çalışacağımızı belirtiriz. Ancak sayac+=2 gibi farklı ifadelerle değeri artırmak veya azaltmak mümkündür. Döngüye dair bütün işlemleri bu parantez içerisinde hallettikten sonra süslü parantezler ile oluşturacağımız kod bloğunda yapmak istediğimz işlemi yazabiliriz.</p>
<p><strong>Sonsuz Döngü</strong></p>
<p>Buraya kadar döngülerin belirli bir koşul doğru olduğu sürece kod bloğunu tekrar çalıştırdığını gördük. Peki ya bu koşul hiçbir zaman yanlış çıkmazsa? İşte böyle durumlarda program kodlarında ilerlemek mümkün olmaz ve programımız olduğu yerde takılı kalır. Programın ilerlememesinin ötesinde, sürekli yeni bellek kullandığınız bir döngüde böyle bir durum gerçekleşirse bu programın belirli bir süre çalıştıktan sonra yanıt vermemesine hatta bilgisayarda çalışan diğer programları yavaşlatmasına kadar giden kötü sonuçlar doğurabilir. Yinede sonsuz ya da kısır döngü denilen bu tür döngüleri bir hata olarak nitelendiremeyiz, bu döngülerin kullanıcı arabirimleri ve ağ uygulamaları gibi birçok alanda işlevsel kullanımları bulunmaktadır.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim46.png" rel="lightbox[170]"><img class="aligncenter size-full wp-image-173" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim46.png" alt="" width="227" height="443" /></a>Döngüyü oluşrurken yapacağımız bir hata sonsuz döngüye sebep olabilir..</p>
<p>Ancak şu aşamada arka planda çalışmayan bir sonsuz döngü hazırladığımız uygulamaların takılmasına neden olacaktır ve çalışma zamanında ortaya çıktığı için Visual Studio tarafından uyarılmamız da söz konusu değil. Sonsuz döngülerin önüne geçebilmek için yazdığımız döngülerin koşul alanlarına oldukça dikkat etmeli, gerekirse sonsuz döngüye yol açabilecek farklı durumlar için ve (&amp;&amp;), veya (||) gibi bağlaçlardan yararlanarak koşulu genişletmeliyiz. Ayrıca bir sayaç değişkeni kullanarak hazırladığımız sayısal döngülerde, sayaç değişkenine başlangıç değerini yanlış atamak veya kod bloğunun sonunda bu değeri değiştirmeyi unutmakta uygulamanın sonsuz döngüye girmesine sebep olacaktır.</p>
<p>Dilerseniz sizde dördüncü örneğimizde olduğu gibi bir sayı sayan program yazarak sonsuz döngü kullanabilirsiniz. Burada dikkat etmeniz gereken while(true) ifadesinin sonsuz döngü oluşturmak için kullanılabileceğidir. Son bir hatırlatma yapmak gerekirse, sonsuz döngüye giren bir konsol uygulamasını Ctrl+C tuşlarına basarak kapatabilirsiniz.</p>
<p><strong>Döngülerden Acil Çıkış</strong></p>
<p>Birbirinden farklı birçok kullanım alanı olan döngüleri istersek kendimiz de sonlandırabiliriz. Örneğin bir listede bir elemanı aramak için bütün öğeleri bir döngü ile inceliyorsak, eğer bu elemanı liste bitmeden bulursak listenin kalanında arama işlemine devam etmek sadece zaman kaybı olacaktır. Ya da bir sayının karekökünü sırayla deneme yoluyla arıyorsak, sayıyı bulduğumuzda daha fazla sayı denememize gerek yoktur. İşte böyle durumlarda programın içinde bulunduğu döngüden çıkması için “break” anahtar sözcüğünü kullanabiliriz. Döngüyü sonlandırdığımızda, program döngü kod bloğunun bittiği yerden çalışmasına devam edecektir.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim54.png" rel="lightbox[170]"><img class="aligncenter size-full wp-image-174" title="Resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim54.png" alt="" width="308" height="200" /></a>Beşinci örneğin sonuç ekranı.</p>
<p>Beşinci örneğimizi incelersek, döngü koşuluna göre ekrana 100’e kadar sayı değerlerini yazması gerekirken, sayı değişkeni 10’a eşitlenince break komutuyla döngüyü sonlandırdığımız için uygulama sadece 0-10 arası sayıları ekranda gösterecektir.</p>
<p>Döngülerin çalışmasına müdahale eden diğer komutumuz ise Türkçe’de “devam etmek” anlamına gelen “continue”. Break kadar çok kullanılmayan bu anahtar sözcük, döngünün sadece mevcut iterasyonuna son vererek koşul hala doğruysa kod bloğunun baştan çalışmasını sağlar. Altıncı örneğimizde continue kullanarak 0-100 arası tek sayıları ekrana yazdırıyoruz. Kod bloğunun başında mevcut sayının çift sayı olduğunu kontrol ediyor, eğer çiftse iterasyonu continue ile sonlandırarak ekrana yazılmamasını sağlıyoruz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim62.png" rel="lightbox[170]"><img class="aligncenter size-full wp-image-175" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim62.png" alt="" width="296" height="359" /></a>continue kullanarak hazırladığımız örneğin sonuç ekranı.</p>
<p><strong>Do-While Döngüsü</strong></p>
<p>Son olarak bahsedeceğimiz döngü çeşidi ise Do-While. Bu  döngü biçiminin while döngüsünden tek farkı, ilk işlemi gerçekleştirmek için koşula bakmaması. Yani kod bloğu ilk seferde mutlaka çalıştırılır, ondan sonra yazılan koşul değerlendirilir ve eğer doğruysa kod bloğu tekrar baştan çalıştırılır. Yazılış biçimi ise do {kod} while(koşul) şeklindedir. Son örneğimizdeki uygulamamız ise basit bir şekilde kullanıcının ismini öğrenmek istiyor. Eğer kullanıcı ismini girmeden giriş tuşuna basarsa soru tekrarlanıyor ve kullanıcı isim girene kadar program devam etmiyor. Burada kullanıcıdan veri almak için Console.Readline() komutunu kullanıyoruz. Eğer kullanıcı herhangi bir isim yazmadan giriş tuşuna basarsa, “yazi” ismindeki string değişkenimiz boş bir değere sahip olacağı için, while yanındaki koşul doğru olacak ve program kod bloğunu tekrar çalıştıracaktır.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim7.png" rel="lightbox[170]"><img class="aligncenter size-full wp-image-176" title="Resim7" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim7.png" alt="" width="319" height="177" /></a>do-while kullanarak kullanıcıdan isim bilgisini istiyoruz.</p>
<p>Do-while döngüsüne de değindikten sonra C# ile temel programlama konusunda önemli bir aşama kaydetmiş bulunuyoruz. Son olarak, döngü içerisinde elde ettiğiniz değerler ile yeni işlemler gerçekleştirmek için birden fazla döngüyü iç içe kullanabilmenizin mümkün olduğunu da söyleyelim. Özellikle matris uygulamaları gibi birden fazla boyutu olan dizilerle ilgileneceğimiz ileriki yazılarımızda iç içe döngülerin kullanımı konusuna detaylı olarak değineceğiz. Farklı örneklerle anlatmaya çalıştığımız döngülere hakim olmanız programlama konusunda ilerlemeniz için gerçekten çok önemli. Bu yüzden verdiğimiz örnekleri kendi yaratıcılığınızla geliştirerek yeni örnekler oluşturmanızı kesinlikle tavsiye ederim. Bir sonraki yazıda görüşmek üzere :)</p>
<p>p.s. Bu yazı Ekim 2008&#8242;de yazılmıştır.</p>
<p>Örnek Kod 1:</p>
<pre class="brush: c#; ">

//örnek 1

int sayi = 876528;

while (sayi != 0 &amp;amp;&amp;amp; sayi != 1)

{

sayi = sayi - 2;

}

if (sayi == 1)

Console.WriteLine(&quot;Tek sayı.&quot;);

else

Console.WriteLine(&quot;Çift sayı.&quot;);
</pre>
<p>Örnek Kod 2:</p>
<pre class="brush: c#; ">

//örnek 2

int sayac = 0;

while (sayac &lt; 1000)

{

Console.WriteLine(&quot;While Döngüsü&quot;);

sayac++;

}
</pre>
<p>Örnek Kod 3:</p>
<pre class="brush: c#; ">

//örnek 3

for (int sayac = 0; sayac &lt; 1000; sayac++)

{

Console.WriteLine(&quot;For Döngüsü&quot;);

}
</pre>
<p>Örnek Kod 4:</p>
<pre class="brush: c#; ">

//örnek 4

int sayi = 0;

while (true)

{

Console.WriteLine(sayi++);

}
</pre>
<p>Örnek Kod 5:</p>
<pre class="brush: c#; ">

//örnek 5

for (int sayi = 0; sayi &lt; 100; sayi++ )

{

Console.WriteLine(sayi);

if (sayi == 10)

break;

}
</pre>
<p>Örnek Kod 6:</p>
<pre class="brush: c#; ">

//örnek 6

for (int sayi = 0; sayi &lt; 100; sayi++ )

{

if (sayi % 2 == 0)

continue;

Console.WriteLine(sayi);

}
</pre>
<p>Örnek Kod 7:</p>
<pre class="brush: c#; ">

//örnek 7

string yazi;

do

{

Console.WriteLine(&quot;İsim: &quot;);

yazi = Console.ReadLine();

}

while (yazi == &quot;&quot;);

Console.WriteLine(&quot;İsminiz: &quot; + yazi);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/c-dersleri-4-dongu-yapilari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 3: Program Kontrolleri</title>
		<link>http://www.yigitkiran.net/blog/2010/02/cdersleri-3-program-kontrolleri/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/cdersleri-3-program-kontrolleri/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 01:02:38 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersleri]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dersleri]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[program kontrolleri]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=153</guid>
		<description><![CDATA[C# dilinin yapıtaşlarından sayılan değişkenlere önceki yazımızda değinmiştik. Farklı kullanımlar için çeşitli tipleri bulunan değişkenleri inceledikten sonra, yazdığımız programın akışına yön verecek karar verme mekanizmalarından bahsetmenin zamanı geldi. Program kodları yorumlanmaya başladıktan sonra düz bir akışı takip ederek satır satır işlenirler. Ancak programın gerektirdiği bazı kararlar, girdiler ve mantıksal nedenlerden ötürü bu akışın dallara ayrılarak farklı yönlere gitmesini sağlamak isteyebiliriz. Bu durumda program yürütülürken önceki satırlara geri dönebilir veya ilerideki kod parçalarını çalıştırabilir.

Öncelikle şunu söylemek gerekir ki program akışının yön değiştirmesini sağlayan karar ve kontrol mekanizmaları olmasaydı, bilgisayarların pahalı bir metal yığınından farkı kalmazdı. Programların çeşitli koşullara göre farklı işlemler yapabilmesi, insanların gerçek hayatta farklı koşullar altında farklı davranışlar göstermesi gibidir. Gerçekleştireceği bir eylemde birçok seçenek arasından bulunduğu koşula uygun olanını seçerek tamamlamasına neden olur. Örneğin sabah uyandığınızda nasıl kıyafet seçtiğimizi düşünelim. Dolabımızda birçok çeşit kıyafet olabilir, ancak biz dışarıdaki hava durumuna bakıp karar verir, güneşli ve sıcak bir günde kazak ya da yağmurluk yerine ince bir t-shirt giymeyi tercih ederiz. Bilgisayar programları da amacı doğrultusunda değişik koşulları göz önünde bulundurarak çalışmasını sürdürür.

Karar verme mekanizmalarının çalışması, belli bir koşulun mantık değeri olarak doğru veya yanlış olarak değerlendirilmesiyle ilgili kod bloğunun işlenmesine dayanır. Mantıksal ifadelerin koşul içerisinde değerlendirilmesi, önceki yazımızda bahsettiğimiz mantıksal (boolean) değişkenler kullanılarak yapılır. Hatırlatmak gerekirse, doğru (true) veya yanlış (false) olabilen bu ifade türleri, koşullarını durumunu belirlemek için kullanılır. Bir ifadenin doğru veya yanlış olduğu, programcılar tarafından tanımlanan boolean değişkenler ile belirlenebildiği gibi, mantık öğeleri veya ilişkisel operatörler kullanılarak da belirlenebilir]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik2-e1266454579851.jpg" rel="lightbox[153]"><img class="aligncenter size-full wp-image-154" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik2-e1266454579851.jpg" alt="" width="480" height="360" /></a>C# dilinin yapıtaşlarından sayılan değişkenlere önceki yazımızda değinmiştik. Farklı kullanımlar için çeşitli tipleri bulunan değişkenleri inceledikten sonra, yazdığımız programın akışına yön verecek karar verme mekanizmalarından bahsetmenin zamanı geldi. Program kodları yorumlanmaya başladıktan sonra düz bir akışı takip ederek satır satır işlenirler. Ancak programın gerektirdiği bazı kararlar, girdiler ve mantıksal nedenlerden ötürü bu akışın dallara ayrılarak farklı yönlere gitmesini sağlamak isteyebiliriz. Bu durumda program yürütülürken önceki satırlara geri dönebilir veya ilerideki kod parçalarını çalıştırabilir.</p>
<p>Öncelikle şunu söylemek gerekir ki program akışının yön değiştirmesini sağlayan karar ve kontrol mekanizmaları olmasaydı, bilgisayarların pahalı bir metal yığınından farkı kalmazdı. Programların çeşitli koşullara göre farklı işlemler yapabilmesi, insanların gerçek hayatta farklı koşullar altında farklı davranışlar göstermesi gibidir. Gerçekleştireceği bir eylemde birçok seçenek arasından bulunduğu koşula uygun olanını seçerek tamamlamasına neden olur. Örneğin sabah uyandığınızda nasıl kıyafet seçtiğimizi düşünelim. Dolabımızda birçok çeşit kıyafet olabilir, ancak biz dışarıdaki hava durumuna bakıp karar verir, güneşli ve sıcak bir günde kazak ya da yağmurluk yerine ince bir t-shirt giymeyi tercih ederiz. Bilgisayar programları da amacı doğrultusunda değişik koşulları göz önünde bulundurarak çalışmasını sürdürür.</p>
<p>Karar verme mekanizmalarının çalışması, belli bir koşulun mantık değeri olarak doğru veya yanlış olarak değerlendirilmesiyle ilgili kod bloğunun işlenmesine dayanır. Mantıksal ifadelerin koşul içerisinde değerlendirilmesi, önceki yazımızda bahsettiğimiz mantıksal (boolean) değişkenler kullanılarak yapılır. Hatırlatmak gerekirse, doğru (true) veya yanlış (false) olabilen bu ifade türleri, koşullarını durumunu belirlemek için kullanılır. Bir ifadenin doğru veya yanlış olduğu, programcılar tarafından tanımlanan boolean değişkenler ile belirlenebildiği gibi, mantık öğeleri veya ilişkisel operatörler kullanılarak da belirlenebilir.<span id="more-153"></span></p>
<p><strong>Mantıksal İfadeler</strong></p>
<p>Belirli koşulların sağlanması için, sonucu doğru ya da yanlış olan ifadeler kullanırız. Bu ifadelerin doğru ya da yanlış olması ilişkisel operatörler ve mantık öğeleri ile belirlenir. İlişkisel operatörler rakam, harf gibi temel değişkenleri veya nesneleri karşılaştırmaya yarayan, karşılaşma sonucunda bir mantık değeri (true veya false) döndüren operatörlerdir. Tablo 1 de (yazının hemen altında) inceleyebileceğiniz bu operatörler, sağda yazılan değeri soldaki ile karşılaştırarak bir sonuç verirler. Bir değerin diğerine göre büyüklüğü veya eşit olması, program kontrollerinde ve ileride değineceğimiz iterasyon (yenileme) kontrolleri içerisinde sürekli kullanacağımız karşılaştırma yapılarıyla belirlenir.</p>
<p>Koşullar içerisinde birden fazla mantıksal ifade kullanmamız gerekebilir. Bu gibi durumlarda “VE operatörü” olan “&amp;&amp;” ile “VEYA operatörü” olan “||” kullanarak mantıksal değerleri bağlayabiliyoruz. Bir şartın gerçekleşebilmesi için bütün mantıksal değerlerin doğru olması gereken durumlarda VE operatörünü kullanarak bu doğruluğu sınayabiliriz. Şartlardan birinin doğru olması koşulun doğru olması için yeterli ise VEYA operatörü kullanarak bu koşulun doğru sonuç vermesini sağlayabiliriz. Ayrıca mantıksal bir değeri (boolean) tam tersine çevirmek için değil (NOT)  operatörü olan ünlem “!” işaretini ifadenin başına yazmamız yeterlidir. Örneğin iki sayı değişkeninin 10 ile 100 arasında olup olmadığını kontrol etmek istiyoruz. Bu durumda aşağıdaki gibi bir ifade kullanarak iki karşılaştırma ifadesiyle istediğimizi gerçekleştirebiliriz:</p>
<p>int sayi = 30;</p>
<p>Boolean sonuc = (sayi &gt; 10) &amp;&amp; (sayi &lt; 100);</p>
<p>Buradaki sonuç değişkeni, üst satırda girilen sayı değişkeninin hem 10’dan büyük hem de 100’den küçük olması koşulunun doğruluğunu bir arada arayacaktır. Bizlere boolean değer döndüren son mantıksal öğemiz ise, değişkenlerin türünü kontrol etmemize yarayan “is” anahtar sözcüğü. Diğer anlattığımız mantıksal ifadeler kadar çok kullanmayacağımız bu komut ile, tanımlı olan değişkenlerin hangi nesne türüne veya sınıfına dahil olduğunu anlayabiliriz. Küçük bir örnek vermek gerekirse:</p>
<p>int sayi = 30;<br />
Console.WriteLine(sayi is int);</p>
<p>şeklinde basit bir ifade yazarsak, “sayi” isimli değişken int tipinde olduğu için konsola doğru (True) değerini yazdırdığını görebiliriz.</p>
<p><strong>IF &amp; ELSE Kontrolleri</strong></p>
<p>Buraya kadar program kontrol elemanlarından bahsettikten sonra, sıra geldi bu kontrollerin nasıl yapıldığını görmeye. İngilizcede “eğer” anlamına gelen if kelimesi, birçok programlama dilinde olduğu gibi C# içerisinde de en çok kullanılan kontrol söz dizimi olarak karşımıza çıkıyor. Kullanımı if(koşul) şeklinde olan bu yapı, “eğer” parantez içerisindeki koşul doğru ise önünde bulunduğu kod bloğunu çalıştırıyor. Süslü parantezler ile oluşturduğumuz kod bloğu, eğer koşul sağlanamazsa es geçiliyor ve içerisindeki komut satırları çalıştırılmıyor. Hemen ilk örneğimize bakarsanız (Kod 1) burada tanımladığımız “hava” ismindeki string değişken, if içerisinde ilişkisel operatörler kullanılarak kontrol ediliyor ve eğer değeri koşul içinde belirtilen değere eşit ise altındaki kod bloğunun çalıştırılması sağlanıyor.</p>
<p>Oldukça basit hazırladığımız ilk örneğimizde değişkenimizin değeri koşul içerisinde belirtilen ile aynı olursa ekrana bir satır yazı yazdırıyoruz. <span style="color: #ff9900;">(Yazının altında örnek kodları bulabilirsiniz.)</span></p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc1.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-160" title="Sonuc1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc1.png" alt="" width="336" height="106" /></a></p>
<p>İkinci örneğimize bakacak olursak, birbirini tamamlayan iki if kontrolünün iç içe kullanıldığını görebiliriz. Dışarıdaki if, cinsiyet değişkenini kontrol ederken, içerideki if kontrolleri yaşın 18’in üzerinde olup olmadığını kontrol ediyor. Eğer üzerinde ise ilk if içerisindeki kod bloğu çalışıyor ve askere gitmek için uygun olduğunuz mesajını alıyorsunuz. Yaş değişkeninin 18’in altında olması durumda ise diğer kod bloğu içerisindeki komut satırı çalışıyor. Buradaki sorun, bizim farklı koşullar için farklı if kontrolleri yazarak gereksiz yere işlem yapıyor olmamız. Elinizde yapacak birden çok seçeneğiniz olduğunda, hepsi için bir if kontrolü yazmadan tek bir ifade ile bu koşulları değerlendirmemiz için, Türkçeye “aksi halde” olarak çevirebileceğimiz “else” komutu yardımımıza koşuyor.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc2.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-161" title="Sonuc2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc2.png" alt="" width="323" height="98" /></a></p>
<p>Kontrol ifadesinin koşulu olarak verdiğimiz boolean ifade yanlış (false) bir değer döndürdüğünde, yani aradığımız koşul olmadığında else ifadesinin ardından yazdığımız bir kod bloğunun çalıştırılması mümkün Üçüncü örneğimizde bir sayı değişkeninin % operatörüyle 2’ye bölümünden kalan sayıyı buluyoruz ve bu sayıyı 1’e eşitleyerek tek ya da çift sayı olduğunu belirliyoruz. Üstelik iki eylem için tek bir if kontrolü kullanarak işlem zamanını da azaltmış oluyoruz.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc3.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-162" title="Sonuc3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc3.png" alt="" width="319" height="83" /></a></p>
<p>Programımızda yapılan işlem sayısını azaltmak için birbiri ile ilişkili koşulları yine else komutu ile birbirine bağlamamız mümkün. Yazılan ilk if bölümünden sonra “eğer böyle değil ise” anlamında “else if(koşul)” yapısında kontrolü bir zincir halinde uzatmamız mümkün. Bu tür zincirlerde gerekli koşul sağlandığında zincirin alt elemanları değerlendirmeye alınmayacağından işlemden tasarruf edebiliyoruz. Lise yıllarımızdaki not sistemini hatırlayabildiğim kadarıyla dördüncü örneğimizde kullanmaya çalıştım. Burada not isimli bir sayı değişkeni ile not baremimizi bulmaya yarayan bir if zinciri oluşturduk. Mantıksal bağlayıcı VE operatörü (&amp;&amp;) ile not aralıklarını belirlediğimiz koşullar çalışacak kod bloğunu belirliyor ve buradaki yazının konsola yazılması sağlanıyor. Eğer not değeri else if ile oluşturduğumuz bloklara giremeyecek kadar düşük ise en sona yazdığımız else ifadesindeki kod çalışıyor.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc4.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-163" title="Sonuc4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc4.png" alt="" width="326" height="86" /></a></p>
<p>Kontrollerin işlem sayısını önemli ölçüde azaltan zincirleme koşullar yapısına değinmişken, bu yapıyı daha kolay bir biçimde kullanmamıza imkân veren switch yapısından da bahsedelim. Tek bir değişkeninize bağlı birden fazla koşul olduğu ve bu koşulların hepsinde bir eşitliğin arandığı durumlarda switch kontrolü yazdığınız kodu oldukça kısaltacaktır. Switch(değişken) yapısıyla koşulların bağlı olduğu değişkenin ismini alır ve süslü parantezler arasına değişkenin alabileceği değerler “case DEĞER:” şeklinde yeni bir durum olarak ifade edilir. Farklı değerler için yeni “case”ler oluşturmalı ve çalışacak kod bloğunu bu sefer süslü parantezler kullanmadan “case”lerin altına yazmalısınız. Süslü parantez olmadığı için gereken kodları yazdıktan sonra bitirdiğinizi en sona yazacağınız “break” komutu ile belirtiyoruz.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc5.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-164" title="Sonuc5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Sonuc5.png" alt="" width="328" height="89" /></a></p>
<p>Switch kullanarak her yeni durum (case) oluşturduğunuzda ilk dikkat etmeniz gereken, yazdığınız değerlerin türleri olacaktır. Tipi int olan bir değeri direkt yazabiliyorken, char tipler için tek tırnak (‘’), string tipindeki değerler için çift tırnak  (“”) kullanmamız gerektiğini unutmamalıyız. Son kod örneğimizi incelerseniz, burada string tipindeki il değerlerinin switch komutuyla eşini bulmasını sağlıyoruz. Öncelikle bahsetmemiz gereken, zincirleme else-if serilerinde verdiğiniz değer hiçbir koşula uymuyorsa geçerli olan koşulu belirlemek için en sona yazdığımız else ifadesi, switch yapısı içerisinde “default” anahtar sözcüğüyle aynen kullanılabiliyor. Kullanımı zorunlu olmayan default komutunu kullanırsanız, verdiğiniz değer mevcut “case”ler içerisinde bulunamazsa çalıştırılacak bölümü belirlemekte. Ayrıca aynı kod bloğuna birden fazla koşulda erişilebilmesi gibi durumlarda, birden fazla case başlığını üst üste yazarak kullanabilirsiniz. Bizde örneğimizde küçük harf ve büyük harf yazılan şehir isimleri de aynı değeri verdiği için bu tür bir yol izledik.</p>
<p>Bütün kontrol yapılarına değindikten sonra artık C# ile kendi kararlarını verebilen işlevsel programlar yazmaya başlayabileceğinizi rahatlıkla söyleyebiliriz. Mevcut örneklerimizi değiştirip geliştirerek ilk etapta denetimlerin nasıl çalıştığı konusunda tecrübe edinmenizi tavsiye ederim. İyi çalışmalar!</p>
<p>p.s. Bu makale Eylül 2008 tarihinde yazılmıştır.</p>
<p>Tablo 1:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="154">Karşılaştırma Türü</td>
<td width="154">Operatör</td>
<td width="154">Örnek</td>
<td width="154">Sonuç</td>
</tr>
<tr>
<td width="154">Eşittir</td>
<td width="154">==</td>
<td width="154">1 == 2</td>
<td width="154">Yanlış</td>
</tr>
<tr>
<td width="154">Eşit Değildir</td>
<td width="154">!=</td>
<td width="154">1 != 2</td>
<td width="154">Doğru</td>
</tr>
<tr>
<td width="154">Büyüktür</td>
<td width="154">&gt;</td>
<td width="154">1 &gt; 2</td>
<td width="154">Yanlış</td>
</tr>
<tr>
<td width="154">Küçüktür</td>
<td width="154">&lt;</td>
<td width="154">1 &lt; 2</td>
<td width="154">Doğru</td>
</tr>
<tr>
<td width="154">Büyük Eşittir</td>
<td width="154">&gt;=</td>
<td width="154">1 &gt;= 2</td>
<td width="154">Yanlış</td>
</tr>
<tr>
<td width="154">Küçük Eşittir</td>
<td width="154">&lt;=</td>
<td width="154">1 &lt;= 2</td>
<td width="154">Doğru</td>
</tr>
</tbody>
</table>
<p>Örnek Kod 1:</p>
<pre class="brush: c#; ">

static void Main(string[] args)

{

string hava = &quot;GÜNEŞLİ&quot;;

if (hava == &quot;GÜNEŞLİ&quot;)

{

Console.WriteLine(&quot;Bugün t-shirt giyeceğim.&quot;);

}

}
</pre>
<p>Örnek Kod 2:</p>
<pre class="brush: c#; ">

string cinsiyet = &quot;ERKEK&quot;;

int yas = 21;

if (cinsiyet == &quot;ERKEK&quot;)

{

if (yas &gt;= 18)

{

Console.WriteLine(&quot;Askere gitme vaktiniz gelmiş.&quot;);

}

if (yas &lt; 18)

{

Console.WriteLine(&quot;Askerlik için henüz erken.&quot;);

}

}
</pre>
<p>Örnek Kod 3:</p>
<pre class="brush: c#; ">

static void Main(string[] args)

{

int sayi = 30;

if (sayi % 2 == 1)

{

Console.WriteLine(&quot;Tek Sayı!&quot;);

}

else

{

Console.WriteLine(&quot;Çift Sayı!&quot;);

}

}
</pre>
<p>Örnek Kod 4:</p>
<pre class="brush: c#; ">

int not = 71;

if (not &lt;= 100 &amp;amp;&amp;amp; not &gt;= 85)

{

Console.WriteLine(&quot;5 Pekiyi&quot;);

}

else if (not &lt; 85 &amp;amp;&amp;amp; not &gt;= 70)

{

Console.WriteLine(&quot;4 İyi&quot;);

}

else if (not &lt; 70 &amp;amp;&amp;amp; not &gt;= 60)

{

Console.WriteLine(&quot;3 Orta&quot;);

}

else if (not &lt; 60 &amp;amp;&amp;amp; not &gt;= 50)

{

Console.WriteLine(&quot;2 Zayıf&quot;);

}

else

{

Console.WriteLine(&quot;1 Geçmez&quot;);

}
</pre>
<p>Örnek Kod 5:</p>
<pre class="brush: c#; ">

string il = &quot;İSTANBUL&quot;;

switch (il)

{

case &quot;ANKARA&quot;:

case &quot;ankara&quot;:

Console.WriteLine(&quot;Plaka: 06&quot;);

break;

case &quot;İSTANBUL&quot;:

case &quot;istanbul&quot;:

Console.WriteLine(&quot;Plaka: 34&quot;);

break;

case &quot;İZMİR&quot;:

case &quot;izmir&quot;:

Console.WriteLine(&quot;Plaka: 35&quot;);

break;

default:

Console.WriteLine(&quot;Hatalı giriş.&quot;);

break;

}
</pre>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Kod5.png" rel="lightbox[153]"><img class="aligncenter size-full wp-image-155" title="Kod5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Kod5.png" alt="" width="496" height="644" /></a>Kodlar tam olarak buna benzemeli! :))</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/cdersleri-3-program-kontrolleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 2: Programciliga Giris</title>
		<link>http://www.yigitkiran.net/blog/2010/02/cdersleri-2-programciliga-giris/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/cdersleri-2-programciliga-giris/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 09:01:26 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net 3.5]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersi]]></category>
		<category><![CDATA[c# eğitimi]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[cs]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[programlama]]></category>
		<category><![CDATA[programlamaya giris]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=138</guid>
		<description><![CDATA[Önceki yazımda C# dilinin temelinde yer alan .NET çatısının yapısını incelemiş, 2000’li yıllardan sonraki tarihi süreci sizlere aktarmıştım. Söz dizimi C/C++ dillerine benzeyen C# özellikle bu dillerden birini veya JAVA kullanmış deneyimli programcılar için alışması çok kolay bir dil. Bu sebeple daha önceden farklı dillerde program yazmış okurlarımız söz dizimine alıştıktan sonra .NET çatısının bizlere sunduğu kütüphaneleri kullanarak farklı uygulamalar geliştirmeye kolayca başlayabilirler. Ancak biz yazı dizimizde programlama dünyasına yeni adım atacak okurlarımızı da düşünerek sayfalarımızda programlama dilinin detaylarına da değinmeye çalışacağız.]]></description>
			<content:encoded><![CDATA[<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code-small.jpg" rel="lightbox[138]"><img class="aligncenter size-full wp-image-143" title="code small" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/code-small.jpg" alt="" width="520" height="390" /></a></p>
<p>Önceki yazımda C# dilinin temelinde yer alan .NET çatısının yapısını incelemiş, 2000’li yıllardan sonraki tarihi süreci sizlere aktarmıştım. Söz dizimi C/C++ dillerine benzeyen C# özellikle bu dillerden birini veya JAVA kullanmış deneyimli programcılar için alışması çok kolay bir dil. Bu sebeple daha önceden farklı dillerde program yazmış okurlarımız söz dizimine alıştıktan sonra .NET çatısının bizlere sunduğu kütüphaneleri kullanarak farklı uygulamalar geliştirmeye kolayca başlayabilirler. Ancak biz yazı dizimizde programlama dünyasına yeni adım atacak okurlarımızı da düşünerek sayfalarımızda programlama dilinin detaylarına da değinmeye çalışacağız.</p>
<p><span id="more-138"></span></p>
<p>İlerideki eğitimlerimizde Windows Forms uygulamaları geliştirerek grafik arayüze sahip (GUI &#8211; Graphical User Interface) programların C# kullanarak ne kadar kolay hazırlayabileceğimize şahit olacağız. Ancak bu safhaya gelmeden önce temel programlama içeriğini işlerken genelde konsol uygulamaları üzerinden örnekler geliştireceğiz. DOS işletim sistemine aşina okurlarımızı eski zamanlara götürecek bu tür uygulamalar Windows Komut İstemi altında çalışan temel projeler. Eğitimlerimizi takip edenlerin hatırlayacağı gibi, Visual Studio altında yeni proje oluştururken “Console Application”’u seçerek bu türde uygulama hazırlamaya başlayabiliriz. Uygulamamızı derlemeden önce Ctrl+F5 tuşlarına basarak çalıştırabiliyoruz. Geliştirme ortamımızı anlattıktan sonra C# ile program yazmaya hazırız demektir.</p>
<p>İlk yazımızda C#’ın bir süslü parantez ( { } )  dili olduğundan bahsetmiştik. Aslında söylemek istediğimiz bu parantezler arasında kod blokları oluşması, fonksiyon ve kontrollerin içerisindeki kodların yine bu parantezler arasında yer almasıdır. Bu kod blokları arasında gerçekleştireceğimiz bütün eylemlerin sonuna noktalı virgül “;” koyarak komutu tamamlamayı unutmamalıyız. Yazdığımız her program çalışmak için “Main” olarak isimlendirilen ana fonksiyona başvurur. Yeni proje açtığınızda oluşturulan Program.cs dosyası içerisindeki Main fonksiyonu altındaki kod bloğunun sahip olduğu süslü parantezler ( { } ) arasına hazırladığımız örnek kodları yazabilirsiniz. Bunun yanında, derleyici tarafından dikkate alınmayan, sadece not tutmak için kullanılan yorum satırları oluşturmak için tek satırlık // karakterlerini kullanabilir, ya da satır sınırlaması olmayan yorum bölümlerini /* ve */ arasına metin yazarak oluşturabilirisiniz.</p>
<p><strong>DEĞİŞKENLER</strong></p>
<p><strong> </strong>Matematik derslerinde denklemler ile hayatımıza giren değişken ifadesi, programlamada en çok kullandığımız yapıların başında geliyor. Belirli bir değeri bilgisayarın belleğinde (Random Access Memory &#8211; RAM) tutmak istediğimizde bir değişken tanımlıyor ve yeri geldiğinde tanımladığımız bu değişkenin değerini istediğimiz gibi değiştirebiliyoruz. Mantıksal, sayısal ve karaktersel değerler alan değişkenler için bellekte sabit bir yer ayrılmakta. Ancak bir değişken kullanıldığı yere göre daha az veya fazla bellek alanına ihtiyaç duyabilir. Örneğin bellekte tutulan sayısal değerleri düşünün. İkili sistem ile bellekte tutulan sayı değerleri, sayının büyüklüğüne göre farklı bellek alanı işgal edecektir. Bu durumda bir basamaklı bir sayı için en fazla 5 bitlik bir alan ayrılması yeterliyken, basamak sayısı arttıkça ihtiyaç duyulan bellek miktarı da artmakta. Eğer biz bir değişkende tek basamaklı bir sayı tutacaksak, o sayı için bellekte 32 bitlik bir alan ayırmamız halinde belleği etkin kullanmamış oluruz. Etkin bellek kullanımını sağlamak amacıyla programlama dilleri içerisinde farklı boyutlarda değişken türleri mevcuttur.</p>
<p>Tablo 1’de (yazının sonunda) görebileceğiniz değişken türleri arasında sayı değeri tutan tiplere bakacak olursanız “short” tipi bir değişken 16 bit olup en fazla 5 basamaklı bir sayı tutabilirken, “integer” 10, “long” 19 basamaklı sayılara kadar veri saklayabilir. Bu sayılar negatif değer alabiliyorken, işareti olmayan “unsigned” tipler sadece pozitif değer alabilmekte, böylelikle daha fazla basamaklı sayıları aynı miktarda bellek harcayarak tutabilmektedir (uint, ulong gibi). Sayılar konusunda diğer bir önemli nokta, ondalık değerlere dikkat etmenizin gerekmesi. Ondalık değerleri bellekte tutmak için, boyutları değişen “float” ve “double” tipi değişkenler kullanıyoruz.</p>
<p>Mantıksal değişkenler ise, sadece doğru (True)  ya da yanlış (False) değerini tutabilen 1-bit boyutunda veri tipleridir. Yine ortaöğrenim sırasında mantık derslerinden aşina olduğunuzu düşündüğüm bu yapılar, Boolean değişkenler olarak adlandırılır. Tutulan bu mantıksal değerler, program akışında gidilen yolu değiştiren koşullar içerisinde kullanılır. Diğer dillerden farklı olarak bu değişkenleri tanımlamak için kısaca “bool” yazıyoruz. Ayrıca true ve talse değerlerinin baş harflerinin küçük olması önemli.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim14.png" rel="lightbox[138]"><img class="aligncenter size-full wp-image-139" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim14.png" alt="" width="455" height="550" /></a> İlk örneğimizin kodları</p>
<p><strong>CHAR  vs. STRING</strong></p>
<p>Karakter tutan “char” veri tipi, C/C++ zamanından günümüzü yapısını bozmadan gelmeyi başarmış. Öncelikle sadece ikili tabanda sayı saklayabilen bilgisayar belleklerinin karakterleri nasıl hafızasında tutabildiğinden bahsedelim. Noktalama işaretleri, rakamlar ve harflerden oluşan karakter dizisi elemanları, ASCII kodu adı verilen bir sayıya eşitlenmiştir. Büyük ve küçük harfler için farklı olmak üzere bütün bu elemanların <a href="http://en.wikipedia.org/wiki/Ascii_table">http://en.wikipedia.org/wiki/Ascii_table</a> adresinde inceleyebileceğiniz gibi bir sayı değeri vardır. İşte char veri tipi, programcının kendine atadığı bir karakteri bu sayı değerine eşitleyerek bellekte saklar. Burada programcı olarak sizin yapmanız gereken, kod içerisinde tanımladığınız değişkenin karakter olduğunu belirtmek için onu tek tırnak ( ‘’ ) içerisine almanız.</p>
<p>Ancak tek karakterin bellekte saklanması her zaman sizin için yeterli değildir. Bir kelime ya da cümleyi değişken içerisinde saklamak istediğinizde eski programlama dillerinde karakter dizileri oluşturmanız gerekmekteydi. Ancak C# gibi yeni nesil programlama dillerinde bu işi string adı verilen ikincil değişken tipleri kendiliğinden yapıyorlar. Böylelikle belirli bir metni tırnak işaretleri (“”) arasına yazarak değişken içerisinde saklayabiliyorsunuz. Aklınıza bu metin içerisinde tırnak işareti kullanmak geldiyse, onun için kaçış işlemi uygulamanız gerekmekte. String değişkenlerine özgü bu işlemde kullanmanız sakıncalı olan karakterlerin başına “\” işareti koyarak metnin içerisinde bulunmasını sağlayabilirsiniz. Mevcut kaçış işlemlerinin yapılabildiği karakterler: ‘ (tek tırnak), “(çirt tırnak), \(ters eğik çizgi), n (yeni satır), t (sekme). Aslında birçok char değişkeninin birleşiminden oluşan string, değişken gibi kullanılsa da bir veri yapısından ibarettir. Bu yüzden string değişkenlerinin bellekte kaplayacağı sabit bir boyut bulunmaz.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim24.png" rel="lightbox[138]"><img class="aligncenter size-full wp-image-140" title="Resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim24.png" alt="" width="336" height="174" /></a> İlk programımızı çalıştırdık.</p>
<p><strong>OPERATOR KULLANIMI</strong></p>
<p>Farklı değişken tiplerini anlattıktan sonra, bu değişkenleri kod içerisinde nasıl kullanacağımızdan bahsetmemiz gerek. Tablo 2 içerisinde gördüğünüz programımızda farklı değişken tipleri tanımladık ve bu değişkenleri  Console.WriteLine() fonksiyonunu kullanarak konsolda yazdırıyoruz. Bu programı incelersek, önce kullanacağımız değişkenin tipini yazıyor, sonra ona bir isim veriyoruz.  Bu andan itibaren program kodunun içerisinde bu ismi kullanarak değişkeni çağırmamız mümkün. Değişkenlere değer atamak için eşittir “=” karakterini kullanıyoruz. Bir değişkene değerini onu tanımladığınız satırda ya da farklı bir satır içerisinde atayabilirsiniz, istediğiniz yerde değiştirebilirsiniz.</p>
<p>Eğer tipleri aynı ise, bir değişkenin değerini başka bir değişkene atamanız mümkün.  Ancak sayısal değişkenlerde işler biraz karışıyor;  bellekte kapladığı alandan daha büyük boyuta sahip olanların atamasına izin verilmiyor. Yani bir int değerini long’a atayabilirsiniz, ancak bunun tersi mümkün değil. Bu atamalar sırasında aritmetik işlemler yapmaya ihtiyaç duyduğunuzda C# operatörleri yardımınıza yetişecektir. Tablo 3 içerisinde görebileceğiniz örneğimizdeki gibi kullanabileceğiniz toplama (+), çıkarma (-), çarpma (*), bölme (/) ve mod (%) operatörleri ile değişkenleri ve rakamları sayısal işlemlere tabi tutabilirsiniz. Bunun dışında + operatörünü string ifadeleri birleştirmek için de kullanabiliyorsunuz. Aritmetik işlemler arasında bir sıra olması gerektiğinde işlem içinde parantezler kullanabiliriniz. Matematik kurallarından bildiğimiz gibi, parantez olmadığı zaman önce / ve * operatörleri, daha sonra + ve – operatörleri işletilir.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim35.png" rel="lightbox[138]"><img class="aligncenter size-full wp-image-141" title="Resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim35.png" alt="" width="328" height="140" /></a> Bu örneğimizde değer ataması yaparken operatörleri kullanıyoruz.</p>
<p><strong>İSİMLENDİRME SANATI</strong></p>
<p>Değişkenlere vereceğiniz isim konusunda özgür olmakla beraber, kod uzadıkça kafanızın karışmaması ya da yıllar sonra koda baktığınızda neler olup bittiğini anlayabilmeniz için anlaşılır isimler seçmenizi tavsiye ederim. Özellikle başka insanların da yazılan kodu çözebilmesi için yorumlara önem vermek, fonksiyon ve değişken isimlerini anlaşılır yapmak oldukça önemlidir. Bu konuda her programcının kendine özgü bir stili olsa da, kelimelerin baş harfini büyük yapmak (ör: int piSayisi; ) ya da alt çizgi kullanmak (pi_sayisi) gibi bir yöntem benimsemeniz iyi olacaktır. Bunların dışında Türkçe karakter kullanmaktan ve rakam ile başlayan değişken isimlerinden kaçının.</p>
<p>Hazır değişken tiplerini anlatmışken, C# 3.0 sürümü ile birlikte gelen bir yenilikten bahsetmeden geçmeyelim. Yeni sürüm beraberinde tip ayrımı gözetmeyen ortak bir değişken getiriyor. Tablo 4’te ki örnekte görebileceğiniz üzere “var” anahtar sözcüğü ile tanımlanan değişkenler, atanan ilk değerin tipine dönüşerek program içerisinde kullanılıyorlar. Özellikle farklı tipte verilerin gelebildiği veritabanı uygulamaları için kullanışlı bir özellik olduğunu söyleyebiliriz. Değişken ve operatörlere ait eğitimimizi burada bitirirken, yaptığımız örnekleri deneyip değişik varyasyonlar deneyerek çalışmanızı tavsiye ederim.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim44.png" rel="lightbox[138]"><img class="aligncenter size-full wp-image-142" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim44.png" alt="" width="337" height="154" /></a> Ortak veri tipi ile değişkenlerinizin tipi ilk değer atamasında belirlenir.</p>
<p>Tablo 1:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="98"><strong>Değişken Tipi</strong></td>
<td width="98"><strong>Boyut</strong></td>
</tr>
<tr>
<td width="98">sbyte</td>
<td width="98">8-bit (1-byte)</td>
</tr>
<tr>
<td width="98">short</td>
<td width="98">16-bit (2-byte)</td>
</tr>
<tr>
<td width="98">int</td>
<td width="98">32-bit (4-byte)</td>
</tr>
<tr>
<td width="98">long</td>
<td width="98">64-bit (8-byte)</td>
</tr>
<tr>
<td width="98">byte</td>
<td width="98">8-bit (1-byte)</td>
</tr>
<tr>
<td width="98">ushort</td>
<td width="98">16-bit (2-byte)</td>
</tr>
<tr>
<td width="98">uint</td>
<td width="98">32-bit (4-byte)</td>
</tr>
<tr>
<td width="98">ulong</td>
<td width="98">64-bit (8-byte)</td>
</tr>
<tr>
<td width="98">decimal</td>
<td width="98">128-bit (16-byte)</td>
</tr>
<tr>
<td width="98">float</td>
<td width="98">32-bit (4-byte)</td>
</tr>
<tr>
<td width="98">double</td>
<td width="98">64-bit (8-byte)</td>
</tr>
<tr>
<td width="98">object</td>
<td width="98">sınırsız</td>
</tr>
<tr>
<td width="98">bool</td>
<td width="98">8-bit (1-byte)</td>
</tr>
<tr>
<td width="98">char</td>
<td width="98">16-bit (2-byte)</td>
</tr>
<tr>
<td width="98">string</td>
<td width="98">sınırsız</td>
</tr>
</tbody>
</table>
<p>Tablo 2:</p>
<pre class="brush: c#; ">

static void Main(string[] args)

{

//Tek satır yorum

/* Çoklu satır yorum */

int sayi1;

sayi1 = 1;

int sayi2 = 10;

Console.WriteLine(sayi1);

Console.WriteLine(sayi2);

double sayi3 = 10.5;

double sayi4 = sayi3;

Console.WriteLine(sayi3);

Console.WriteLine(sayi4);

bool b = true;

Console.WriteLine(b);

string isim1;

isim1 = &quot;Merhaba, &quot;;

string isim2 = &quot;PC Magazine&quot;;

Console.WriteLine(isim1);

Console.WriteLine(isim2);

isim2 = &quot;yigit&quot;;

Console.WriteLine(&quot;yeni isim: &quot; + isim2);

}
</pre>
<p>Tablo 3:</p>
<pre class="brush: c#; ">

static void Main(string[] args)

{

int a = 5;

int b = 10;

int c = ((a * 2 - 2) - 1) + ((b * 3) % 5) / 3 ;

Console.WriteLine(c);

string s1 = &quot;PC Magazine.&quot;;

string s2 = &quot;Merhaba, &quot;;

string s3 = s2 + s1;

Console.WriteLine(s3);

Console.WriteLine(&quot;Yigit\n\n\nKiran&quot;);

}
</pre>
<p>Tablo 4:</p>
<pre class="brush: c#; ">

static void Main(string[] args)

{

var metin = &quot;Merhaba, PC Magazine&quot;;

var sayi = 4;

var ondalikSayi = 4.5;

var boolean = true;

Console.WriteLine(metin);

Console.WriteLine(sayi);

Console.WriteLine(ondalikSayi);

Console.WriteLine(boolean);

}
</pre>
<p>p.s. Bu yazı Ağustos 2008 PC Magazine dergisindeki makalemden derlenmiştir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/cdersleri-2-programciliga-giris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Dersleri &#8211; 1: .Net Framework</title>
		<link>http://www.yigitkiran.net/blog/2010/02/c-dersleri-1-net-framework/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/c-dersleri-1-net-framework/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 21:00:26 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[c# dersi]]></category>
		<category><![CDATA[c# egitim]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[cs]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[dot]]></category>
		<category><![CDATA[egitim]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[hello world]]></category>
		<category><![CDATA[sharp]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=122</guid>
		<description><![CDATA[Bill Gates, yaklaşık 20 yıl önce vizyonunu açıkladığında sektörün içinden ve dışından birçok insanın tepkisiyle karşılaşmıştı. Her eve bir bilgisayar gireceği ve kişisel bilgisayarların insan hayatında çok önemli bir yere sahip olacağını söyleyen bu genç girişimcinin sözleri, laptop bilgisayarların yaklaşık 1.5 ton civarı olduğu o yıllarda (!) fazla gerçekçi durmuyordu. Ancak geçen zaman, özellikle 90’lı yıllarda kişisel bilgisayarların atağa geçmesi, bu vizyonun ne kadar gerçekçi olduğunu ortaya koydu. Microsoft’un Windows işletim sistemleriyle katkıda bulunduğu bu vizyon, 2000’li yıllara gelindiğinde artık her evde birden fazla bilgisayar görülmeye başlanınca miyadını doldurmuş oldu. Kişisel bilgisayarların yayılması internetin kullanımını da arttırırken bilgi çağının başlangıcına da öncülük ettiler. Yeni milenyuma girdiğimizde artık internet hayatımızın bir parçası haline geldi ve bu gelişmeler esnasında, 2002 yılında gerçekleştirilen Microsoft’un lansmanında artık başarısını kanıtlayarak genç girişimci yıllarını geride bırakmış Gates kendisinin ve firmasının yeni vizyonunu açıkladı: Her zaman, her yerden, her cihazdan bilgiye ulaşmak! Kişisel bilgisayarların yayılmasında Windows işletim sistemleri büyük pay sahibi olarak karşımıza çıkarken, lansmanda bu yeni vizyonu gerçekleştirmek için daha dinamik bir altyapı bizleri karşılıyordu: “.NET”.

Bu yeni vizyon, beraberinde yepyeni bir programlama dilini birlikte getirdi. Okunuşunun kolay olmadığını kabul ediyorum, ancak C# (C Sharp: §İ - ∫a¦rp)  adını duyurduktan kısa bir süre sonra dünyada en çok kullanılan diller arasına girmeyi başardı. En köklü programlama dillerinden C/C++ yada Java gibi “süslü parantez” dilleri ailesinden gelen söz dizimi (syntax), nesne &#038; bileşen tabanlı yapısı ve Visual Studio gibi başarılı bir geliştirme ortamında yazılması kolay öğrenilmesine neden oldu. Ayrıca ASP.NET ile web tabanlı uygulama geliştirmek için de kullanılması kolayca yayılmasını sağladı. Geliştirme ekibinin başında bulunan Anders Hejlsberg, zamanında Turbo Pascal gibi devrim yaratmış bir IDE’nin geliştiricisi ve Borland firmasında programlama dilleri üzerine uzun yıllar çalışmış biri olarak 1999 yılında çalışmalarına başladığı C#’ı birçok dilin avantajlarına sahip kapsamlı bir dil olarak geliştirdi. Günümüzde Java ve PHP ile kullanımı yükselen 3 dil arasında bulunan C# aslında bu dillerin en yenisi. Ülkemizdeki bilgisayar sektöründe de geniş kullanım alanı bulunan bu dili blogdaki yazılardan takip ederek, en başından başlayıp öğrenebilirsiniz! Eğitimimizde temel programcılık mantığını anlatırken bol bol örnek uygulamalar yapıp kendinizi geliştirmenize yardımcı olmayı amaçlıyoruz.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik1-e1266353590731.jpg" rel="lightbox[122]"><img class="aligncenter size-full wp-image-123" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik1-e1266353590731.jpg" alt="" width="490" height="368" /></a></p>
<p>Bill Gates, yaklaşık 20 yıl önce vizyonunu açıkladığında sektörün içinden ve dışından birçok insanın tepkisiyle karşılaşmıştı. Her eve bir bilgisayar gireceği ve kişisel bilgisayarların insan hayatında çok önemli bir yere sahip olacağını söyleyen bu genç girişimcinin sözleri, laptop bilgisayarların yaklaşık 1.5 ton civarı olduğu o yıllarda (!) fazla gerçekçi durmuyordu. Ancak geçen zaman, özellikle 90’lı yıllarda kişisel bilgisayarların atağa geçmesi, bu vizyonun ne kadar gerçekçi olduğunu ortaya koydu. Microsoft’un Windows işletim sistemleriyle katkıda bulunduğu bu vizyon, 2000’li yıllara gelindiğinde artık her evde birden fazla bilgisayar görülmeye başlanınca miyadını doldurmuş oldu. Kişisel bilgisayarların yayılması internetin kullanımını da arttırırken bilgi çağının başlangıcına da öncülük ettiler. Yeni milenyuma girdiğimizde artık internet hayatımızın bir parçası haline geldi ve bu gelişmeler esnasında, 2002 yılında gerçekleştirilen Microsoft’un lansmanında artık başarısını kanıtlayarak genç girişimci yıllarını geride bırakmış Gates kendisinin ve firmasının yeni vizyonunu açıkladı: Her zaman, her yerden, her cihazdan bilgiye ulaşmak! Kişisel bilgisayarların yayılmasında Windows işletim sistemleri büyük pay sahibi olarak karşımıza çıkarken, lansmanda bu yeni vizyonu gerçekleştirmek için daha dinamik bir altyapı bizleri karşılıyordu: “.NET”.</p>
<p>Bu yeni vizyon, beraberinde yepyeni bir programlama dilini birlikte getirdi. Okunuşunun kolay olmadığını kabul ediyorum, ancak C# (C Sharp: <em>§İ &#8211; ∫a¦rp</em>)  adını duyurduktan kısa bir süre sonra dünyada en çok kullanılan diller arasına girmeyi başardı. En köklü programlama dillerinden C/C++ yada Java gibi “süslü parantez” dilleri ailesinden gelen söz dizimi (syntax), nesne &amp; bileşen tabanlı yapısı ve Visual Studio gibi başarılı bir geliştirme ortamında yazılması kolay öğrenilmesine neden oldu. Ayrıca ASP.NET ile web tabanlı uygulama geliştirmek için de kullanılması kolayca yayılmasını sağladı. Geliştirme ekibinin başında bulunan Anders Hejlsberg, zamanında Turbo Pascal gibi devrim yaratmış bir IDE’nin geliştiricisi ve Borland firmasında programlama dilleri üzerine uzun yıllar çalışmış biri olarak 1999 yılında çalışmalarına başladığı C#’ı birçok dilin avantajlarına sahip kapsamlı bir dil olarak geliştirdi. Günümüzde Java ve PHP ile kullanımı yükselen 3 dil arasında bulunan C# aslında bu dillerin en yenisi. Ülkemizdeki bilgisayar sektöründe de geniş kullanım alanı bulunan bu dili blogdaki yazılardan takip ederek, en başından başlayıp öğrenebilirsiniz! Eğitimimizde temel programcılık mantığını anlatırken bol bol örnek uygulamalar yapıp kendinizi geliştirmenize yardımcı olmayı amaçlıyoruz.<span id="more-122"></span></p>
<div id="attachment_130" class="wp-caption aligncenter" style="width: 281px"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/big.png" rel="lightbox[122]"><img class="size-full wp-image-130" title="big" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/big.png" alt="" width="271" height="100" /></a><p class="wp-caption-text">.NET yeni logosu</p></div>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim6.jpg" rel="lightbox[122]"><img class="aligncenter size-full wp-image-129" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim6.jpg" alt="" width="400" height="300" /></a><br />
Danimarkalı mühendis Anders Hejlsberg C# geliştirme ekibinin başında <strong> </strong></p>
<p>Bu ayki konumuz, programcılığa başlmadan önce biraz ısınmak; C# uygulamalarını üzerinde geliştireceğimiz .NET Framework’ün yapısını ve amaçlarını sizlere aktarmak. Bütün programlarımızın temelinde yer alacak bu altyapının çalışma tarzı diğer dillerin çalışma biçiminden farklı olduğu için basit mantığını anlamak gerçekten önemli. Yukarıda .NET’i dinamik bir altyapı olarak nitelendirmemizin başlıca nedeni, birden çok platformda çalışarak bu platformları birbirine bağlayacak olan bir çatı’ya (framework) sahip olması. Katmanlı yapıda olan bu çatı, çeşitli ihtiyaçlara cevap vermek üzere hazırlanmış birçok hizmeti içeren sınıf kütüphanelerini programcıların hizmetine sunarak, eskiden çok uzun zaman alan birçok işlevin yönetilebilir (managed) kodlar sayesinde kolayca uygulama içerisinde kullanılmasına imkan veriyor. C# eğitimlerinde sık sık kullanacağımız bu kütüphanelerin detaylarına girmeden önce .NET Framework felsefesini ve çalışma şeklini inceleyelim.</p>
<p><strong>.NET Framework’ün Yetenekleri</strong></p>
<p>Bilgiye her yerden ulaşabilmek için .NET Framework, uygulamalarının platform bağımsız çalışmasını amaçlar. Yazdığınız uygulama Windows, Linux gibi farklı işletim sistemleri altında bir değişiklik yapmanıza gerek kalmadan çalışabildiği gibi, PDA, Smartphone, XBOX yada akıllı ev araçları (embedded donanımlar) gibi farklı istemciler ile kolayca iletişim kurabilmeli ve belirli bir çözümün içerisinde yer alabilmelidirler. Hazır gelen sınıflar arasında bulunan temel kütüphanelerin yanı sıra, güvenlik, ağ, veritabanı erişimi gibi özelleşmiş alanlardaki kütüphaneler bizlere uygulama geliştirmek için önemli zaman tasarrufu sağlar. Örneğin bir XML dökümanını okumak için temel sınıf kütüphanesinden ilgili sınıfı çağırıp, birkaç satır kod yazarak istediğimiz işlevi yerine getirebiliriz. Bu şekilde hazır kod kullanımı, ilk zamanlarda herşeyi kendi elleriyle yazmayı seven eski programcılar tarafından yadırgansada, karmaşık uygulamaların yükünü hafifleterek daha büyük uygulamalar geliştirmek için bizlere büyük bir fırsat sunuyor.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim43.png" rel="lightbox[122]"><img class="aligncenter size-full wp-image-127" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim43.png" alt="" width="530" height="350" /></a><br />
Temel Sınıf Kütüphanesinin içeriği<strong> </strong></p>
<p>.NET Framework’ün ilk versiyonundan itibaren hayatımıza giren C#, bu yeni altyapıyı en rahat biçimde kullanabilmek için tasarlandı, ancak .NET üzerinde uygulama geliştirmenin tek yolu değil! Sevdiği programlama dilinden vazgeçmek istemeyen programcılar için VB, C++, Delphi, Java gibi tanıdık dillerden ADA, Eiffel, Scheme gibi farklı 40’tan fazla dil destekleniyor (desteklenen dillerin listesine buradan ulaşabilirsiniz: <a href="http://en.wikipedia.org/wiki/CLI_Languages">http://en.wikipedia.org/wiki/CLI_Languages</a>). Bütün bu diller, ortak aradile çevrilerek bir sanal çalışma zamanı uygulaması tarafından işlenerek çalıştırılıyorlar.</p>
<p>Farklı platformlar üzerinde çalışan CLR (Common Language Runtime) uygulaması, farklı dillerden çevrilmiş ortak aradili (CIL) Just-In-Time compiler adı verilen eşzamanlı derleyici ile bulunduğu platformun diline çevirir. Bu sayede aynı kodun farklı platformlar üzerinde çalışması sağlanırken, farklı dillerin kullanımına imkan tanınıyor. Bunun yanında çalışan kodun güvenliği, bellek yönetimi, hata denetimi, uyumluluk ve birlikte çalıştırılabilmesi gibi zorlu görevler CLR tarafından denetlenerek uygulamanın stabil çalışması, performansı ve güvenliği üst seviyede tutuluyor. Üstelik önceden yazılımcının sorumluluğunda bulunan bu işlevler artık otomatik olarak kontrol edilerek zamandan tasarruf ediliyor ve hatalar en aza indirgeniyor.</p>
<p>Platform bağımlı sistemlerden kodlar derlendikten sonra ortaya yürütülebilir bir dosya (.exe uzantılı) çıkmasını ve işletim sisteminin direk bu dosyayı çalıştırabilmesine alışığız. Ancak çalışma prensibini yukarıda anlattığımız .NET Framework CLR servisi, bir sanal makine gibi çalışarak, .NET uygulamaları ve işletim sistemi arasında iletişimi sağlıyor. Uygulamalar bu sanal makinede derlenerek bulunduğu platformun anlayacağı kodlara çevriliyorlar. Aslında .NET üzerinde geliştirdiğimiz programları yayınladıktan sonras yine .exe uzantılı bir dosya elde ediyoruz, fakat bu diğer yürütülebilir dosyalar gibi makine dili içermiyor. Assembly olarak adlandırılan bu dosya türleri, ortak dile çevrilmiş kod, doğrulama, güvenlik, referans ve yansıma bilgilerini içinde bulunduran özel bir yapıya sahiptir. Bu yüzden programlar çalışmak için .NET Framework’ün bilgisayarda yüklü olmasına ihtiyaç duyuyorlar (indirmek için: <a href="http://msdn.microsoft.com/en-us/netframework/aa569263.aspx">http://msdn.microsoft.com/en-us/netframework/aa569263.aspx</a>).</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim53.png" rel="lightbox[122]"><img class="aligncenter size-medium wp-image-128" title="Resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim53-300x253.png" alt="" width="300" height="253" /></a><br />
C# ile farklı platformlara yazılım geliştirmek mümkün.<strong> </strong></p>
<p><strong>.NET Çalışma Ortamı</strong></p>
<p><strong> </strong>Farklı diller için hazırlanmış birçok ortamda uygulama geliştirmek mümkün olsa da, MS Visual Studio kullanarak C#, VB.NET, C++ ile windows forms, konsol, mobil uygulamalar geliştirebilir, ASP.NET web siteleri, web servisleri gibi bir çok değişik projede çalışabilirsiniz. Bütün bu uygulamaları ve daha fazlasını bünyesinde barındıran Visual Studio ücretli bir uygulama olsa da, özelleşmiş Express versiyonları tamamen ücretsiz. Biz eğitimimizde C# ile çalışacağımız için VS 2008 C# Express Edition’u (<a href="http://www.microsoft.com/express/vcsharp/">http://www.microsoft.com/express/vcsharp/</a>) kullanacağız. Veritabanı ve web servisleriyle çalışabilme desteği olan, IntelliSense adı verilen otomatik kod tamamlayıcı yardımcıları bünyesinde bulunduran bu program eğitimimiz boyunca yoldaşımız olacak J.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim13.png" rel="lightbox[122]"><img class="aligncenter size-medium wp-image-124" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim13-300x294.png" alt="" width="300" height="294" /></a><br />
.NET Framework sürümlerinin içerikleri<strong> </strong></p>
<p><strong> </strong></p>
<p>Kabul etmek gerekir ki, .NET Framework’ün 2002 yılında çıkan ilk versiyonunda herşey bu kadar parlak değildi. Altyapıda bulunan hatalar ve performans problemleri, uygulamaların temelini zayıflattığı için birçok soruna neden oluyordu. Ancak Microsoft çalışanları bir yıl boyunca özverili bir çalışma gösterip birçok açığı kapattı ve stabil 1.1 sürümünü yayınladılar. Daha sonra 2005 yılında 2.0 sürümü hatalarından iyice arınmış, generics, 64 bit uyumluluğu, ADO.NET 2.0, ASP.NET 2.0 gibi yeniliklerle karşımıza çıktı. Windows Vista ile birlikte gelen 3.0 versiyonunda ayrıntılarına ileride değineceğimiz WPF, WCF, WF gibi iletişim, görsellik, iş akışları ve erişim üzerine eklentiler dahil edilirken; geçtiğimiz aylarda çıkan en son 3.5 sürümü LINQ ve AJAX desteği ile yayınlandı. Özellikle 3.0 sürümünden sonra eski versiyonlarla geri uyumluluk tamamen sağlanırken, Windows 98, 2000 ve ME işletim sistemlerine verilen desteğe son verildi.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim23.png" rel="lightbox[122]"><img class="aligncenter size-medium wp-image-125" title="Resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim23-300x229.png" alt="" width="300" height="229" /></a><br />
Visual Studio 2008 C# Express açılış ekranı<strong> </strong></p>
<p><strong>Merhaba Dünya!</strong></p>
<p><strong> </strong>Ne yazık ki uygulama geliştirme araçlarının Türkçe desteği bulunmaması, bazı okurlarımızın sorunlarını çözebilmek için daha çok çaba sarfetmesini gerektiriyor. Kullanacağımız Visual Studio 2008 C# Express Edition’un kurulum aşamasında size MSDN Express ve SQL Server Express programlarını kurmanızın da faydalı olabileceği hatırlatılıyor. Microsoft Geliştiriciler Ağı (MSDN) dökümanları,  C# hakkında birçok makaleye ulaşabilmeniz ve karşılaştığınız sorunlara cevap bulabilmeniz açısından önemli fakat maalesef Türkçe içeriği bulunmuyor. Microsoft’un ücretsiz veritabanı uygulaması olan SQL Server Express’i önümüzdeki aylarda değineceğimiz konular için yüklemenizi tavsiye ederim.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim34.png" rel="lightbox[122]"><img class="aligncenter size-medium wp-image-126" title="Resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim34-300x182.png" alt="" width="300" height="182" /></a><br />
C# Express ile oluşturabileceğiniz proje çeşitleri</p>
<p>Yükleme işlemini tamamlayıp geliştirme ortamını açtığınızda, güncel MSDN haberlerinin yer aldığı başlangıç ekranıyla karşılaşacaksınız. Proje oluşturmak için File&gt;New Project seçeneğini işaretleyin. Açılacak diyalogdaki seçeneklerden “Console Application”, komut sisteminde çalışan konsol uygulamaları için kullanacağımız seçenek. Programcılık mantığına değineceğimiz eğitimlerde bu tarz projeler hazırlayacağız. “Windows Forms Application” ise windows arayüzünü kullanarak pencereler tasarlayacağımız form uygulamaları yapmamızı sağlıyor. Yeni Visual Studio serisinin  arayüz tasarlama konusundaki en başarılı programlardan biri olduğunu belirtmeliyim. Yeni proje oluşturduktan sonra ilgili dosyalar Belgelerim&gt;Visual Studio 2008&gt;Projects altında projenizin ismine ait klasörün içinde saklanmakta ve Express versiyonlarda bunu değiştiremiyoruz. Uygulamanın sağ tarafındaki “Solution Explorer” bölmesi programın sahip olduğu dosya ve klasörleri yönetmek için kullanacağımız alan. Son olarak proje yarattıktan sonra, üst kısımda bulunan yeşil “Run” butonuyla yazdığınız programı çalıştırabildiğinizi hatırlatalım. Bu ay anlatacaklarımızın sonuna geldik ama ilk programımızı yazmadan Visual Studio’yu kapatamayız. O zaman hemen bir konsol  uygulaması yarattıktan sonra ortadaki süslü parantezler “{}” arasına aşağıdaki kodu yazıp “Run” butonuna basarak ilk programımızı tamamlayabiliriz.</p>
<p>İlk C# Programımız:</p>
<pre class="brush: c#; ">

Console.WriteLine(&quot;Merhaba C#!&quot;);
</pre>
<p><em><span style="font-style: normal;">update: Haziran 2008 tarihinde yazdıgım bu yazıdan sonra çıkan VS 2010 sürümünü yüklemenizi tavsiye ederim.</span></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/c-dersleri-1-net-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Web Sayfaniza Virtual Earth Haritalari Ekleyin</title>
		<link>http://www.yigitkiran.net/blog/2010/02/web-sayfaniza-virtual-earth-haritalari-ekleyin/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/web-sayfaniza-virtual-earth-haritalari-ekleyin/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:50:01 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[virtual earth]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=111</guid>
		<description><![CDATA[Günümüzde yoğun ilgi gören harita uygulamaları artık üç boyutlu görüntülenebilen, trafik yoğunluğunu bildiren, afet bölgelerindeki hasarı gösterebilen, Microsoft Live Local gibi servislerle bazı şehirlerde gezinmeye imkan veren özelliklere kavuştular. Hatta Dünya’da dolaşmaktan sıkıldıysanız, Google Sky veya bu ay incelediğimiz Microsoft Virtual Telescope gibi uygulamalar ile uzayı keşfetmeye başlayabilirsiniz. Gelişim süreci devam ederken firmalar web programcılarını da unutmuyor; SDK ve API’leri sürekli güncelleyerek uygulamaların başka sayfalara kolayca entegre edilebilmesi için uğraş veriyorlar. Bizde şimdi kullanımı giderek artan Microsoft Virtual Earth kütüphanelerinin yardımıyla web sitemiz için bir harita uygulaması hazırlayacağız.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik.png" rel="lightbox[111]"><img class="aligncenter size-large wp-image-112" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik-1024x589.png" alt="" width="491" height="282" /></a></p>
<p>Eskiden sadece büyük atlaslarda veya belgesellerde görebildiğimiz uydu fotoğrafları, gelişen teknoloji ve internet sayesinde artık her bilgisayardan erişilebilir hale geldi. Yaklaşık üç yıl önce ücretsiz bir şekilde hayata geçen Google Maps, coğrafi bilgi sistemlerini hayatımızın bir parçası haline getirmekle kalmadı, tarayıcımızda bir masaüstü uygulaması gibi çalışarak belkide AJAX teknolojisinin bu kadar yayılmasında en büyük etkenlerden biri oldu. Özellikle büyük şehirlerin yüksek çözünürlüklü fotoğraflarını kullanıcıların hizmetine sunan Google ve Microsoft gibi firmalar, bilmediğimiz bir adrese giderken bizi kaybolmaktan kurtarıyorlar.</p>
<p>Günümüzde yoğun ilgi gören harita uygulamaları artık üç boyutlu görüntülenebilen, trafik yoğunluğunu bildiren, afet bölgelerindeki hasarı gösterebilen, Microsoft Live Local gibi servislerle bazı şehirlerde gezinmeye imkan veren özelliklere kavuştular. Hatta Dünya’da dolaşmaktan sıkıldıysanız, Google Sky veya bu ay incelediğimiz Microsoft Virtual Telescope gibi uygulamalar ile uzayı keşfetmeye başlayabilirsiniz. Gelişim süreci devam ederken firmalar web programcılarını da unutmuyor; SDK ve API’leri sürekli güncelleyerek uygulamaların başka sayfalara kolayca entegre edilebilmesi için uğraş veriyorlar. Bizde şimdi kullanımı giderek artan Microsoft Virtual Earth kütüphanelerinin yardımıyla web sitemiz için bir harita uygulaması hazırlayacağız.</p>
<p><span id="more-111"></span></p>
<p>Google Maps ve Microsoft Virtual Earth’ı diğer harita uygulamalarından farklı kılan en büyük özellik, iki platformun da kütüphanelerinin tamamen AJAX teknolojisiyle çalışmasıdır. Ayrıca katmanlı yapıda oluşturulan görüntüler, harita üzerine harici öğeler eklenmesine ve bu öğeler üzerinden işlem yapılmasına imkan sağlıyor. Gerekli javascript kütüphanesini sayfamıza ekledikten sonra haritayı oluşturmak, koordinatları değiştirmek ya da yeni öğe eklemeye dair bütün metodlara ulaşabiliyoruz. Bu noktada önümüze çıkan iki seçenek var. Birincisi, kullandığımız metodları javascript ile yazarak uygulamanın kullanıcı tarafında (client-side) çalıştırılması. Diğer seçeneğimiz ise yazdığımız sınıfların sunucu tarafında (server-side) saklanması, oluşturacağımız sınıflar ve metodların ajax yada javascript ile sunucudan çağrılarak kullanıcıya ulaştırılması. Sunucu tarafında çalıştıracağımız uygulamalar için bir web servisi hazırlamamız ve harita üzerinde işlemleri buradan gerçekleştirmemiz de mümkün.</p>
<p><strong>HARİTANIN KURULUMU</strong></p>
<p>Virtual Earth ile hazırlayacağımız projemizde, Microsoft’un uygulama geliştirme arayüzlerini (API) kullanacağımızdan bahsetmiştik. Bu noktada <a href="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6">http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6</a> adresindeki en yeni  kütüphaneyi referans olarak sayfamıza ekleyerek programlamaya başlayabileceğiniz gibi, bu kütüphaneyi kullanarak hazırlanan bazı paket uygulamaları kullanarak da harita uygulamanızı geliştirebilirsiniz. Buna örnek olarak açık kaynaklı PietschSoft.VE projesini  (<a href="http://www.codeplex.com/PietschSoftVE3/Release/ProjectReleases.aspx?ReleaseId=2200">http://www.codeplex.com/PietschSoftVE3/Release/ProjectReleases.aspx?ReleaseId=2200</a>) ve bu projenin gelişmiş lisanslı sürümü olan Simplovation.Web.Maps.VE (<a href="http://simplovation.com/">http://simplovation.com/</a>) paket uygulamalarını inceleyebilirsiniz. Ancak biz hazırlayacağımız uygulamada temel VE kütüphanesini kullanarak haritaları nasıl oluşturabileceğimizi göreceğiz.</p>
<p>Öncelikle javascript ile kullanıcı tarafında haritaların nasıl yaratılabileceğinden bahsedelim. Sınıf kütüphanesini sayfaya referans olarak ekledikten sonra, sayfa açıldığında yüklenecek bir fonksiyon içerisinde haritanın temeli olan VEMap nesnesi yaratarak işlemlere başlayabiliriz. VEMap nesnesi  yaratırken haritayı oluşturacağı bir DIV objesinin ID değerini parametre olarak girmemiz gerekiyor. Daha sonra yaratılan nesnenin haritayı yüklemesi için LoadMap metodunu kullanıyoruz. Tamamen opsiyonel 7 parametresi bulunan bu fonksiyon ile haritanın belirlenen DIV kontrolünde çalışmasını sağlayabiliriz. Örneğimizde parametre kullanmayıp önemli VEMap metodlarını tek tek inceleyelim. SetCenter metodu ile haritanın merkez koordinatını değiştirebiliyoruz. Enlem (latitude) ve boylam (longitude) değerleri ile yaratılan VELatLong nesnelerini alan SetCenter metodu haritada istediğimiz bölgeyi merkezde görüntülememize imkan veriyor.</p>
<p>Harita Tipleri Tablosu</p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Road</td>
<td>Yol haritası.</td>
</tr>
<tr>
<td>Shaded</td>
<td>Bölge kenarları gölgelendirilmiş yol haritası.</td>
</tr>
<tr>
<td>Aerial</td>
<td>Coğrafi harita.</td>
</tr>
<tr>
<td>Hybrid</td>
<td>Bölge isimlerine sahip coğrafi harita.</td>
</tr>
<tr>
<td>Oblique</td>
<td>Eğik açılı harita.</td>
</tr>
<tr>
<td>Birdseye</td>
<td>Kuşbakışı harita, yatık açılı.</td>
</tr>
<tr>
<td>BirdseyeHybrid</td>
<td>Bölge isimlerine sahip kuşbakışı harita.</td>
</tr>
</tbody>
</table>
<p>Sık kullanılan bir diğer metod olan SetZoomLevel ile harita üzerinde 1-19 değerleri arasında bir zoom seviyesi belirleyebiliyoruz. Haritamıza başlangıç ayarları yaparken en son kullandığımız method ise harita tipi ayarlamaya yarayan SetMapType. Parametre olarak VEMapStyle nesneleri alan bu fonksiyon ile coğrafi ya da yol haritası gibi görünüm seçenekleri belirleyebilirsiniz (bkz. Tablo 1). Örneğimizde Türkiyenin koordinatlarını girerek hazırladığımız web sayfası şu şekilde:</p>
<p>Açıklama: Harita Kurulumu</p>
<pre class="brush: xml; ">

&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6&quot;&gt;

&lt;/script&gt;&lt;script type=&quot;text/javascript&quot;&gt;

var harita = null;

function HaritayiYukle()

{

harita = new VEMap(&#039;HaritaAlani&#039;);

harita.LoadMap();

harita.SetCenter(new VELatLong(39.28, 35.20));

harita.SetZoomLevel(4);

harita.SetMapStyle(VEMapStyle.Aerial);

}

&lt;/script&gt;&lt;/head&gt;&lt;body onload=&quot;HaritayiYukle();&quot;&gt;

&lt;div id=&#039;HaritaAlani&#039; style=&quot; width:400px; height:400px;&quot;&gt;&lt;/body&gt;&lt;/html&gt;
</pre>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim33.png" rel="lightbox[111]"><img class="aligncenter size-medium wp-image-115" title="Resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim33-300x252.png" alt="" width="300" height="252" /></a><br />
Merkezini ayarladığımız haritanın ilk görünümü<strong> </strong></p>
<p>Haritanızı oluşturmayı başardıysanız, uygulamamızın bir sonraki aşamasına geçebiliriz. Harita üzerinde belirli koordinatları merkezde görüntülemek için, yukarıda bahsettiğimiz SetCenter fonksiyonunu kullanarak kullanıcımızı yönlendirebiliyoruz. Yapmanız gereken, merkeze yerleştireceğiniz koordinatları belirledikten sonra, bu değerden bir VELatLong nesnesi yaratmak ve SetCenter metodunu çağırmak. Bu çağırma işlemini javascriptle yaparsanız, harita kütüphanesinin sınıfları AJAX tabanlı çalıştığı için sayfamızda herhangi bir yenilenme (postback) işlemi gerçekleşmeyecektir. Örneğimize İstanbul ve Ankara’nın koordinatlarını döndüren iki küçük fonksiyon ile başlıyoruz. Daha sonra bir koordinat alarak harita objemizin SetCenter methodunu çağıran MerkezBelirle fonksiyonu ile işlemi tamamlıyoruz. Dizayn alanında sayfanıza ekleyeceğiniz buton, resim veya köprü (hyperlink) nesneleri ile ilgili metodları çağırabilirsiniz. Burada dikkat etmeniz gereken nokta, köprü kullanımında adres (href) değerini anchor karakteri olan “#” ile doldurarak sayfada bir yenilenme işlemini engellemenizin gerekmesi. Hazırladığımız kodları aşağıda inceleyebilirsiniz:</p>
<p>JS Fonksiyonları:</p>
<pre class="brush: javascript; ">

function istanbulKoord()

{

var koord = new VELatLong(41.20, 29);

return koord;

}

function ankaraKoord()

{ return new VELatLong(40.02, 32.61); }

function MerkezBelirle(koord)

{ harita.SetCenter(koord); }
</pre>
<p>HTML Kodlar:</p>
<pre class="brush: xml; ">

&lt;a href=&#039;#&#039; onclick=&#039;MerkezBelirle(istanbulKoord());&#039;&gt;İstanbul&lt;/a&gt;&lt;br /&gt;

&lt;a href=&#039;#&#039; onclick=&#039;MerkezBelirle(ankaraKoord());&#039;&gt;Ankara&lt;/a&gt;&lt;br /&gt;
</pre>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim12.png" rel="lightbox[111]"><img class="aligncenter size-medium wp-image-113" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim12-300x186.png" alt="" width="300" height="186" /></a><br />
Haritamız DIV alanı içerisine yüklenecek.<strong> </strong></p>
<p><strong>ŞEKİL EKLEMEK</strong></p>
<p><strong></strong>Virtual Earth’ün kütüphanesinde hazır bulundurduğu bir diğer sınıf da şekiller. Harita üzerine şekil eklemek, çizim yapmak veya bir alanı seçmek için VEShape nesnelerini kullanabilirsiniz. Raptiye (PushPin), çizgi (PolyLine) ve poligon (Polygon) olarak çeşitlendirilen bu eklentilerden kullanmak istediğimizi nesne yaratırken belirliyoruz.Farklı bir katmanda oluşturulan şekil nesnelerini yaratabilmek için bir şekil tipi (VEShapeType) ve eklenecek bölgenin koordinatlarını girmemiz yeterli. Resmi değiştirilebilen şekil objeleri, kullanıcıya istediğimiz mesajı göstermek için başlık ve açıklama bilgilerine de sahip. Örneğimizde harita üzerinde belirli bir noktayı raptiye (PushPin) şekli ile işaretleyip, SetTitle ve SetDescription metodlarını kullanarak bir açıklama ekleyeceğiz. Şekil üzerinde düzenlemeleri bitirdiğimiz zaman harita nesnesinin AddShape fonksiyonu ile ekleme işlemini gerçekleştiriyoruz. Örneğimizde hazırladığımız PushPinEkle fonksiyonu ve kullanılışını aşağıda görebilirsiniz:</p>
<p>Açıklama: Şekil Eklemek</p>
<pre class="brush: javascript; ">

function PushPinEkle(koord, baslik, aciklama)

{ var sekil = new VEShape(VEShapeType.Pushpin, koord);

sekil.SetTitle(baslik);

sekil.SetDescription(aciklama);

harita.AddShape(sekil);

}
&lt;a href=&#039;#&#039; onclick=&#039;PushPinEkle(istanbulKoord(), &quot;Sariyer&quot;, &quot;Kilyos plajı&quot;);&#039;&gt;Sariyer&lt;/a&gt;&lt;br /&gt;

&lt;a href=&#039;#&#039; onclick=&#039;PushPinEkle(ankaraKoord(), &quot;TBMM&quot;, &quot;Turkiye Buyuk Millet Meclisi&quot;);&#039;&gt;TBMM&lt;/a&gt;
</pre>
<p><strong></strong></p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim2.jpg" rel="lightbox[111]"><img class="aligncenter size-medium wp-image-114" title="Resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim2-300x203.jpg" alt="" width="300" height="203" /></a><br />
PushPin gibi eklentiler kullanıcı deneyimini arttırıyor.<strong> </strong></p>
<p><strong></strong></p>
<p><strong>SUNUCU KONTROLLERİ</strong></p>
<p><strong></strong></p>
<p><strong></strong>Dahili Virtual Earth sınıfları AJAX tabanlı çalıştığı için javascript ile kullanıcı tarafında interaktif bir uygulama çalıştırmayı başardık. Ancak ekleyeceğiniz sınıflar ya da geliştirmek isteyeceğiniz özellikler için kodları sunucu tarafında çalıştırmak isteyebilirsiniz. Bu durumda ilk yapmamız gereken Ajax Extensions altındaki ScriptManager objesini sayfamıza taşımak. Sonraki adım kullanacağımız .js dosyalarını ScriptReference nesnesi ile sayfaya eklemek. Sistemin çalışma mantığını aşağıdaki kodlar üzerinde inceleyebilirsiniz:</p>
<p>Açıklama: Şekil Eklemek</p>
<pre class="brush: javascript; ">

&lt;script type=&quot;text/javascript&quot;&gt;

var harita = null;

function HaritaYukle()

{

harita = new VEMap(&quot;myMap&quot;);

harita.LoadMap(new VELatLong(39.2, 35.2),6);

}

Sys.Application.add_load(HaritaYukle);

&lt;/script&gt;

&lt;body&gt;

&lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;

&lt;div&gt;

&lt;asp:ScriptManager runat=&quot;server&quot; ID=&quot;ScriptManager1&quot;&gt;

&lt;Scripts&gt;

&lt;asp:ScriptReference Path=&quot;http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6&quot; /&gt;

&lt;/Scripts&gt;

&lt;/asp:ScriptManager&gt;

&lt;div id=&quot;myMap&quot; style=&quot;position:relative; width:600px; height:400px;&quot;&gt;&lt;/div&gt;
</pre>
<p><strong></strong></p>
<p><strong>DÜNYA TURU</strong></p>
<p>Gelişimi devam eden coğrafi bilgi sistemlerinin kullanımı da gün geçtikçe artıyor. İnternette birçok firmanın yararlandığı bu uygulamalar artık sadece adres göstermek için değil, emlak, arsa tanıtımı yapmak, filo takibi gerçekleştirmek gibi değişik alanlarda kullanılıyor. Örneğin bu yıl Microsoft’un düzenlediği Imagine Cup yarışmasında sürdürülebilir çevre için harita uygulamalarının yazılımcılıar tarafından yoğunlukla kullanıldığına şahit olduk. Bunların yanında CV’sini harita üzerinde hazırlayanlar gibi kişisel amaçlara yönelik yaratıcı uygulamalar da internette yerini almakta. Bu olanaklardan yaralanmanız, sitenizi takip edenler açısından kesinlikle faydalı olacaktır.</p>
<p>p.s. Bu yazı Haziran 2008 tarihli PC Magazine dergisi makalemden derlenmiş olup, kullandığım IDE, API ve toolkitlerin yeni versiyonunu indirmenizi tavsiye ederim ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/web-sayfaniza-virtual-earth-haritalari-ekleyin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ajax Extender nesnelerinin kullanimi</title>
		<link>http://www.yigitkiran.net/blog/2010/02/ajax-extender-nesnelerinin-kullanimi/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/ajax-extender-nesnelerinin-kullanimi/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:34:49 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax extender]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net ajax]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[extender]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=96</guid>
		<description><![CDATA[Web programcılarının en çok vaktini çalan unsur, hiç şüphesiz sayfalarda ki küçük ayrıntılarla uğraşmaktır. Ancak detaylara verdiğiniz önem, web sitenizin kullanım kolaylığını arttırırken kullanıcıların sitenizi tercih etme sebebi de olabilir. Hatırlarsanız, geçtiğimiz aylarda projelerimizde kullandığımız “Ajax Control Toolkit” araçları, değişik alanlarda bünyesinde bulundurduğu öğeler ile bizleri büyük bir zaman kaybından kurtarıyordu. Ajax ile entegre gelen Visual Studio 2008 ise Control Toolkit araçlarının kullanımını daha da kolaylaştırarak sayfamızdaki ASP.NET nesnelerini doğrudan bu araçlara bağlamamıza imkan veriyor.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik.jpg" rel="lightbox[96]"><img class="aligncenter size-large wp-image-97" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik-1024x799.jpg" alt="" width="491" height="383" /></a></p>
<p>Web programcılarının en çok vaktini çalan unsur, hiç şüphesiz sayfalarda ki küçük ayrıntılarla uğraşmaktır. Ancak detaylara verdiğiniz önem, web sitenizin kullanım kolaylığını arttırırken kullanıcıların sitenizi tercih etme sebebi de olabilir. Hatırlarsanız, geçtiğimiz aylarda projelerimizde kullandığımız “Ajax Control Toolkit” araçları, değişik alanlarda bünyesinde bulundurduğu öğeler ile bizleri büyük bir zaman kaybından kurtarıyordu. Ajax ile entegre gelen Visual Studio 2008 ise Control Toolkit araçlarının kullanımını daha da kolaylaştırarak sayfamızdaki ASP.NET nesnelerini doğrudan bu araçlara bağlamamıza imkan veriyor.<br />
Bizde şimdi Ajax tabanlı bir web sitesi kayıt formu hazırlayarak, hem bu araçları öğrenmeye devam edeceğiz hem de yeni platformun bizlere sağladığı kolaylıkları tanıma fırsatı bulacağız.<span id="more-96"></span></p>
<p style="text-align: left;">Üyelik sistemine sahip web siteleri, kullanıcı adı ve şifre dışında kullanıcılarıyla ilgili daha çok bilgi edinmek isteyebilirler. Yapmamız gereken kayıt sayfasında değişik kullanıcı giriş alanları barındıran bir form oluşturmak ve bu formdan gelen verileri veritabanımıza kaydetmek. Tabi bu formu hazırlarken ASP.NET’in Ajax yeteneklerinden faydalanarak kısa zamanda profesyonel bir tasarım yapmamız mümkün. Extender diye adlandırılan Control Toolkit kontrolleri Panel, TextBox,  Image, DropDownList gibi çok kullanılan ASP.NET öğelerini geliştirerek onlara Ajax destekli özellikler katıyordu. Visual Studio 2008 ile araç kutusundan sayfamıza eklediğimiz bu nesnelerinin yanındaki bir ok tuşuyla “Extender Wizard” isimli sihirbaza erişiyor ve nesneleri otomatik olarak bu araçlara bağlayabiliyoruz.</p>
<p style="text-align: left;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim11.png" rel="lightbox[96]"><img class="aligncenter size-medium wp-image-98" title="Resim1" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim11-300x134.png" alt="" width="300" height="134" /></a></p>
<p style="text-align: center;">Eklediğiniz nesnenin yanında beliren SmartTask menüsü ile Extender Sihirbazına ulaşabilirisiniz.</p>
<p style="text-align: left;">Geçtiğimiz aylarda “Bilişim Kahramanları Aramızda” lansmanlarıyla ülkemizde tanıtımı yapılan yeni sürüm Visual Studio ile hala tanışmadıysanız, http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx adresinden deneme sürümü yada ücretsiz Express versiyonlarını indirmeniz mümkün. Ajax eklentileri programla birlikte geldiği için tekrar kurmanıza gerek yok fakat projemizde kullanacağımız ControlToolkit öğelerini yüklemeye ihtiyacınız olacak. VS 2008 kurulumunu gerçekleştirdikten sonra http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=4923 adresindeki ControlToolkit paketini indirip, SampleWebSite\Bin klasörü altındaki “AjaxControlToolkit.dll” dosyasını araç kutusu üzerine sürüklerseniz, yeni Ajax oyuncaklarınız otomatik olarak Visual Studio uygulamasına kurulmuş olacak. Bütün adımları tamamlayınca, bazı toolkit elemanlarını kullanarak hazırlayacağımız örnek projemize başlayabilirsiniz.</p>
<p style="text-align: center;">
<a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim42.png" rel="lightbox[96]"><img class="aligncenter size-full wp-image-101" title="Resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim42.png" alt="" width="208" height="600" /></a> AjaxControlToolkit.dll dosyasını sürükleyince kurulum otomatik gerçekleşiyor.</p>
<p style="text-align: left;"><strong> İŞLEMLERE BAŞLIYORUZ</strong><br />
VS 2008 altında Ajax eklentileri hazır geldiği için yeni web sitesi oluştururken sitenizin Ajax destekli olacağını belirtmenize gerek yok. ASP.NET web sitesi oluşturduktan sonra, Toolbar’ın “Ajax Extensions” sekmesi altındaki “ScriptManager” ve “UpdatePanel” nesnelerini sayfamıza sürükleyerek sayfamıza Ajax yetenekleri kazandırıyoruz. Formumuza ekleyeceğimiz nesnelerin güzel görünmesi için bir tablo altında tutulması tercih edilir. Ancak Control Toolkit’in sahip olduğu bazı görünüm araçları tablolar ile çalışamadığı için, bütün formu bir Panel içerisinde oluşturmamız iyi olacaktır. Sayfamıza  bir Panel nesnesi ekledikten sonra boyutlarını ayarlayalım ve nesnenin yanında görünen ok tuşuna basarak “Add Extender” seçeneğine tıklayalım. Yukarıda sözünü ettiğimiz Extender sihirbazı Panel nesnesi için kullanabileceğiniz bütün araçlar ile karşınızda belirmiş olmalı.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim22.png" rel="lightbox[96]"><img class="aligncenter size-medium wp-image-99" title="Resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim22-300x221.png" alt="" width="300" height="221" /></a> Extender Wizard ile ekleyebileceğiniz bütün araçları görebiliyorsunuz.</p>
<p style="text-align: left;">Projemizde kullandığımız panelimiz için görsel araçlardan DropShadow ve RoundedCorners öğelerini seçiyoruz. Ekleme işleminden sonra, Extender nesnesi Panel ile otomatik bağlanıyor ve özellikleri Panel’in özellikleri altından değiştirilebiliyor. RoundedCorners kontrolü panelimizin yuvarlak kenarlara sahip olmasını sağlayarak bizi resim veya JavaScript kodlarıyla uğraştırmıyor. “Corners” özelliği ile hangi köşelerin biçimini değiştirmek istediğinizi belirliyebiliyor, Radius ile açı değeri verebiliyorsunuz. DropShadow ise kullanıldığı panele gölgelendirme yapmaya yarayan bir kontrol. Burada önemli olan, yuvarlak hatlara sahip panelimize uyması için DropShadow’un Rounded özelliğini “True” yapmak ve iki nesnenin açı değerlerinin aynı olduğundan emin olmak.</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim61.png" rel="lightbox[96]"><img class="aligncenter size-full wp-image-103" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim61.png" alt="" width="474" height="630" /></a> Extender kontollerinin özelliklerine bağlı olduğu nesnenin altında ulaşabilirsiniz.</p>
<p>Formumuzun arka planını süsleyecek olan panelimizi hazırladıktan sonra bir tablo yatarak içerisine form elemanlarını eklemeye başlayabiliriz. Kişisel bilgiler ve üyelik bilgileri olarak ayırdığımız üyelik formuna ilk önce isim, mail ve doğum tarihi için gerekli TextBox nesnelerini ekliyoruz. Tekrar Extender Wizard’a girecek olursak bu nesneler için desteklenen birçok  aracın olduğunu görebiliriz. Öncelikle tasarımımız için kullanacağımız TextBoxWatermarkExtender öğesini tanıyalım. Bu kontrol ile TextBox objelerinin görünümünü değiştirebilir, başlık (caption) ifadelerinin kutunun içerisinde yer almasını ve dinamik olarak değişebilmesini sağlayabiliriz. WatermarkCssClass özelliği ile WatermarkExtender, harici bir css dosyasında veya önceden tanımladığınız stil nesnesini kullanarak TextBox’un seçili değilken nasıl görüntüleneceğini ayarlayabiliriz. Text özelliğine ise kutu seçili değilken içerisinde yazmasını istediğiniz metni girebilirsiniz. Biz örneğimizde aşağıdaki stili kullanacağız:</p>
<p>Açıklama: TextBoxWatermarkExtender  örnek stili.</p>
<pre class="brush: css; ">

.secili {
height:18px;
width:148px;
}

.secili_degil {
height:20px;
width:150px;
padding:2px 0 0 2px;
border:1px solid #BEBEBE;
background-color:#F0F8FF;
color:gray;
}
</pre>
<p><strong>ZAMANINIZ DEĞERLİDİR</strong></p>
<p>Control Toolkit araçları içerisinde en çok kullanılanlardan biri olan CalendarExtender ile tarih girişlerini birkaç tıklamayla takvim üzerinden alabilirsiniz. Kodlanması çok uzun zaman alabilecek böyle bir kontrolün hazır gelmesi gerçekten çok kullanışlı. Seçtiğiniz TextBox’a bu aracı bağladıktan sonra, kullanıcıların tıkladığında açılan bir takvim hazırlanmış oluyor. Ancak bu opsiyonu bir resim veya buton ile çalıştırmak da mümkün. Örneğimizde doğum tarihi alanının yanına bir Image nesnesi ekliyoruz. Bu işlemden sonra, CalendarExtender’in PopupButtonID özelliğine Image nesnesinin ID’sini yazarak takvimin resim tıklandığında açılmasını sağlıyoruz. Takvim eklentisinin stilini ve döndürdüğü değeri ayarlamanız da mümkün. Format özelliği ile tarihsel formatlama yaparak kutuya yazılan gün (d), ay (M) ve yıl (y) biçimini belirleyebilirsiniz (örneğin dd.MMM.yyyy).</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim52.png" rel="lightbox[96]"><img class="aligncenter size-full wp-image-102" title="Resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim52.png" alt="" width="470" height="630" /></a> CalendarExtender ile birkaç tıklamayla takviminiz hazır.</p>
<p>Kullanıcılarınızın ileride kötü sürprizlerle karşılaşmaması için kendilerine iyi bir şifre seçmesi önemlidir. Ancak çoğu kullanıcı rahatlığına düşkündür ve güvenilirliği kendisine aktarılmazsa hafızasını yoracak şifrelerden kaçınır. İşte bu noktada PasswordStrengthExtender aracı devreye giriyor ve üyelik sırasında şifre girişinin yanında belirerek yazılan şifreye dair kullanıcıya bilgi veriyor. Text ve BarIndicator isminde iki tipi bulunan bu kontrol ile yazılı veya görsel olarak şifrenin sağlamlığını aktarabilirsiniz. Örneğimizde kullandığımız Text tipindeki kontrolün Prefix özelliğine bir tanım yazısı ekliyor ve TextStrengthDescriptions özelliğine “;” karakteriyle ayrılmış güvenlik seviyelerini yazıyoruz (düşük;orta;yüksek gibi). Bu nesne toplamda 10 farklı seviyeye kadar çalışabiliyor. Ayrıca üyelik sisteminize göre tercih edilen şifre uzunluğunu (PreferredPasswordLength), içermesi gereken minimum numerik, sembol ve büyük küçük harf sayısını belirliyebilir, CalculationWeightings  özelliğiyle bu sayıların hesaplamadaki ağırlığını arada “;” karakterleri kullanarak değiştirebilirsiniz (ör: 10;5;5;10).</p>
<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim61.png" rel="lightbox[96]"><img class="aligncenter size-full wp-image-103" title="Resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Resim61.png" alt="" width="474" height="630" /></a> Kullanıcılarınızı şifrelerinin güvenliğine dair bilgilendirin.</p>
<p>Üyelik formlarında sık kullanılan diğer bir nesne olan CheckBox’lar için de değişik genişleme kontrolleri mevcut. Belirli CheckBox objelerinden sadece bir tanesinin seçilebilmesine izin veren MutuallyExclusiveCheckBox kontrolü bunlardan biri. Normalde çoktan seçmeli alanlar için RadioButton nesneleri kullanmaya aşinayız. Fakat bu nesneler seçildikten sonra iptal edilememesi ve bir seçeneğe sabitlenmesi nedeniyle bazı durumlarda kullanımı tercih edilmiyordu. Kullanıcıların doldurmasını zorunlu olmayan alanlarda kullandığımız CheckBox nesnelerine MutuallyExclusiveCheckBox kontrolü ekleyerek bir nevi radio button gibi davranmasını sağlayabilirsiniz. Bu sayede kullanıcı seçimini yaptıktan sonra alanı doldurmaktan vazgeçerse seçimini iptal edebilir. Örneğimizde doldurulması zorunlu olmayan cinsiyet alanında Erkek ve Bayan seçimleri CheckBox vasıtasıyla işaretleniyor. Ancak iki cinsiyeti seçmek çok anlamlı olmayacağından eklediğimiz extender kontrolü ile sadece bir tanesinin seçilebilmesini mümkün kılıyoruz. Bunu yapabilmek için farklı CheckBox’ların extender ayarlarındaki Key özelliğine aynı değeri vermeniz yeterli. Aynı Key değerine sahip CheckBox extender nesneleri arasından sadece birinin seçilmesine izin veriliyor. CheckBox için kullandığımız diğer araç ToggleButtonExtender ise nesnelerin görünümünü değiştirmemize imkan veriyor. Mevcut check box’lardan sıkıldıysanız, extender nesnesinin CheckedImageUrl ve UncheckedImageUrl özelliklerine seçtiğiniz bir resmin adresini yazarak seçimlerin resimlerle ifade edilebilmesini sağlayabiliyorsunuz.</p>
<p>Örnek projemizde Ülke, Şehir ve Semt girişlerini sağlayan DropDownList nesneleri için CascadingDropDown kontrolünü kullanabilirsiniz. Formunuzda birbirine bağıntılı DropDown öğeleri bulunuyorsa bu kontrol ile seçim sırasına göre nesneleri aktif hale getirebiliyorsunuz. Extender’i kullanmak için DropDown’ları dolduracak bir web servis hazırlamanız gerekli. Bu aşamadan sonra ParentControlID özelliğine kendinden önce gelmesi gereken nesnenin ID’sini yazarak aradaki bağlantıyı kuruyoruz. PromptText ileti seçili değilken yazacak metni belirlerken, ServiceMethod özelliğine mevcut listeyi dolduran web servis metodunun ismini yazmalısınız.</p>
<p><strong>CONTROL TOOLKİT’İ KEŞFEDİN</strong></p>
<p>Tasarladığımız kayıt formunu artık tamamlamış bulunuyoruz. ASP.NET Ajax altyapısı, hazırlanması saatler hatta günler sürebilecek birçok ayrıntıyı dakikalar içerisinde sitemize uygulamamızı sağladı. Sık kullanılan toolkit kontrollerine değindiğimiz bu proje üzerinde değişik tasarım, doğrulama ve güvenlik kontrollerini de ekleyerek daha profosyonel hale getirmeniz mümkün. ControlToolkit araçlarının kullanımını http://www.asp.net/AJAX/AjaxControlToolkit/ adresinden inceleyerek keşfetmenizi tavsiye ederim. Visual Studio 2008 ile kullanımı daha kolay hale gelen bu kontroller ile kodlaması uzun zaman alan birçok özelliği çok kısa bir sürede sitenize ekleyebiliyorsunuz. Sitenizin içeriği ve işlevselliği önemli olsa da, unutmayın ki şeytan ayrıntıda gizlidir.</p>
<p>Örnek uygulamayı indirmek için tıklayın: <a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/Uygulama.zip">Uygulama</a></p>
<p>p.s. Bu yazı Mayıs 2008 tarihli PC Magazine dergisi makalemden derlenmiştir; kullandığım IDE ve toolkitlerin yeni versiyonlarını yüklemenizi tavsiye ederim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/ajax-extender-nesnelerinin-kullanimi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET Ajax kullanarak iletisim formu hazirlamak</title>
		<link>http://www.yigitkiran.net/blog/2010/02/asp-net-ajax-kullanarak-iletisim-formu-hazirlamak/</link>
		<comments>http://www.yigitkiran.net/blog/2010/02/asp-net-ajax-kullanarak-iletisim-formu-hazirlamak/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:08:35 +0000</pubDate>
		<dc:creator>yigit</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[TR]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[contact form]]></category>
		<category><![CDATA[pc magazine]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://blog.yigitkiran.net/?p=74</guid>
		<description><![CDATA[Ziyaretçilerinizin web sitenizi önemsemesini istiyorsanız, siz de onlara önem verdiğinizi göstermelisiniz. Birçok sitede bulunan iletişim formları, kullanıcıların öneri, istek  ve şikayetlerini hızlı bir şekilde ilgililere iletebilmesine imkan tanır. Bizde bu ay ASP.NET Ajax’ın yeteneklerinden faydalanarak şık ve hızlı çalışan bir iletişim formu oluşturacağız. Genel olarak kullanıcıların yazdıklarını belirlenen bir kişiye mail atarak ulaştıran iletişim formları, bizim yapacağımız örnekte bir adım öteye giderek bu işlemin hatasız bir biçimde sonlanmasını sağlayacak.

Senaryoyu biraz daha genişletip, iletişime geçilecek insan sayısını arttırmak da mümkün. Biz örneğimizde dergimiz yazarlarının listesine sahip bir formda kullanıcının istediği yazara hitap edebileceği bir uygulama dizayn edeceğiz. Buradaki problem yazarların aldığı eleştirilere cevap verebilmesi için mesajı yazan kullanıcının iletişim bilgilerinin de iletilmesi gerekliliği. Mesaj göndermek isteyen kullanıcının kendisine cevap verilebilmesi için adı, soyadı ve e-mail adresi gibi bilgilerinin mutlaka girilmesini bekliyoruz. ASP.NET’in formlardaki alanları kontrol edip geçerliliğini onaylayan bazı “Validator” nesneleri bu konuda bize yardım edebilirler.  Bu nesneler bir yazı kutusunun (text-box) boş bırakılmaması gerektiğini, yada girilen e-mail adresinin formata uymadığını kullanıcıya hoş bir dille hatırlatıp iletişim problemleri yaşanmasını engelliyorlar.

Blogumu takip eden yada Ajax ile ilgilenen biriyseniz, salt ASP.NET formlarının ne kadar can sıkıcı olduğunu  düşünebilirsiniz. Özellikle alanların hatalarını kontrol eden bir form olduğu için, böyle durumlarda sayfanın yenilenmesi ve bilgilerin kaybolması gibi sorunlar sizinle iletişime geçmek isteyen kullanıcınız için iyi bir deneyim olmayacaktır. Ajax ile klasik formları daha interaktif hale getirmek için yapmanız gereken ilk iş kullandığınız Visual Studio 2005 yada Web Developer Express Edition’a gereken http://ajax.asp.net adresindeki “Ajax Extensions” paketini indirerek kurmak. Eğer VS 2008 versiyonuna terfi ettiyseniz, ilgili kütüphaneler hazır geldiği için bir sonraki adıma geçebilirsiniz.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik.gif" rel="lightbox[74]"><img class="aligncenter size-large wp-image-76" title="baslik" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/baslik-1024x685.gif" alt="" width="491" height="329" /></a></p>
<p>Ziyaretçilerinizin web sitenizi önemsemesini istiyorsanız, siz de onlara önem verdiğinizi göstermelisiniz. Birçok sitede bulunan iletişim formları, kullanıcıların öneri, istek  ve şikayetlerini hızlı bir şekilde ilgililere iletebilmesine imkan tanır. Bizde bu ay ASP.NET Ajax’ın yeteneklerinden faydalanarak şık ve hızlı çalışan bir iletişim formu oluşturacağız. Genel olarak kullanıcıların yazdıklarını belirlenen bir kişiye mail atarak ulaştıran iletişim formları, bizim yapacağımız örnekte bir adım öteye giderek bu işlemin hatasız bir biçimde sonlanmasını sağlayacak.</p>
<p>Senaryoyu biraz daha genişletip, iletişime geçilecek insan sayısını arttırmak da mümkün. Biz örneğimizde dergimiz yazarlarının listesine sahip bir formda kullanıcının istediği yazara hitap edebileceği bir uygulama dizayn edeceğiz. Buradaki problem yazarların aldığı eleştirilere cevap verebilmesi için mesajı yazan kullanıcının iletişim bilgilerinin de iletilmesi gerekliliği. Mesaj göndermek isteyen kullanıcının kendisine cevap verilebilmesi için adı, soyadı ve e-mail adresi gibi bilgilerinin mutlaka girilmesini bekliyoruz. ASP.NET’in formlardaki alanları kontrol edip geçerliliğini onaylayan bazı “Validator” nesneleri bu konuda bize yardım edebilirler.  Bu nesneler bir yazı kutusunun (text-box) boş bırakılmaması gerektiğini, yada girilen e-mail adresinin formata uymadığını kullanıcıya hoş bir dille hatırlatıp iletişim problemleri yaşanmasını engelliyorlar.</p>
<p>Blogumu takip eden yada Ajax ile ilgilenen biriyseniz, salt ASP.NET formlarının ne kadar can sıkıcı olduğunu  düşünebilirsiniz. Özellikle alanların hatalarını kontrol eden bir form olduğu için, böyle durumlarda sayfanın yenilenmesi ve bilgilerin kaybolması gibi sorunlar sizinle iletişime geçmek isteyen kullanıcınız için iyi bir deneyim olmayacaktır. Ajax ile klasik formları daha interaktif hale getirmek için yapmanız gereken ilk iş kullandığınız Visual Studio 2005 yada Web Developer Express Edition’a gereken <a href="http://ajax.asp.net/">http://ajax.asp.net</a> adresindeki “Ajax Extensions” paketini indirerek kurmak. Eğer VS 2008 versiyonuna terfi ettiyseniz, ilgili kütüphaneler hazır geldiği için bir sonraki adıma geçebilirsiniz.</p>
<p><span id="more-74"></span></p>
<p><strong>Form Hazırlıkları</strong></p>
<p>Hazırlayacağımız formdaki bütün elemanların Ajax ile yenilenme (postback) işlemine tabi tutulmadan güncellenebilmesi için, araç kutusundaki ScriptManager ve UploadPanel nesnelerinizi sayfaya eklemeyi unutmayın. UploadPanel içerisinde bulunan nesnelerin Ajax ile desteklendiğini, yine de bazı elemanların AutoPostBack özelliğini “True” yaparak uyum sağlaması gerektiğini hatırlatarak, formumuzu oluşturmaya başlayalım. Örneğimizde, iki sütuna ayrılmış bir tablo oluşturarak, içinde dergi yazarlarının isimleri ve mail adreslerinin tutulduğu bir DropDownList’i ekliyoruz. Bu listenin altına kullanıcının bilgilerini girmesini istediğimiz Ad-Soyad, E-mail adresi, ve opsiyonel bir veri olarak URL alanını ekliyoruz. Formun en altına, mesaj ve konu alanları için TextBox nesneleri yerleştiriyoruz. Buradaki mesaj alanının TextMode özelliğini “MultiLine” ve row sayısını 10 olarak belirlersiniz, kullanıcılarınıza mesaj yazmaları için geniş bir alan yaratmış olursunuz. Son olarak bir gönder butonu, ve bu butonun altına gönderme işleminin sonuçlandığını bildirecek olan bir Label nesnesi ekleyerek formu tamamlıyoruz.</p>
<p><strong>Alanların Kontrolü</strong></p>
<p>İletişim formumuzun hedeflerinden biri de doldurulması zorunlu olan alanların dinamik kontrolü ve hatalı olanların kullanıcıya bildirilmesiydi. Bu işlem için araç kutusunun Validation bölümündeki araçları kullanacağız. Çeşitli Validator nesnelerini alanlara bağlayarak bu alanların doldurululduğunu (RequiredFieldValidator), aldığı değerlerin belirli bir aralıkta olduğunu (RangeValidator) veya belirli bir formata uymasını (RegularExpressionValidator) kontrol edebilirsiniz. Örneğimizde, doldurulması zorunlu olan yazar seçimi, isim, e-mail, konu ve mesaj alanları için RequiredFieldValidator nesnelerini sayfamıza ekliyoruz. Her bir nesnenin ControlToValidate özelliğinde hangi alanı kontrol etmesini istiyorsak bunu seçerek ilişkilendirmesini yapmamız lazım. Ayrıca “ErrorReport” ve “Text” özelliklerine yazdığımız hata mesajları ile kullanıcının nerede hata yaptığını görmesini sağlayabiliriz.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim0.png" rel="lightbox[74]"><img class="aligncenter size-full wp-image-77" title="resim0" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim0.png" alt="" width="335" height="621" /></a><br />
Validation nesnesini formdaki alanlardan birine bağlamalısınız.</p>
<p>Yazarlarımızın kullancılara cevap verebilmesi için E-Mail alanı son derece önemli. Kullanıcının girdiği adresin düzgün yazılıp yazılmadığını yine validator nesneleri ile kontrol etmemiz mümkün. Araç kutusundan sayfamıza ekleyeceğimiz bir RegularExpressionValidator nesnesi, bağlandığı alana istenen formatta yazı girilmesini denetliyor. Sayfamızdaki e-mail alanında bu nesneyi kullanabilmek için ControlToValidate özelliğinden ilgili TextBox nesnesini seçmeli, ErrorReport ve Text özelliklerine hata mesajlarını yazmalı ve ValidationExpression özelliğine tıkladığınızda çıkan menüden  “Internet E-mail Address” seçeneğini işaretlemeliyiz. Bu eklentiyle formdaki e-mail alanı kontrol edilecek ve düzgün bir e-mail adresi girilmediğinde (ör: boşluklu veya @ karakteri olmayan) kullanıcıya hata mesajı döndürülecek.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim31.png" rel="lightbox[74]"><img class="aligncenter size-full wp-image-79" title="resim3" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim31.png" alt="" width="354" height="242" /></a><br />
RegularExpressionValidator değişik türlerdeki alanları denetliyebiliyor.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim41.png" rel="lightbox[74]"><img class="aligncenter size-medium wp-image-80" title="resim4" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim41-300x276.png" alt="" width="300" height="276" /></a><br />
Validation nesneleri eklendikten sonra dizayn sayfamızın görüntüsü.</p>
<p>Email Gönderimi</p>
<p>Farkındaysanız Ajax tabanlı ve birçok denetimin kullanıldığı bir form oluşturduk ve tek satır kod yazmadık! Visual Studionun bizlere sunduğu araçlar ile kısa sürede hazırladığımız formumuzun e-mail gönderebilmesi için özlediğimiz kod ekranına girebiliriz. Bu noktada .Net Framework altındaki Mail sınıfının fonksiyonları bize yardımcı olacak, ama önce kod sayfasının en üstünde</p>
<p>using System.Net.Mail;</p>
<p>deklerasyonunu yaparak bu sınıf altındaki metodları sayfamıza dahil etmeliyiz. Daha sonra mail göndermek için gereken kodları Gönder butonunun click olayınının içerisine yazabiliriz. Dizayn ekranında butona çift tıklayınca bu kod bloğu sizin için oluşturulacaktır. Önce validator nesnelerinin isValid özelliklerini kontrol edip, formdaki bütün alanlar denetimden geçebilmiş mi diye bakıyoruz.<br />
Sonraki aşama gerekli verileri alıp maili göndermek olacaktır. Yazmamız gereken kod bu şekilde:</p>
<pre class="brush: c#; ">

protected void Button1_Click(object sender, EventArgs e)
{
        //Doldurulması zorunlu alanların kontrolü:
        if (RequiredFieldValidator1.IsValid &amp;&amp; RequiredFieldValidator2.IsValid &amp;&amp; RegularExpressionValidator1.IsValid &amp;&amp; RequiredFieldValidator4.IsValid &amp;&amp; RequiredFieldValidator5.IsValid)
        {
            /*Yeni mail nesnesi yaratıp, kullanıcının mail adresini ve sectigi yazarin DropDownList&#039;ten dönen mail adresini ekliyoruz */
            MailMessage MyMail = new MailMessage(TextBox2.Text, DropDownList1.SelectedItem.Value);

            //Mailin konusunu ekliyoruz.
            MyMail.Subject = TextBox4.Text;

            /*Maile yazılacak mesajın üst kısmına kullanıcının isim ve url bilgilerini ekliyoruz */
            string gonder = &quot;İsim: &quot; + TextBox1.Text + &quot;\nUrl: &quot; + TextBox3.Text + &quot;\nMesaj:\n&quot; + TextBox5.Text;
            MyMail.Body = gonder;

            /*Yeni bir mail client yaratıp, sunucumuzdan maili ilgili kişiye gönderilmesini sağlıyoruz */
            try
            {
                SmtpClient MyClient = new SmtpClient(&quot;localhost&quot;, 25);
                MyClient.Send(MyMail);
            }
            catch (Exception ex)
            {
   /*Mail gönderme işlemi sırasında oluşan sunucu hatalarını kullanıcıya bilgilendirmeliyiz.*/
                Label2.Text = &quot;Sunucudaki bir hata nedeniyle mail gönderilemedi.&quot;;
                return;
            }

            //Kullanıcıya işlemin tamamlandığına dair bir yazı gösteriyoruz.
            Label2.Text = &quot;Mesajınız Gönderilmiştir!..&quot;;

            //Yeni bir mesaj için formdaki bütün alanları temizliyoruz.
            DropDownList1.SelectedIndex = 0;
            TextBox1.Text = &quot;&quot;;
            TextBox2.Text = &quot;&quot;;
            TextBox3.Text = &quot;&quot;;
            TextBox4.Text = &quot;&quot;;
            TextBox5.Text = &quot;&quot;;

        }
    }
</pre>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim21.png" rel="lightbox[74]"><img class="aligncenter size-medium wp-image-78" title="resim2" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim21-300x255.png" alt="" width="300" height="255" /></a><br />
İletişim formumuz tepkisiz kullanıcılara isyan ediyor J</p>
<p><strong>Toolkit Araçlarını Kullanmak</strong></p>
<p>Tebrikler, artık elimizde kullanabileceğimiz başarılı bir iletişim formumuz var. Ancak yapabileceklerimiz bunlarla sınırlı değil. Önceki workshoplarda bahsettiğimiz control toolkit elemanlarını sayfamıza ekleyerek, kullanıcıların aldığı statik hata mesajlarını görsel açıdan daha güzel bir hale getirebiliriz. Bir hatırlatma yaparsak, Ajax Extensions ortaya çıktıktan sonra yayınlanan control toolkit kütüphanesi, internette yaygın bir şekilde kullanılan ajax uygulamalarını mevcut altyapının üzerine inşa edilen çeşitli araçlarla ASP.NET projelerimize eklememize imkan tanıyordu. Bu araçları kurmak için toolkit kütüphanesini <a href="http://www.codeplex.com/AtlasControlToolkit">http://www.codeplex.com/AtlasControlToolkit</a> adresinden indirmeniz gerekmekte. Ardından Visual Studio araç kutusunda yeni bir sekme yaratıp, sağ tuş ile “Choose Items” komutuna tıkladıktan sonra açılan arayüzdeki Browse tuşuna tıklamalı, indirdiğiniz dosyalar arasında yer alan AjaxControlToolkit.dll dosyasını eklemelisiniz.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim51.png" rel="lightbox[74]"><img class="aligncenter size-medium wp-image-81" title="resim5" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim51-300x285.png" alt="" width="300" height="285" /></a><br />
ControlToolkit araçlarıyla sayfamız daha interaktif bir görünüme kavuştu.</p>
<p>Artık dizayn sayfamıza geri dönebiliriz. Eklediğimiz toolkit araçları içerisindeki ValidationCalloutExtender, sayfamızda bulunan Validation nesnelerinin görünümünü değiştirecek özelliklere sahip. Bu aracı sürükleyerek sayfada kullandığımız her Validation nesnesinin yanına bir tane ekleyelim. Önceden denetimden geçemeyen alanların yanında kırmızı bir uyarı çıkaran Validation nesneleri, bu toolkit aracıyla birlikte kullanıcıya popup uyarılar göstererek iletişim formumuza profesyonel bir görünüm katacak. Bütün denetleyicilerin yanına bir ValidationCalloutExtender ekledikten sonra bu nesnelerin “TargetControlID” özelliğinden bir denetleyici seçerek birbirleriyle ilişkilendirin. Artık Validation nesneleri uyarı göstermek istediğinde, bağlı olduğu ValidationCalloutExtender çalışarak şık görünümlü bir popup uyarı gösterecek.  Öte yandan önceki tasarımımızda Validation nesnelerimizin Text özelliklerine yazdığımız yazılar hala gözükmeye devam edecektir. Yazı ve popup uyarılarının aynı anda ortaya çıkması güzel bir görüntü oluşturmayacağı için, validation nesnelerinin Text özelliğindeki yazıyı silebilir, yada bir * karakteriyle küçük bir uyarı vermeye devam etmesini sağlayabilirsiniz. Extender nesneleri ise Validation objelerinin ErrorMessage özelliğinde bulunan yazıyı okuyacaklar.</p>
<p><a href="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim6.png" rel="lightbox[74]"><img class="aligncenter size-medium wp-image-82" title="resim6" src="http://yigitkiran.net/wp/wp-content/uploads/2010/02/resim6-254x300.png" alt="" width="254" height="300" /></a><br />
ValidationCalloutExtender nesneleri eklendikten sonra dizayn sayfamızın görünümü.</p>
<p><strong>İletişime Geçin</strong></p>
<p>Planladığımız iletişim formunu Ajax’ın imkanları ile tasarlayıp, Control Toolkit araçlarıyla görsel açıdan güzel bir hale getirdik. Hazırladığımız interaktif sayfa, ziyaretçileriniz ile daha iyi iletişim kurabilmenize olanak sağlarken, sitenizin prestijini arttıracaktır. Çeşitli araçlara sahip olan toolkit’i ASP.NET Ajax ile yaptığınız bütün projelerde gözden geçirmenizi tavsiye ederim.</p>
<p>p.s. Bu yazi Nisan 2008 tarihli PC Magazine makalemden derlenmistir; kullandigim IDE ve toolkitlerin yeni sürümlerini takip etmenizi tavsiye ederim :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yigitkiran.net/blog/2010/02/asp-net-ajax-kullanarak-iletisim-formu-hazirlamak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

