You are on page 1of 696

Adm Adm Microsoft Visual C# 2008

John Sharp
eviri: mit Tezcan

arkada YAYINEV Yuva Mahallesi 3702. Sokak No: 4 Yenimahalle / Ankara Tel:+90-312 394 62 70 (pbx) Faks: +90-312 394 62 85 e-posta: info@arkadas.com.tr www.arkadas.com.tr Yaync Sertifika No: 12382 Orijinal ngilizce Bask: Microsoft Visual C# 2008 Step By Step, John Sharp

Copyright 2008, John Sharp ORJNAL YAYINCI Microsoft Press A Division of Microsoft Corporation One Microsoft Way Redmond, WA 98052-6399 ile yaplan anlama sonucu tm haklaryla yaymlanmtr.

Trke yaym haklar arkada yaynevinindir. Yayncnn yazl izni olmadan, hibir biimde ve hibir yolla, bu kitabn ieriinin bir ksm ya da tm yeniden retilemez, oaltlamaz ve datlamaz.

ISBN 978-975-509-614-8 ANKARA, 2009

eviri Proje Editr Yayna Hazrlk Sayfa Dzeni Bask

: mit Tezcan : M. Selim Tosun : Zeynep Kopuzlu : Emine zyurt : Ankamat Matbaaclk

Microsoft, Microsoft Press, MSDN, SQL Server, Excel, Intellisense, Internet Explorer, Jscript, Silverlight, Visual Basic, Visual C#, Visual Studio, Win32, Windows, Windows Server ve Windows Vista Amerika Birleik Devletleri ve/veya dier lkelerde Microsoft Corporationn kaytl ticari markalar ya da ticari markalardr. Kitapta geen dier rn ve irket adlar sahiplerinin ticari markalar olabilir. Kitapta geen rnek irketler, kurulular, rnler, etki alan adlar, e-posta adresleri, logolar, kiiler, yerler ve olaylar tmyle gerekddr. Herhangi bir gerek irket, kurulu, rn, etki alan ad, e-posta adresi, logo, kii, yer ve olayla bir iliki kurulmamtr ya da bu biimde anlalmamaldr.

Bir Bakta indekiler


Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri


C#a Hogeldiniz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Deikenler, leler ve Deyimlerle almak . . . . . . . . . . . . . . . 29 Yntemler Yazmak ve Kapsam Uygulamak . . . . . . . . . . . . . . . . . 49 Karar fadeleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Bileik Atama ve Yineleme fadeleri Kullanmak . . . . . . . . . . . . . 85 Hatalar ve zel Durumlar Ynetmek . . . . . . . . . . . . . . . . . . . . 103

1 2 3 4 5 6
Ksm II

C# Dilini Anlamak
Snflar ve Nesneleri Yaratmak ve Ynetmek . . . . . . . . . . . . . . Deerleri ve Bavurular Anlamak . . . . . . . . . . . . . . . . . . . . . . . Numaralandrma ve Yaplar ile Deer Trleri Yaratmak . . . . . Dizileri ve Koleksiyonlar Kullanmak . . . . . . . . . . . . . . . . . . . . . Parametre Dizilerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . Kaltm ile almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arabirimler Yaratmak ve Soyut Snflar Tanmlamak . . . . . . . . p Toplama ve Kaynak Ynetimini Kullanmak . . . . . . . . . . . . 123 145 167 185 207 217 239 257

7 8 9 10 11 12 13 14
Ksm III

Bileenler Yaratmak
Alanlara Erimek in zellikler Uygulamak . . . . . . . . . . . . . . . Dizinleyicileri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Program Akn Kesmek ve Olaylar lemek . . . . . . . . . . . . . . Genericse Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Koleksiyonlar Numaralandrmak . . . . . . . . . . . . . . . . . . . . . . . Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . le Ar Yklemesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 295 311 333 355 371 395

15 16 17 18 19 20 21

iii

iv

Bir Bakta indekiler

Ksm IV

Windows Uygulamalar ile almak


Windows Presentation Foundationa Giri . . . . . . . . . . . . . . . . 415 Menler ve letiim Kutularyla almak . . . . . . . . . . . . . . . . . 451 Dorulamay Gerekletirmek . . . . . . . . . . . . . . . . . . . . . . . . . . 473

22 23 24
Ksm V

Veriyi Ynetmek
Bir Veritabannda Bilgi Sorgulamak . . . . . . . . . . . . . . . . . . . . . . 499 Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek . . . . . . . . . . . . . . . . . . . . 529

25 26

Ksm VI

Web Uygulamalar Oluturmak


ASP .NETe Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Web Formlar Dorulama Denetimlerini Anlamak . . . . . . . . . Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek . . . . . . . . . . . . . . . . . . . . . . . Bir Web Servisi Yaratmak ve Kullanmak . . . . . . . . . . . . . . . . . . 559 587 597 623

27 28 29 30

indekiler
Teekkrler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xix

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri


C#a Hogeldiniz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Visual Studio 2008 Ortamn Kullanarak Programlamaya Balamak . . . . . . . . . . 3 lk Programnz Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Ad Alanlarn Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Grafiksel Uygulama Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Blm 1 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Deikenler, leler ve Deyimlerle almak . . . . . . . . . . . . . . . . 29


fadeleri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Tanmlayclar Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Anahtar Szckleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Deikenleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Deikenleri Adlandrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Deikenleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Temel Veri Trleri ile almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Temel Veri Tr Deerlerini Grntlemek . . . . . . . . . . . . . . . . . . . . . . . . 34 Aritmetik leleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 leler ve Trler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Aritmetik leleri ncelemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 ncelii Denetlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 lemleri Gerekletirmek in Birleim zelliini Kullanmak . . . . . . . . . . 44 Birleim ve Atama leci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

vi

indekiler

Deikenleri Artrmak ve Azaltmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 nek ve Sonek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Kapal Trde Yerel Deikenleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Blm 2 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Yntemler Yazmak ve Kapsam Uygulamak . . . . . . . . . . . . . . . . . 49


Yntemleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Yntem Bildirme Szdizimini Belirlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 return fadeleri Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Yntemleri armak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Yntemin arlma Szdizimini Belirlemek . . . . . . . . . . . . . . . . . . . . . . . . . 53 Kapsam Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Yerel Kapsam Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Snf Kapsamn Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Yntemleri Ar Yklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Yntemler Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Blm 3 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Karar fadeleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67


Boolean Deikenleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Boolean lelerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Eitlik ve likisel leleri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Koullu Mantksal leleri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 le ncelii ve Birleim zelliini zetlemek . . . . . . . . . . . . . . . . . . . . . 70 Karar Vermek iin if fadelerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 if fadesinin Szdizimini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 fadeleri Gruplamak iin Bloklar Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . 73 if fadelerini Basamaklamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 switch fadeleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 switch fadelerinin Szdizimini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 switch fadesi Kurallarn zlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Blm 4 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Bileik Atama ve Yineleme fadeleri Kullanmak . . . . . . . . . . . . . 85


Bileik Atama leleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 while fadeleri Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 for fadeleri Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 for fadesinin Kapsamn Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

indekiler

vii

do fadeleri Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Blm 5 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

Hatalar ve zel Durumlar Ynetmek . . . . . . . . . . . . . . . . . . . . . 103


Hatalarla Baa kmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Kodu Denemek ve zel Durumlar Yakalamak . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Bir zel Durumu lemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Birden ok catch leyici Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Birden ok zel Durumu Yakalamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Denetimli ve Denetimsiz Tamsay Aritmetii Kullanmak . . . . . . . . . . . . . . . . . . 111 Denetlenmi fadeler Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Denetlenmi Deyimler Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 zel Durumlar Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Bir finally Blou Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Blm 6 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Ksm II C#

Dilini Anlamak
Snflandrmay Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Kapsllemenin Amac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Bir Snf Tanmlamak ve Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Eriilebilirlii Denetlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Kurucularla almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Kurucular Ar Yklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 static Yntemleri ve Verileri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Paylalan Bir Alan Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 const Anahtar Szcn Kullanarak bir static Alan Yaratmak . . . . . . 137 Blm 7 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Snflar ve Nesneleri Yaratmak ve Ynetmek . . . . . . . . . . . . . . . 123

Deerleri ve Bavurular Anlamak . . . . . . . . . . . . . . . . . . . . . . . . 145


Veri Tr Deikenleri ve Snflar Kopyalamak . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Null Deerleri ve Null Trlerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Bo Olabilen Trleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Bo Olabilen Trlerin zelliklerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . 152 ref ve out Parametrelerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 ref Parametreleri Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 out Parametreleri Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

viii

indekiler

Bilgisayar Bellei Nasl Dzenlenir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Yn ve bek Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 System.Object Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Kutulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Kutulamay Kaldrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Verileri Gvenli Olarak Dntrmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 is leci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 as leci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Blm 8 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak . . . . . . 167


Numaralandrmalarla almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Bir Numaralandrma Tr Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Numaralandrma Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Numaralandrma Kalp Deerlerini Semek . . . . . . . . . . . . . . . . . . . . . . . 169 Bir Numaralandrmann Arka Plandaki Trn Belirlemek . . . . . . . . . . . 170 Yaplarla almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Bir Yap Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Yap ve Snf Farklarn Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Yap Deikenleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Yap Balatmay Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Yap Deikenlerini Kopyalamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Blm 9 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

10

Dizileri ve Koleksiyonlar Kullanmak . . . . . . . . . . . . . . . . . . . . . . 185


Dizi Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Dizi Deikenleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Bir Dizi Oluumu Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Dizi Deikenlerini Balatmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 rtl Yazlm Dizi Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Dizi elerine Tek Tek Erimek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Bir Dizi Boyunca Yineleme Yapmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Dizileri Kopyalamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Koleksiyon Snflar Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 ArrayList Koleksiyon Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Queue Koleksiyon Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Stack Koleksiyon Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Hashtable Koleksiyon Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 SortedList Koleksiyon Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

indekiler

ix

Koleksiyon Balatclarn Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Dizileri ve Koleksiyonlar Karlatrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Kart Oyunu Oynamak in Koleksiyon Snflarn Kullanmak . . . . . . . . . 201 Blm 10 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

11

Parametre Dizilerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . 207


Dizi Bamsz Deikenlerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Bir params Dizisi Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 params object[ ] Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Bir params Dizisi Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Blm 11 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

12

Kaltm ile almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217


Kaltm Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Kaltm Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Temel Snflar ve Tretilmi Snflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Temel Snf Kurucularn armak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Snflar Atamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 new Yntemleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Virtual (Sanal) Yntemler Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 override Yntemler Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 protected Eriimi Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Uzant Yntemlerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Blm 12 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak . . . . . . . . . 239


Arabirimleri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Arabirim Szdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Arabirim Kstlamalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Bir Arabirim Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Bir Snfa Arabirimi zerinden Bavurmak . . . . . . . . . . . . . . . . . . . . . . . . . 243 oklu Arabirimlerle almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Soyut Snflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Soyut Yntemler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Mhrlenmi Snflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Mhrlenmi Yntemler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Geniletilebilir ereve Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Anahtar Szck Bileimlerini zetlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Blm 13 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

indekiler

14

p Toplama ve Kaynak Ynetimini Kullanmak . . . . . . . . . . . . 257


Bir Nesnenin mr ve mr Uzunluu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Ykclar Yazmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Neden p Toplayc Kullanlr? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 p Toplayc Nasl alr? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 neriler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Kaynak Ynetimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Yok Etme Yntemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 zel Durum-Gvenli Yok Etme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 using fadesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Bir Ykcdan Dispose Yntemini armak . . . . . . . . . . . . . . . . . . . . . . . . 266 Kodu zel Durum-Gvenli Yapmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Blm 14 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

Ksm III Bileenler

Yaratmak

15

Alanlara Erimek in zellikler Uygulamak . . . . . . . . . . . . . . . . 275


Yntemleri Kullanarak Kapslleme Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . 276 zellikler Nelerdir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 zellikleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Salt Okunur zellikler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Salt Yazlr zellikler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 zellik Eriebilirlii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 zellik Kstlamalarn Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 Arabirim zelliklerini Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 zellikleri Bir Windows Uygulamasnda Kullanmak . . . . . . . . . . . . . . . . . 285 Otomatik zellikler retmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 zellikleri Kullanarak Nesneleri Balatmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Blm 15 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

16

Dizinleyicileri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295


Dizinleyici Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Dizinleyici Kullanmayan Bir rnek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Ayn rnein Dizinleyici Kullanan Biimi . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Dizinleyici Eriimcilerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Dizinleyicilerle Dizileri Karlatrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 Arabirimdeki Dizinleyiciler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Dizinleyicileri Bir Windows Uygulamasnda Kullanmak . . . . . . . . . . . . . . . . . . . 303 Blm 16 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

indekiler

xi

17

Program Akn Kesmek ve Olaylar lemek . . . . . . . . . . . . . . . 311


Temsilciler Bildirmek ve Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Otomasyonlu Fabrika Senaryosu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 Temsilci Kullanmadan Fabrika Senaryosunu Uygulamak . . . . . . . . . . . . 312 Temsilci Kullanarak Fabrika Senaryosunu Uygulamak . . . . . . . . . . . . . . . 313 Temsilciler Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Lambda Deyimler ve Temsilciler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Bir Yntem Badatrcs Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Lambda Deyimini Badatrc Olarak Kullanmak . . . . . . . . . . . . . . . . . . . 320 Lambda Deyimlerinin Biimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Bildirimleri Olaylarla Etkinletirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Bir Olay Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Bir Olaya Abone Olmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 Bir Olay Aboneliini ptal Etmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 Bir Olay armak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 WPF Kullanc Arabirimi Olaylarn Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 Olaylar Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 Blm 17 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

18

Genericse Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333


Nesnelerle lgili Sorunlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Generics zm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Generics ve Genelletirilmi Snflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Generics ve Snrlamalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Bir Generic Snf Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 kili Aalar Kuram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Generics Kullanarak kili Aa Snf Oluturmak . . . . . . . . . . . . . . . . . . . 341 Bir Generic Yntem Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 kili Aa Oluturmak in Bir Generic Yntem Tanmlamak . . . . . . . . . . 351 Blm 18 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

19

Koleksiyonlar Numaralandrmak . . . . . . . . . . . . . . . . . . . . . . . . 355


Koleksiyondaki eleri Numaralandrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 Bir Numaralandrcy Elle Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 IEnumerable Arabirimini Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Bir Yineleyici Kullanarak Numaralandrc Uygulamak . . . . . . . . . . . . . . . . . . . . 363 Basit Bir Yineleyici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 Bir Yineleyici Kullanarak Tree<TItem> Snf in Bir Numaralandrc Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Blm 19 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368

xii

indekiler

20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak . . 371


Tmleik Sorgu Dili (LINQ) Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 Bir C# Uygulamasnda LINQ Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Veriyi Semek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 Veriyi Filtrelemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Veriyi Sralamak, Gruplamak ve Toplamak . . . . . . . . . . . . . . . . . . . . . . . . . 377 Verileri Birletirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Sorgu lelerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Tree<TItem> Nesnelerinde Veri Sorgulamak . . . . . . . . . . . . . . . . . . . . . . 383 LINQ ve Ertelenmi Deerlendirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 Blm 20 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392

21

le Ar Yklemesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
leleri Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 le Kstlamalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Ar Yklenmi leler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Simetrik leler Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 Bileik Atamay Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 Artrma ve Azaltma leleri Bildirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 le iftleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 Bir le Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 Dntrme lelerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Yerleik Dntrmeler Salamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Kullanc Tanml Dntrme leleri Uygulamak . . . . . . . . . . . . . . . . . 407 Simetrik leler Yaratmak (Yeniden) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 Bir Kapal Dntrme leci Eklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 Blm 21 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411

Ksm IV Windows

Uygulamalar ile almak

22

Windows Presentation Foundationa Giri . . . . . . . . . . . . . . . . . 415


Bir WPF Uygulamas Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Bir Windows Presentation Foundation Uygulamas Yaratmak . . . . . . . . 416 Forma Denetimler Eklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 WPF Denetimlerini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 zellikleri Dinamik Olarak Deitirmek . . . . . . . . . . . . . . . . . . . . . . . . . . 439 Bir WPF Formda Olaylar lemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 Windows Formsda Olaylar lemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 Blm 22 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449

indekiler

xiii

23

Menler ve letiim Kutularyla almak . . . . . . . . . . . . . . . . . . 451


Men Temel lkeleri ve Stil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Menler ve Men Olaylar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 Bir Men Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 Men Olaylarn lemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 Ksayol Menleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 Ksayol Menleri Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 Windows Ortak letiim Kutular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 SaveFileDialog Snfn Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 Blm 23 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

24

Dorulamay Gerekletirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . 473


Verileri Dorulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 Kullanc Giriini Dorulamak in Stratejiler . . . . . . . . . . . . . . . . . . . . . . . 473 Bir rnek: Mteri Ynetimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 Veri Balamay Kullanarak Dorulamay Gerekletirmek . . . . . . . . . . . 475 Dorulamann Gerekletii Noktay Deitirmek . . . . . . . . . . . . . . . . . 491 Blm 24 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495

Ksm V Veriyi

Ynetmek

25

Bir Veritabannda Bilgi Sorgulamak . . . . . . . . . . . . . . . . . . . . . . 499


ADO.NET Kullanarak Veritaban Sorgulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Northwind Veritaban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Veritaban Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Sipari Bilgisini Sorgulamak in ADO.NET Kullanmak . . . . . . . . . . . . . . . 503 DLINQ Kullanarak Veritabann Sorgulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 Bir Varlk Snf Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 Bir DLINQ Sorgusu Yaratmak ve altrmak . . . . . . . . . . . . . . . . . . . . . . . 514 Ertelenmi ve Annda Veri Almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Tablolar Birletirmek ve liki Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . 517 Ertelenmi ve Annda Veri Almak (Tekrar) . . . . . . . . . . . . . . . . . . . . . . . . . 521 zel DataContext Snf Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522 Sipari Bilgisini Sorgulamak in DLINQ Kullanmak . . . . . . . . . . . . . . . . 523 Blm 25 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

xiv

indekiler

26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529


DLINQ ile Veri Balamay Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 Veri Gncellemek in DLINQ Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 Mevcut Veriyi Gncellemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 Gncelleme akmalarnn stesinden Gelmek . . . . . . . . . . . . . . . . . . . 545 Veri Eklemek ve Silmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Blm 26 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556

Ksm VI Web

Uygulamalar Oluturmak

27

ASP .NETe Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559


Bir Altyap Olarak nterneti Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 Web Sunucu steklerini ve Yantlarn Anlamak . . . . . . . . . . . . . . . . . . . . . 560 Durumu Ynetmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 ASP.NETi Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 ASP.NET ile Web Uygulamalar Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 Bir ASP.NET Uygulamas Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 Sunucu Denetimlerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Bir Tema Yaratmak ve Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 Blm 27 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586

28

Web Formlar Dorulama Denetimlerini Anlamak . . . . . . . . . . 587


Sunucu ve stemci Dorulamalarn Karlatrmak . . . . . . . . . . . . . . . . . . . . . . . 587 Veriyi Web Sunucusunda Dorulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 Veriyi Web Taraycsnda Dorulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 stemci Dorulamas Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Blm 28 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596

29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Gvenlii Ynetmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 Form Tabanl Gvenlii Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 Form Tabanl Gvenlii Uygulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 Veriyi Grntlemek ve Sorgulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 Web Formlar GridView Denetimini Anlamak . . . . . . . . . . . . . . . . . . . . . 605 Mteri ve Sipari Bilgisini Grntlemek . . . . . . . . . . . . . . . . . . . . . . . . . 606 Veriyi Sayfalarda Grntlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611

indekiler

xv

Veriyi Dzenlemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 Bir GridView Denetimi zerinden Satrlar Gncellemek . . . . . . . . . . . . 612 Formlar Arasnda Gezinmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 Blm 29 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621

30

Bir Web Servisi Yaratmak ve Kullanmak . . . . . . . . . . . . . . . . . . . 623


Web Servisi Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623 SOAP Rol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624 Web Servisi Tanmlama Dili Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 Web Servislerinin levsel Olmayan Gereksinimleri . . . . . . . . . . . . . . . . . 625 Windows Communication Foundationn Rol . . . . . . . . . . . . . . . . . . . . 627 Bir Web Servisi Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 ProductService Web Servisini Yaratmak . . . . . . . . . . . . . . . . . . . . . . . . . . 628 Web Servisleri, stemciler ve Proxyler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 SOAP Konumak: Zor Yol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 SOAP Konumak: Kolay Yol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 ProductService Web Servisini Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Blm 30 Hzl Bavuru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .644

Dizin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645

Teekkrler
Eski bir Latin atasz Tempora mutantur, nos et mutantur in illis, der, yani Zaman deiiyor ve biz de zamanla birlikte deiiyoruz. Romallar Microsoft, Windows, .NET Framework ve C# duymadan nce, bu ataszn sylemi olmallar, yoksa Zaman deiiyor ve biz de onu yakalamak iin deli gibi kouyoruz! derlerdi. Son yedi-sekiz yla dnp baktmda, zellikle .NET Framework ve C# dilindeki gelimeler kesinlikle ok artc. Ayrca, bu kitap zerinde iki ylda bir gncelleme yaparak kazanl kmam saladklar iin de teekkr ederim. ikayet etmiyorum, nk uygulamalar ve hizmetler oluturmak iin .NET Framework mkemmel bir ortam. Microsoftun gelitirilmesinde ok byk aba harcayan, eitli rn gruplarndaki ileri grl kiilere teekkrler. Bana gre, C# dili .NET Frameworkn tm avantajlarndan yararlanmak iin en byk aratr. Gelimelerini izlemek ve her yeni srm ktnda yeni zellikler renmek her zaman houma gitti. Bu kitab yazma amacm, C# kefetmeye yeni balayan dier programclara kendi heyecanm yanstmakt. Bu tr projelerin tmnde olduu gibi, kitap yazmak bir grup almasdr. Microsoft Pressteki ekibim ile almak en iyilerinden biriydi. Bu kitabn birka basks boyunca bana gvenini yitirmeyen Lynn Finneli, el yazs ile yazlm msveddeler zerinde dzenlemeler yapan Christina Palaia ve Jennifer Harrisi hepimizi bir srada ve bir programda tutan bir Truval gibi alan Stephen Sagmani zellikle belirtmek isterim. almam gzden geiren, hatalarm dzelterek deiiklikler neren Kurt Meyera verdii abadan dolay zellikle teekkr ederim ve elbette bu kitabn 2001deki ilk basmnn yazlmasna yardmc olan Jon Jaggera teekkrler. Benim sabrl ailem her zaman olduu gibi harikayd. Diana artk DLINQ ve lambda deyimi gibi terimleri biliyor ve kolayca cmle iinde kullanabiliyor. (rnein, DLINQ ve lambda deyimleri hakknda konumaktan hi vazgemeyecek misin?) James hala, hayatm almak yerine bilgisayar oyunlar ile harcadm konusunda srar ediyor. Francesca, Neden bahsettiin hakknda en ufak bir fikrim yok fakat buna bir son vereceini umuyorum diyen bir tavr gelitirdi. Ve Ginger, alma odamdaki sandalyemin rakibi, beni tmyle sandalyeden uzaklatrmak iin bir kedinin yapabileceinin en iyisini yapmaya alt. Her zamanki gibi, Panjurlar Kaldrn! John Sharp

xvii

Giri
Microsoft Visual C#, ncelikle Microsoft .NET Framework kullanarak uygulamalar yaratan yazlm gelitiricileri hedefleyen gl fakat basit bir dildir. C++ ve Microsoft Visual Basicin en iyi zelliklerinin birounu almtr, ancak tutarszlklar ve zaman hatalar kaldrlm, sonuta ortaya daha temiz ve mantkl bir dil kmtr. 2005 ylnda C# 2.0n ortaya kmasyla dile, yineleyiciler ve adsz yntemleri ieren birka yeni zellik eklenmitir. Microsoft Visual Studio 2008in bir paras olan C# 3.0 ise uzant yntemleri, lambda deyimleri ve hepsinden nemlisi, Language Integrated Query zellii ya da LINQ gibi daha fazla zellik ekler. Visual Studio 2008 tarafndan salanan gelitirme ortam, bu gl zelliklerin kullanmn kolaylatrr ve Visual Studio 2008in ierdii birok yeni sihirbaz ve iyiletirmeler, yazlm gelitirici olarak retkenliinizi nemli lde artrr.

Bu Kitap Kim in?


Bu kitabn amac, Visual Studio 2008 ve .NET Frameworkn 3.5 srmn kullanarak C# ile programlama temellerini retmektir. C# dilinin zelliklerini renecek ve Microsoft Windows iletim sistemi zerinde alan uygulamalar oluturmak iin bu zellikleri kullanacaksnz. Kitab tamamladnzda, C# dilini kusursuzca anlam ve onu kullanarak Windows Presentation Foundation (WPF) uygulamalar oluturmu, Microsoft SQL Server veritabanlarna erimi, ASP.NET Web uygulamalar gelitirmi ve bir Windows Communication Foundation hizmeti oluturup kullanm olacaksnz.

Sizin in En yi Balang Noktasn Bulmak


Bu kitap, birok temel alanda yeteneklerinizi gelitirmenize yardmc olmak iin tasarland. Programlamaya yeniyseniz ya da C, C++, Sun Microsystems Java ya da Visual Basic gibi baka bir programlama dilinden gei yapyorsanz bu kitab kullanabilirsiniz. Sizin iin en iyi balang noktasn bulmak iin aadaki tabloyu kullann.

xix

xx Eer

Giri

u admlar izleyin .
1. Bir sonraki Uygulama Dosyalarn Kurmak ve Kullanmak blmnde anlatld gibi, uygulama dosyalarn kurun. 2. Srasyla Ksm I, II ve IIIdeki blmleri aln. 3. Ksm IV, V ve VIy deneyiminiz ve ilginizin belirledii lde tamamlayn.

Nesne-ynelimli programlama konusunda yeniyseniz

C gibi yordamsal programlama dillerine aina iseniz, fakat C# konusunda yeniyseniz,

1. Bir sonraki Uygulama Dosyalarn Kurmak ve Kullanmak blmnde tanmland gibi, uygulama dosyalarn kurun. C# ve Visual Studio 2008 hakknda genel bir bilgi elde etmek iin ilk be blm gzden geirin ve sonra Blm 6-21 arasna younlan. 2. Deneyiminiz ve ilginizin belirledii kadar, Ksm IV, V ve VIy tamamlayn.

C++ ya da Java gibi nesneynelimli bir programlama dilinden gei yapyorsanz

1. Bir sonraki Uygulama Dosyalarn Kurmak ve Kullanmak blmnde anlatld gibi, uygulama dosyalarn kurun. 2. C# ve Visual Studio 2008 hakknda genel bir bilgi elde etmek iin ilk yedi blm gzden geirin ve Blm 8-21 arasna younlan. 3. Windows uygulamalar oluturmak ve veritaban kullanmak hakknda bilgi edinmek iin, Ksm IV ve Vi okuyun. 4. Web uygulamalar ve Web hizmetleri hakknda bilgi edinmek iin Ksm VIy okuyun.

Visual Basic 6dan gei yapyorsanz

1. Bir sonraki Uygulama Dosyalarn Kurmak ve Kullanmak blmnde anlatld gibi, uygulama dosyalarn kurun. 2. Srasyla Ksm I, II ve IIIdeki blmleri aln. 3. Windows-tabanl uygulamalar oluturmak hakknda daha fazla bilgi iin, Ksm IV okuyun. 4. Veritabanna eriim hakknda bilgi iin, Ksm Vi okuyun. 5. Web uygulamalar ve Web hizmetleri hakknda bilgi edinmek iin Ksm VIy okuyun. 6. zel C# ve Visual Studio 2008 yaplar hakknda bilgi iin blmlerin sonundaki Hzl Bavuru ksmlarn okuyun.

Altrmalar zerinde altktan sonra kitaba bavuruyorsanz

1. Belirli konular hakknda bilgiye ulamak iin kitap dizini ya da iindekiler blmn kullann. 2. Blmde sunulan sz dizimi ve tekniklerin zetine ulamak iin her bir blmn sonundaki Hzl Bavuru ksmn okuyun.

Giri

xxi

Kitaptaki Standartlar ve zellikler


Bu kitap, kolay okunur ve izlenebilir olmas iin bilgileri baz standartlar kullanarak sunar. Balamadan nce, kitap boyunca greceiniz standartlar aklayan ve kullanmak isteyebileceiniz yardmc zellikleri vurgulayan aadaki listeyi okuyun.

Standartlar
n

Her altrma, bir dizi grevdir. Her grev, numaralandrlm basamaklar dizisi (1, 2, vb.) olarak gsterilmitir. Yuvarlak madde imi (), altrmann tek admdan olutuunu belirtir. ipucu balkl notlar, bir basama baarl bir ekilde tamamlamak iin ek bilgi ya da alternatif yntemler salar. nemli balkl notlar, devam etmeden nce kontrol etmeniz gereken bilgi hakknda sizi uyarr. Sizin yazacanz metin kaln olarak yazlmtr. ki tu ad arasndaki art iareti (+), bu tulara ayn anda basmanz gerektii anlamna gelir. rnein, Alt+Tab tuuna basn ifadesi, Alt tuunu basl tutarken Tab tuuna da basmanz bildirir.

n n

Dier zellikler
n

Kenar ubuklar kitap boyunca altrmalar hakknda daha ayrntl bilgi salar. Kenar ubuklar arka plan bilgisi, tasarm ipular ya da tartlan konu ile ilgili zellikler ierebilir. Her blm Hzl Bavuru ksm ile sonlanr. Hzl Bavuru ksm, blmde rendiiniz grevleri nasl gerekletireceinize dair ksa hatrlatmalar ierir.

Sistem Gereksinimleri
Bu kitaptaki uygulama altrmalarn tamamlamak iin aadaki donanm ve yazlma gereksiniminiz olacaktr:
n

Windows Vista Home Premium Edition, Windows Vista Business Edition ya da Windows Vista Ultimate Edition. Altrmalar ayrca Service Pack 2 ykl Microsoft Windows XP Professional Edition ile de alr.

xxii

Giri

nemli Windows XP kullanyorsanz, bu kitapta tanmlanan baz iletiim kutular ve ekran grntleri, biraz farkl grnebilir. Bunun nedeni, Windows Vista iletim sisteminin kullanc arayzndeki ve Windows Vistann gvenlik ynetimindeki farkllklardr.
n

Microsoft Visual Studio 2008 Standard Edition, Visual Studio 2008 Enterprise Edition ya da Microsoft Visual C# 2008 Express Edition ve Microsoft Visual Web Developer 2008 Express Edition Service Pack 2 ykl Microsoft SQL Server 2005 Express Edition 1.6-GHz Pentium III+ ilemci ya da zeri 1 GB kullanlabilir fiziksel RAM Video monitr (800 600 ya da daha yksek znrlk) en az 256 renk CD-ROM ya da DVD-ROM src Microsoft fare ya da uygun iaretleme arac

n n n n n n

Ayrca, SQL Server 2005 Express Edition yaplandrmak ve altrmalar gerekletirmek iin bilgisayarnza Administrator (Ynetici) eriimine sahip olmanz gerekmektedir.

Kod rnekleri
Bu kitap ile birlikte verilen CD, altrmalar yaparken kullanacanz kod rneklerini ierir. Kod rneklerini kullanarak, altrma ile ilgili olmayan dosyalar yaratmak iin zaman harcamayacaksnz. Dosyalar ve derslerdeki adm-adm komutlar, ayrca uygulayarak renmenizi salayacak. Bu, yeni bilgileri kavramak ve hatrlamann kolay ve etkili bir yoludur.

Kod rneklerini Kurmak


Kod rneklerini ve gerekli yazlm bilgisayarnza kurmak iin aadaki ilem basamaklarn izleyin. Bylece altrmalarda kod rneklerini kullanabilirsiniz. 1. Kitabn arka kapann i yznde bulunan CDyi paketinden kararak, CD-ROM srcnze takn. Not Son kullanc lisans anlamas, otomatik olarak almaldr. Eer almazsa, masastndeki
Bilgisayarm klasrn ya da Balat mensn an, nce CD-ROM srcnzn simgesini ve daha sonra StartCD.exeyi ift tklayn.

Giri

xxiii

2. Son kullanc lisans anlamasn okuyun. Koullar kabul ediyorsanz, kabul ediyorum seeneini sein ve daha sonra leriyi tklayn. Kitap ile ilgili zelliklerle birlikte bir men grnr. 3. Uygulama Dosyalarn Ykleyini tklayn. 4. Ekranda grnen ynergeleri izleyin. Kod rnekleri bilgisayarnzda aadaki konuma kurulur: Belgeler\Microsoft Press\Visual CSharp Step By Step

Kod rneklerini Kullanmak


Kitaptaki her blm, o blm iin kod rneklerini ne zaman ve nasl kullanacanz aklar. Kod rnei kullanlaca zaman, kitap, dosyalar nasl aacanza dair ynergeleri listeler. nemli Kod rnekleri, yerel Yneticiler grubunun yesi bir hesap kullanlarak test edilmitir. Altrmalar, Ynetici haklarna sahip bir hesap kullanarak yapmanz nerilir. Tm ayrntlar bilmek isteyenler iin, Visual Studio 2008 projeleri ve zmleri kod rneklerinin, bulunduklar klasrlere gre gruplandrlm listesi aadadr.
Proje
Blm 1 TextHello WPFHello Blm 2 PrimitiveDataTypes Bu proje, her bir temel tipi kullanarak nasl deiken tanmlanacan, bu deikenlere nasl deer atanacan ve deiken deerlerinin bir pencerede nasl grntleneceini gsterir. Bu program, aritmetik operatrleri (+ * / %) tantr. Bu proje balang yapmanz salar. Metne dayal selamlama grntleyen basit bir program yaratma basamaklar gsterilmitir. Bu proje, Windows Presentation Foundation kullanarak, selamlamay bir pencerede grntler.

Tanm

MathsOperators

xxiv

Giri

Proje
Blm 3 Methods DailyRate

Tanm
Bu projede, nceki projedeki kodu yeniden inceleyecek ve kodun yntemlerle nasl yaplandrldn aratracaksnz. Bu proje, kendi yntemlerinizi yazmak, yntemleri altrmak ve Visual Studio 2008 hata ayklayc kullanarak yntem armay basamaklandrmak konularn ele alr.

Blm 4 Selection Bu proje, iki tarihin karlatrlmas gibi karmak bir mant uygulamak iin i ie gemi bir if deyimini nasl kullanacanz gsterir. Bu basit program, karakterleri XML gsterimlerine evirmek iin switch deyimini kullanr.

SwitchStatement Blm 5 WhileStatement

Bu proje, bir kaynak dosya ieriini her defasnda bir satr okuyarak, her satr form zerindeki metin kutusunda grntlemek iin while deyimini kullanr. Bu proje, ondalk sayy, sekizlik gsterimine dntrmek iin do deyimini kullanr.

DoStatement Blm 6 MathsOperators

Bu proje, Blm 2, Deikenler, Operatrler ve fadelerle almak blmndeki MathsOperators projesini yeniden inceler ve programn baarsz olmas iin eitli ilenmemi zel durumlar oluturur. Daha sonra, try ve catch anahtar szckleri uygulamay daha gl yapar, bylece program artk baarz olmaz.

Blm 7 Classes Bu proje, kendi snflarnz tanmlamak, ortak kurucular, yntemler ve zel alanlar ile snflarnz tamamlamann temellerini ele alr. Ayrca, new anahtar szcn kullanarak class rneklerini nasl yaratacanz ve statik yntemleri ve alanlar nasl tanmlayacanz gsterir.

Blm 8 Parameters Bu program, deer parametreleri ve bavuru parametreleri arasndaki farkll aratrr. ref ve out anahtar szcklerinin nasl kullanlacan gsterir.

Blm 9 StructsAndEnums Bu proje, takvim tarihini gstermek iin struct tipi tanmlar.

Giri

xxv

Proje
Blm 10 Cards Blm 11 ParamsArrays

Tanm
Bu proje, eldeki oyun kartlarn gruplandrmak iin ArrayList koleksiyon snfn kullanr.

Bu proje, herhangi bir sayda int bamsz deikenini kabul edebilen tek bir yntem yaratmak iin params anahtar szcnn nasl kullanlacan gsterir.

Blm 12 Vehicles ExtensionMethod Bu proje, devralmay kullanarak basit bir tat hiyerarisi yaratr. Ayrca, sanal yntemin nasl tanmlanacan gsterir. Bu proje, bir tamsay deerini 10luk tabandan farkl bir tabana eviren yntem salayan, int tipi iin bir dahili yntemin nasl yaratlacan gsterir.

Blm 13 Tokenizer Bu proje, C# kaynak dosyasn okumak ve dosya ieriini eitli trde jetonlara (tanmlayclar, anahtar szckleri, operatrler vb.) snflandrmann benzetimini yapmak iin snflar ve arabirimlerin hiyerarisini kullanr. Kullanm rnei olarak, ayrca, sembolleri zengin metin kutusunda renkli szdiziminde gstermek iin anahtar arabirimlerden snflar tretir.

Blm 14 UsingStatement Bu proje, Blm 5, Bileik Atama ve Yineleme Deyimlerini Kullanmak blmndeki kk kod parasn yeniden gzden geirir ve zel durum korumal olmadn aa karr. using deyimi ile kodun nasl zel duruma kar gvenli yaplacan gsterir.

Blm 15 WindowProperties Bu proje, ana penceresinin boyutunu grntlemek iin birka zellik kullanan basit Windows uygulamas sunar. Kullanc, pencereyi yeniden boyutlandrdka, grnt otomatik olarak gncellenir. Bu proje, snf iin otomatik zelliklerin nasl oluturulduunu ve snf rneini balatmak iin bunlarn nasl kullanldn gsterir.

AutomaticProperties

Blm 16
Indexers Bu proje iki dizin oluturucu kullanr: biri ad verilmi olan kiinin telefon numarasn arar ve dieri de telefon numaras verilmi olan kiinin adn arar.

Blm 17
Delegates Bu proje, temsilci geri arlarn kullanarak dijital biimde zaman grntler. Daha sonra, olaylar kullanarak kod basitletirilmitir.

xxvi

Giri

Proje
Blm 18 BinaryTree BuildTree Blm 19 BinaryTree IteratorBinaryTree Blm 20 QueryBinaryTree Blm 21 Operators

Tanm
Bu zm, herhangi bir tipte eleman ierebilen bir tipgvenli yap oluturmak iin genelleri (generics) nasl kullanacanz gsterir. Bu zm, herhangi bir tipte parametre alabilen bir tipgvenli yap oluturmak iin genelleri nasl kullanacanz gsterir.

Bu proje, genel BinaryTree snfnda enumerator yaratmak iin genel IEnumerator<T> arayzn nasl uygulayacanz gsterir. Bu zm, genel BinaryTree snfnda enumerator oluturmak iin bir yineleme kullanr.

Bu proje, ikili aa nesnesinden veri almak iin LINQ sorgularnn nasl kullanlacan gsterir.

Bu proje, kullanc-tanml operatrler ieren, Hour, Minute ve Second ad verilen aa yaplarn oluturur. Kod daha sonra dnm operatr kullanlarak basitletirilmitir.

Blm 22 BellRingers Bu proje, stillerin nasl tanmlanacan ve basit WPF denetimlerinin nasl kullanlacan gsteren bir Windows Presentation Foundation uygulamasdr.

Blm 23 BellRingers Bu proje, Blm 22, Windows Presentation Foundationa Giri blmnde yaratlm olan uygulamann uzantsdr. Kullanc arabirimine alan menler eklenmitir.

Blm 24 CustomerDetails Bu proje, rnek olarak mteri bilgisini kullanan bir WPF uygulamasnda, kullanc giriini onaylamak iin i kurallarnn nasl uygulanacan gsterir.

Blm 25 ReportOrders Bu proje, ADO.NET kod kullanarak veritabanna nasl eriileceini gsterir. Uygulama, Northwind veritabanndaki Orders tablosundan bilgi alr. Bu proje, veritabanna erimek ve Northwind veritabanndaki Orders tablosundan bilgi almak iin DLINQnun nasl kullanlacan gsterir.

DLINQOrders

Giri

xxvii

Proje
Blm 26 Suppliers

Tanm
Bu proje, WPF formu zerindeki kontrollerde, veritabanndan ekilen veriyi grntlemek ve biimlendirmek iin WPF uygulamas ile veri balamasnn nasl kullanlacan gsterir.

Blm 27 Litware Bu proje, kullancnn hayali yazlm gelitirme irketi iin alan elemanlar hakknda bilgi girmesini salayan basit bir Microsoft ASP.NET Web sitesi oluturur.

Blm 28 Litware Bu proje, bir nceki blmdeki Litware projesinin geniletilmi srmdr ve ASP.NET Web uygulamasnda kullanc giriinin nasl onaylandn gsterir.

Blm 29 Northwind Bu proje, kullancnn dorulanmas iin Form tabanl gvenliin nasl kullanlacan gsterir. Uygulama ayrca, leklenebilir anlamda veritabannn nasl sorgulanacan ve gncelleneceini ve birden fazla Web formlarna yaylan uygulamalarn nasl yaratlacan gsteren, ASP.NET Web formundan ADO.NET formunun nasl kullanlacan gsterir.

Blm 30 NorthwindServices Bu proje, Northwind veritabannda, Products tablosundaki veriye Internet zerinden uzaktan eriimi salayan, Windows Communication Foundation Web servis uygulamasdr.

Kod rneklerini Kaldrmak


Bilgisayarnzdan kod rneklerini kaldrmak iin aadaki admlar izleyin. 1. Denetim Masas (Control Panel) , Program Ekle/Kaldr (Add or Remove Programs) an. 2. u Anda Ykl Programlar (Currently Installed Programs) listesinden, Microsoft Visual C# Step by Stepi sein. 3. Kaldr (Remove) tklayn. 4. Kod rneklerini kaldrmak iin ynergeleri izleyin.

xxviii

Giri

Kitap in Destek
Bu kitabn ve ekinde verilen CDnin ieriinin doruluundan emin olmak iin her trl aba gsterilmitir. Dzeltmeler ya da deiiklikler toplandka, Microsoft Knowledge Base makalesine eklenecektir. Microsoft Press, kitaplar ve kitap ekinde verilen CDler iin aadaki Web sitesinde kullanc destei salar: http://www.microsoft.com/learning/support/books/

Sorular ve Yorumlar
Kitapla ya da yannda verilen CD ile ilgili soru, yorum ya da fikirleriniz varsa ya da yukardaki sitede cevabn bulamadnz sorularnz varsa, ltfen, e-posta yoluyla ya da posta yoluyla bize iletin. E-posta adresi: info@arkadas.com.tr Posta adresi: Arkada Yaynevi Yuva Mahallesi 3702. Sokak No: 4 Yenimahalle/Ankara www.arkadas.com.tr Ltfen, yukardaki adreslerden Microsoft yazlm destei verilmediini unutmayn.

Adm Adm Microsoft Visual C# 2008

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri


Bu ksmdaki konular: Blm 1 . C#a Hogeldiniz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Blm 2 . Deikenler, leler ve Deyimlerle almak . . . . . . . . . . . . . . . . . . . . . . 29 Blm 3 . Yntemler Yazmak ve Kapsam Uygulamak . . . . . . . . . . . . . . . . . . . . . . . 49 Blm 4 . Karar fadeleri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Blm 5 . Bileik Atama ve Yineleme fadeleri Kullanmak . . . . . . . . . . . . . . . . . . . 85 Blm 6 . Hatalar ve zel Durumlar Ynetmek . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Ksm I

Blm 1

C#a Hogeldiniz
Bu blm tamamladktan sonra renecekleriniz:
n n n n

Microsoft Visual Studio 2008 programlama ortamn kullanmak Bir C# konsol uygulamas yaratmak Ad alan amacn aklamak Basit grafiksel C# uygulamas yaratmak

Microsoft Visual C#, Microsoftun gl bileen-ynelimli dilidir. C#, Microsoft.NET Framework mimarisinde nemli rol oynar ve kimileri C dilinin UNIX ortamnda oynad rolle karlatrma yapar. C, C++ ya da Java gibi dilleri biliyorsanz, C# szdizimini olduka aina bulacaksnz. Dier dillerde programlamaya alknsanz, C# szdizimini ksa srede kavrayabilirsiniz; sadece ayra ve noktal virglleri doru yere koymanz gerekir. Umarz, bu size tam olarak yardmc olacak kitaptr! Ksm Ide, C# temellerini reneceksiniz. Nasl deiken bildirimi yapacanz ve deikenlerdeki deerleri ilemek iin toplama iareti (+) ve karma iareti (-) gibi aritmetik operatrleri nasl kullanacanz reneceksiniz. Yntemleri nasl yazacanz ve yntemlere bamsz deiken gndermeyi greceksiniz. Ayrca if gibi seim deyimlerini ve while gibi yineleme deyimlerini nasl kullanacanz reneceksiniz. Son olarak, C#n hatalarn stesinden gelmek iin, zel durumlar incelikle ve kolay kullanlr biimde, nasl kullandn anlayacaksnz. Bu konular C#n zn ekillendirir ve bu kuvvetli temelden sonra Ksm IIden KsmVIya doru daha ileri seviye zelliklere doru ilerleyeceksiniz.

Visual Studio 2008 Ortamn Kullanarak Programlamaya Balamak


Visual Studio 2008, byk ya da kk C# projeleri oluturmanz iin gereken tm ilevsellii ieren zengin aralara sahip programlama ortamdr. Farkl programlama dilleri kullanlarak derlenmi modlleri tek bir modl gibi birletiren projeler bile oluturabilirsiniz. lk altrmada, Visual Studio 2008 programlama ortamn balatacak ve konsol uygulamasn nasl yaratacanz reneceksiniz. Not Konsol uygulamas, grafiksel kullanc arayznden ok, komut satr penceresinde alan
uygulamadr.

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Visual Studio 2008de konsol uygulamas yaratmak


n

Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, Visual Studio 2008i balatmak iin aadaki ilemleri gerekletirin: 1. Microsoft Windows grev ubuu zerinde Start dmesini tklayn, All Programs mensn ve daha sonra da Microsoft Visual Studio 2008 program grubunu sein. 2. Microsoft Visual Studio 2008 program grubunda, Microsoft Visual Studio 2008 seeneini tklayn. Aadaki gibi, Visual Studio 2008 balar:

Not Visual Studio 2008i ilk defa altryorsanz, varsaylan ortam ayarlarnz semeniz iin uyarda bulunan bir iletiim kutusu kabilir. Visual Studio 2008, sizin tercih ettiiniz programlama diline uygun olarak kendini uyarlayabilir. Tmleik gelitirme ortamndaki (Integrated Development Environment, IDE ) eitli iletiim kutular ve aralar, setiiniz programlama dili iin varsaylan seimler kmesine sahip olacaktr. Listeden Visual C# Development Settingsi sein ve sonra Start Visual Studio dmesini tklayn. Ksa bir beklemeden sonra, Visual Studio 2008 IDE grnecektir.
n

Visual C# 2008 Express Edition kullanyorsanz, Microsoft Windows grev ubuu zerinde, Start dmesini tklayn, All Programs iaret edin ve daha sonra Microsoft Visual C# 2008 Express Edition tklayn.

Blm 1

C#a Hogeldiniz

Visual C# 2008 Express Edition aadaki gibi alr:

Not Kitap boyunca tekrarlamadan kanmak iin, Visual Studio 2008 Standard Edition, Visual Studio 2008 Professional Edition ya da Visual C# 2008 Express Edition amanz gerektiinde, basite Visual Studioyu Balat diyeceiz.
n

Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, yeni bir konsol uygulamas yaratmak iin aadaki ilemleri gerekletirin. 1. File mens zerinde Newi iaret edin ve daha sonra Project seeneini tklayn. New Project iletiim kutusu alr. Bu iletiim kutusu, uygulama oluturmak iin balang olarak kullanabileceiniz ablonlar listeler. letiim kutusu kullandnz programlama diline ve uygulama tipine uygun olarak ablonlar kategorilere ayrr. 2. Project types blmesinde, Visual C# tklayn. Templates blmesindeki Console Application simgesini tklayn.

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

3. Location alannda, Windows Vista iletim sistemi kullanyorsanz, C:\Users\ Adnz\Belgeler\Microsoft Press\Visual CSharp Step By Step\Chapter1 yazn. Windows XP ya da Windows Server 2003 kullanyorsanz, C:\Documents and Settings\Adnz\Belgelerim\Microsoft Press\Visual CSharp Step By Step\ Chapter 1 yazn. Buradaki Adnz ksmn Windows kullanc adnz ile deitirin. Not Kitabn geri kalan blmnde yer kazanmak asndan, C:\Users\Adnz\Belgeler ya

da C:\Documents and Settings\Adnz\Belgelerim yolunu, sizin Belgeler klasrnz olarak adlandracam.

pucu Belirttiiniz klasr bulunmuyorsa, Visual Studio 2008 sizin iin oluturacaktr. 4. Name alanna, TextHello yazn. 5. Create directory for solution onay kutusunun seili olduundan emin olun ve daha sonra OKi tklayn.
n

Visual C# 2008 Express Edition kullanyorsanz, New Project iletiim kutusu proje dosyalarnzn konumunu belirtmenize imkan vermeyecektir; varsaylan olarak C:\Users\Adnz\AppData\Local\Temporary Projects klasrn kullanr. Aadaki ilemleri yaparak bu klasr deitirin: 1. Tools mensnde, Options seeneini tklayn. 2. Options iletiim kutusunda, Show All Settings kutucuunu iaretleyin ve daha sonra sol blmedeki aa grnmnde Projects and Solutions tklayn. 3. Sa blmede, Visual Studio projects location metin kutusunda, Belgeler klasrnzn altndaki Microsoft Press\Visual CSharp Step By Step\Chapter 1 klasrn belirleyin. 4. OKi tklayn. Visual C# 2008 Express Edition kullanyorsanz, yeni bir konsol uygulamas oluturmak iin aadaki ilemleri yapn. 1. File mens zerinde New Project seeneini tklayn. 2. New Project iletiim kutusundaki, Console Application simgesini tklayn. 3. Name alanna TextHello yazn. 4. OKi tklayn.

Blm 1

C#a Hogeldiniz

Visual Studio Console Application ablonunu kullanarak proje oluturur ve aadaki gibi bir balang kodu grntler:

Ekrann st ksmndaki men ubuu, programlama ortamnda kullanacanz zelliklere eriim salar. Tm Windows-tabanl programlarda yaptnz gibi, menler ve komutlara erimek iin klavye ya da fareyi kullanabilirsiniz. Ara ubuu, men ubuunun altnda yer alr ve en sk kullanlan komutlar altrmak iin dme ksayollar salar. IDEnin ana ksmn dolduran Code and Text Editor penceresi, kaynak dosyalarn ieriklerini grntler. okdosyal bir projede, birden fazla dosya dzenlediinizde, her kaynak dosya, kaynak dosyann adyla kendi sekme etiketine sahiptir. Adlandrlm kaynak dosyasn Code and Text Editor penceresinde n plana getirmek iin sekmeyi tklayabilirsiniz. Solution Explorer proje ile ilgili dosyalarn adlarn dier paralar arasnda grntler. Kaynak dosyay Code and Text Editor penceresinde n plana getirmek iin ayn zamanda, Solution Explorer da dosya adn ifttklayabilirsiniz. Kod yazmadan nce, Visual Studio 2008in projenizin paras olarak oluturduu Solution Explorerda listelenen dosyalar inceleyin:
n

TextHello zm Bu, uygulama bana bir tane olan st-seviye zm dosyasdr. Belgeler\Microsoft Press\Visual CSharp Step by Step\Chapter 1\TextHello klasrnze bakmak iin Windows Gezginini kullanrsanz, bu dosyann gerek adnn TextHello.sln olduunu grrsnz. Her zm dosyas, bir ya da daha fazla proje dosyasna bavurular ierir.

Ksm I
n

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

TextHello C# proje dosyasdr. Her proje dosyas, kaynak kod ve proje iin dier paralar ieren bir ya da daha fazla dosyaya bavurur. Tek bir projedeki tm kaynak kodlar ayn programlama dilinde yazlmak zorundadr. Windows Gezgininde, bu dosya gerekte TextHello.csproj olarak adlandrlr ve \Belgelerim\ Microsoft Press\Visual CSharp Step by Step\Chapter 1\TextHello\TextHello klasrnzde saklanr. zellikler TextHello projesindeki klasrdr. Bu klasr geniletirseniz, AssemblyInfo.cs adnda bir dosya ierdiini grrsnz. AssemblyInfo.cs dosyas programa, yazar ad, programn yazld tarih ve bu gibi znitelikler eklemek iin kullanabileceiniz zel bir dosyadr. Programn alma yntemini deitirmek iin ek znitelikler belirleyebilirsiniz. Bu zniteliklerin nasl kullanlacan renmek, bu kitabn kapsam dndadr. Bavurular Uygulamanzn kullanabilecei derlenmi koda bavurular ieren klasrdr. Kod derlendiinde, derlemeye dntrlr ve benzersiz ad verilir. Yazlm gelitiriciler, yazdklar kullanl kod bitlerini paketlemek iin derlemeleri kullanr, bylece kendi uygulamalarnda kodu kullanmak isteyebilecek dier yazlm gelitiricilere kodu databilirler. Bu kitab kullanarak uygulamalar yazarken kullanacanz zelliklerin bir ou, Microsoft tarafndan Visual Studio 2008 ile salanan derlemelerden yararlanr. Program .cs Bu C# kaynak dosyasdr ve proje ilk oluturulurken Code and Text Editor penceresinde grntlenen dosyadr. Konsol uygulamas iin kodunuzu bu dosyada yazacaksnz. Ayrca, Visual Studio 2008in otomatik olarak salad, ksaca inceleyeceiniz baz kodlar ierir.

lk Programnz Yazmak
Program.cs dosyas, Main ad verilen bir yntem ieren Program adnda bir snf tanmlar. Tm yntemler, snf iinde tanmlanmaldr. Snflar ve Nesneler Oluturmak ve Ynetmek balkl 7. blmde snflar daha ayrntl olarak greceksiniz. Main yntemi zeldir (programn giri noktasn belirtir). Statik yntem olmak zorundadr (Blm 3, Yntemler Yazmak ve Kapsam Uygulamak blmnde yntemleri daha ayrntl gzden geireceksiniz. 7. blmde de statik yntemleri ele aldk.) nemli C#nin nemi, kk-byk harfa duyarl bir dil olmasdr. Main yntemini byk M
harfi ile yazmanz gerekir.

Aadaki altrmalarda, konsolda Hello Word iletisini grntlemek iin kod yazacaksnz; Hello World konsol uygulamasn oluturacak ve altracaksnz ve kod elemanlarn blmlemek iin ad alanlarnn nasl kullanldn reneceksiniz.

Blm 1

C#a Hogeldiniz

IntelliSense kullanarak kod yazn


1. Program.cs dosyasn grntleyen Code and Text Editor penceresinde, kme parantezi {, atktan hemen sonra imleci Main yntemi zerine getirin ve yeni bir satr oluturmak iin Enter tuuna basn. Yeni satr zerinde, yerleik snf ad olan Console kelimesini yazn. Siz C harfini yazar yazmaz, IntelliSense listesi grnecektir. Bu liste bu balamda geerli olan C# anahtar szckleri ve veri trlerinin tmn ierir. Kelimenin tamann yazabilir ya da listeyi aaya doru ekerek fare ile Console esini ift tklayabilirsiniz. Alternatif olarak, Con yazdktan sonra, IntelliSense otomatik olarak listeyi Console esi zerinde yuvalandrr; eyi semek iin Tab ya da Enter tuuna basabilirsiniz. Main yntemi u ekilde grnmelidir:
static void Main(string[] args) { Console }

Not Console, ekranda iletileri grntlemek ve klavyeden girilen deerleri elde etmek iin yntemler ieren yerleik snftr. 2. Console kelimesinden hemen sonra nokta (.) yazn. Yntemleri, zellikleri ve Console snfnn alanlarn gsteren bir dier IntelliSense listesi grnecektir. 3. Listeyi aaya doru kaydrn, WriteLine sein ve Enter tuuna basn. Alternatif olarak, WriteLine seilene kadar W, r, i, t, e, L harflerini yazmaya devam edebilir ve daha sonra da Enter tuuna basabilirsiniz. IntelliSense listesi kapanr ve WriteLine kelimesi kaynak dosyaya eklenir. Main imdi u ekilde grnmelidir:
static void Main(string[] args) { Console.WriteLine }

4. Ak parantez ,(, yazn. Baka bir IntelliSense ipucu grnr. Bu ipucu WriteLine ynteminin alabilecei parametreleri grntler. Aslnda, WriteLine ar yklenmi (overloaded) yntemdir, Console snfnn WriteLine olarak adlandrlm birden fazla yntem iermesi anlamna gelir; gerekten de bu yntemin 19 farkl srmn salar. WriteLine ynteminin her bir srm, farkl veri trlerinin kts iin kullanlabilir. (Blm 3, ar yklenmi yntemleri ayrntlar ile ele alr). Main yntemi imdi u ekilde grnmelidir:
static void Main(string[] args) { Console.WriteLine( }

10

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

pucu: WriteLine ynteminin farkl ar yklenmeleri zerinde gezinmek iin ipucundaki


yukar ve aa oklarn tklayabilirsiniz.

5. Kapal parantez ve noktal virgl (;) yazn. Main yntemi imdi u ekilde grnmelidir:
static void Main(string[] args) { Console.WriteLine(); }

6. mleci hareket ettirin ve WriteLine ynteminden sonra parantez arasnda trnak iaretleri ile birlikte Hello World dizesini yazn. Main yntemi imdi u ekilde grnmelidir:
static void Main(string[] args) { Console.WriteLine(Hello World); }

pucu indekileri yazmadan nce parantez ve ssl parantezleri ii bo olarak ( ) ve { } eklinde


yazn. Parantez iindekini yazdktan sonra, parantezi kapatmak kolay unutulabilir.

IntelliSense Simgeleri
Snf adndan sonra nokta iareti (.) koyduunuzda, IntelliSense, o snfn her bir yesinin adn grntler. Her ye adnn solunda, yenin trn gsteren bir simge bulunur. Yaygn simgeler ve trleri aadaki gibidir:
Simge Anlam
method (Blm 3de incelenmitir) property (Blm 15de incelenmitir) class (Blm 7de incelenmitir) struct (Blm 9da incelenmitir) enum (Blm 9da incelenmitir)

Blm 1

C#a Hogeldiniz

11

Simge

Anlam
interface (Blm 13de incelenmitir) delegate (Blm 17de incelenmitir) extension method (Blm 12de incelenmitir)

Farkl ieriklerle kod yazdka dier IntelliSense simgelerini de greceksiniz

Not Sk sk iki eik izgi, //, sonrasnda normal metin ieren kod satrlar greceksiniz. Bunlar yorumlardr. Derleyici tarafndan yok saylr fakat programn tam olarak ne yaptn akladndan, yazlm gelitiriciler iin olduka kullanldr. rnein:
Console.ReadLine(); // Enter tuuna basmak iin kullancy bekleyin

Derleyici, iki eik izgiden satr sonuna kadar olan ksmdaki metni atlayacaktr. Ayn zamanda, eik izgi sonrasnda yldz iareti (/*) ile balayan birden fazla satrda yer alan yorumlar da ekleyebilirsiniz. Derleyici, yldz iareti sonrasnda eik izgi (*/) bulana kadar hereyi atlar; aaya doru inen ok sayda satr olabilir. Kodunuzu, gerektii kadar anlaml yorumlarla belgelemeye tevik edilirsiniz.

Konsol uygulamasn oluturun ve altrn


1. Build mens zerinde, Build Solution seeneini tklayn. Bu hareket C# kodunu derler, altrabileceiniz programla sonulanr. Code and Text Editor penceresi altnda Output penceresi grnr. pucu Output penceresi ortaya kmazsa, grntlemek iin View mens zerinde
Output seeneini tklayn.

Output penceresinde, programn nasl derlendiini gsteren aadakine benzer iletiler grmelisiniz.
------ Build started: Project: TextHello, Configuration: Debug Any CPU ---C:\Windows\Microsoft.NET\Framework\v3.5\Csc.exe /config /nowarn:1701;1702 Compile complete -- 0 errors, 0 warnings TextHello -> C:\Documents and Settings\John\My Documents\Microsoft Press\ ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========

Hatalar yapmsanz, bu hatalar Error List penceresinde grnecektir. Aadaki ekran grnts, WriteLine ifadesinde Hello World metninden sonra parantezi kapatmay

12

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

unutursanz neler olacan gsterir. Tek bir hatann bazen ok sayda derleme hatasna neden olabileceine dikkat edin.

pucu Error List penceresindeki eyi ift tklayabilirsiniz. mle hataya neden olan satr

zerine yerleir. Visual Studio, derlenmeyecek kod satrlarn, altnda dalgal krmz izgi ile gsterir.

nceki ynergeleri dikkatlice izlediyseniz, hibir hata ya da uyar olmamal ve program baarl olarak almaldr. pucu Build Solution komutu dosyay otomatik olarak kaydettii iin oluturmadan nce

dosyay kaydetmeniz gerekmez. Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, proje oluturduunuz zaman belirtilen konumda kaydedilir. Visual C# 2008 Express Edition kullanyorsanz, proje geici bir konumda kaydedilir ve sadece File mens zerindeki Save All komutunu kullanarak projeyi kaydettiinizde ya da Visual C# 2008 Express Edition kapattnzda grnen Options iletiim kutusunda belirtilen klasre kopyalanr. Code and Text Editor penceresinin zerindeki sekmedeki dosya adndan sonra yer alan yldz iareti, dosyann son kaydedildiinden beri deitirildiini gsterir.

Blm 1

C#a Hogeldiniz

13

2. Debug mensnde, Start Without Debugging tklayn. Komut penceresi alr ve program alr. HelloWord iletisi grnr ve daha sonra aadaki ekran grntsnde gsterildii gibi program herhangi bir tua basmanz bekler.

Not Press any key to continue uyars Visual Studio tarafndan oluturulmutur; bunun iin herhangi bir kod yazmazsnz. Program Debug mens zerindeki Start Debugging komutunu kullanarak balattysanz, uygulama alr fakat komut penceresi sizin bir tua basmanz beklemeden aniden kapanr. 3. Program sonucunu gsteren komut penceresinin etkin olduundan emin olun ve Enter tuuna basn. Komut penceresi kapanr ve Visual Studio 2008 programlama ortamna dnersiniz. 4. Solution Explorerda, TextHello projesini (zm deil) tklayn ve daha sonra Solution Explorer ara ubuu zerindeki Show All Files ara ubuu dmesini tklayn (Solution Explorer penceresindeki ara ubuu zerinde soldan ikinci dmedir). Program.cs dosyasnn stnde bin ve obj olarak adlandrlm giriler grnr. Bu giriler, dorudan proje klasrndeki (Microsoft Press\Visual CSharp Step by Step\ Chapter 1\TextHello\TextHello), bin and obj dosyalarna karlk gelir. Uygulamanz oluturduunuzda, Visual Studio bu klasrleri yaratr ve bu klasrler, uygulamay oluturmak ve hata ayklamak iin kullanlan baz dier dosyalar ile birlikte, programn uygulanabilir srmn ierirler. 5. Solution Explorerda, bin giriinin solundaki art iaretini (+) tklayn. Debug olarak adlandrlm bir dier klasr ortaya kar. Not Ayrca, Release olarak adlandrlm bir klasr de grebilirsiniz.

14

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

6. Solution Explorerda, Debug klasrnn solundaki art iaretini (+) tklayn. Aadaki gibi, TextHello.exe, TextHello.pdb, TextHello.vshost.exe ve TextHello.vshost. exe.manifest olarak adlandrlm drt e daha grnr:
Show All Files

Not Visual C# 2008 Express Edition kullanyorsanz, bu dosyalarn tmn gremeyebilirsiniz. TextHello.exe dosyas derlenmi programdr ve Debug mensnde Start Without Debugging tkladnzda alan dosyadr. Dier dosyalar, programnz Debug modda altrdnzda (Debug mensnde Start Debugging tkladnzda), Visual Studio 2008 tarafndan kullanlan bilgiyi ierir.

Ad Alanlarn Kullanmak
imdiye kadar grdnz rnek, ok kk bir programdr. Bununla birlikte, kk programlar byyerek ok byk programlara dnebilir. Program bydke, iki sorun ortaya kar. lki, byk programlar anlamak ve bakmn yapmak, kk programlar anlamak ve bakmn yapmaktan zordur. kincisi, daha fazla kod genellikle daha fazla ad, daha fazla yntem ve daha fazla snf demektir. Ad says arttka, iki ya da daha fazla ad akacandan projenin hata oluturma olasl da artar (zellikle program, ayrca ayn adlar kullanm olan yazlm gelitiriciler tarafndan yazlm nc parti ktphaneleri kullandnda). Gemite, programclar ad-akmas problemini, adlarn nne bir tr niteleyici (ya da niteleyici kmesi) n eki koyarak zmeye altlar. leklenebilir olmadndan bu iyi bir zm deildir; adlar uzun olmaya balayabilir ve yazlm yazmak iin daha az, adlar yazmak, okumak ve anlalmayan uzun adlar tekrar okumak iin daha fazla zaman harcayabilirsiniz.

Blm 1

C#a Hogeldiniz

15

Ad alanlar, snflar gibi, dier tanmlayclar iin adlandrlm toplayc kap yaratarak bu problemi zmenize yardmc olur. Ayn adla iki snf, farkl ad alanlarnda yer alyorlarsa, birbirine kartrlmazlar. Aadaki gibi, TextHello olarak adlandrlm alan ad iinde Greeting adnda bir snf yaratabilirsiniz:
namespace TextHello { class Greeting { ... } }

Daha sonra programlarnzda TextHello.Greeting olarak Greeting snfna bavurabilirsiniz. Baka bir yazlm gelitirici de NewNamespace gibi farkl bir ad alannda Greeting snf yaratrsa ve sizin bilgisayarnza yklerse, programlarnz TextHello.Greeting snfn kullandndan, yine istenildii gibi alr. Dier yazlm gelitiricinin Greeting snfna bavurmak isterseniz, NewNamespace.Greeting olarak belirtmeniz gerekir. Tm snflarnz ad alanlarnda tanmlamak iyi bir uygulamadr ve Visual Studio 2008 ortam st seviye ad alan olarak projenizin adn kullanarak bu tavsiyeye uyar. .NET Framework yazlm gelitirme paketi de (SDK) bu neriye bal kalr; .NET Frameworkdeki her snf, bir ad alan iinde yer alr. rnein, Console snf System ad alan iinde yer alr. Bu, tam adnn aslnda System.Console olmas demektir. Elbette, her kullandnzda snfn tam adn yazmak zorunda olsaydnz, bu durum, niteleyicileri n ek olarak eklemekten ya da snf, ad alan zahmetine girmeden, SystemConsole gibi baz genel benzersiz bir adla adlandrmaktan daha iyi olmayacakt. Neyse ki, bu problemi programlarnzda using ynergesi kullanarak zebilirsiniz. Visual Studio 2008de TextHello programna dnerek, Code and Text Editor penceresinde Program.cs dosyasna bakarsanz, dosyann stnde aadaki ifadeleri grrsnz:
using using using using System; System.Collections.Generic; System.Linq; System.Text;

using ifadesi, kapsama ad alan getirir. Ayn dosyada, bir sonraki kodda, artk nesneleri ak bir ekilde ait olduklar ad alan ile nitelendirmeniz gerekmez. Gsterilen drt ad alan, siz her yeni proje yarattnzda Visual Studio 2008in bu using ifadelerini otomatik olarak ekledii, olduka sk kullanlan snflar kapsar. Kaynak dosyasnn stne daha fazla using ynergeleri ekleyebilirsiniz. Aadaki altrma ad alan kavramn daha ayrntl olarak gsterir.

16

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Uzun adlar kullanmay deneyin


1. Program.cs dosyasn grntleyen Code and Text Editor penceresinde, dosyann zerindeki ilk using yndergesini aadaki ekilde yorum satr haline getirin:
//using System;

2. Build mensnde, Build Solution tklayn. Oluturma ilemi hata verir ve Error List penceresi aadaki hata iletisini gsterir:
The name Console does not exist in the current context.

3. Error List penceresinde, hata iletisini ift tklayn. Program.cs kaynak dosyasnda hataya neden olan tanmlayc seilir. 4. Code and Text Editor penceresinde, tam olarak tanmlanm System.Console adn kullanmak iin Main yntemini dzenleyin. Main u ekilde grnmelidir:
static void Main(string[] args) { System.Console.WriteLine(Hello World); }

Not System yazdnzda, IntelliSense tarafndan System ad alanndaki tm elerin ad grntlenir. 5. Build mensnde, Build Solution tklayn. Bu defa oluumun baarl olmas gerekir. Baarl olmazsa, Main ynteminin tam olarak bir nceki kodda grnd gibi olduundan emin olun ve daha sonra tekrar oluturmay deneyin. 6. Uygulamann altndan emin olmak iin, Debug mensnde Start Without Debugging tklayarak uygulamay altrn.

Ad Alanlar ve Derlemeleri Kullanmak


using ifadesi, ad alanndaki eleri basite kapsam iine getirir ve kodunuzda snf adlarn tam olarak nitelendirmek zorunda kalmazsnz. Snflar, derlemelere (assemblies) derlenir. Derleme, genellikle .dll dosya uzantsna sahip dosyadr. Ak konumak gerekirse, .exe dosya ad uzants ile uygulanabilir programlar da derlemelerdir.

Blm 1

C#a Hogeldiniz

17

Derleme, ok sayda snf ierebilir. System.Console gibi, .NET Framework snf ktphanesinin ierdii snflar, Visual Studio ile birlikte bilgisayarnza yklenmi olan derlemelerde salanmtr. .NET Framework snf ktphanesinin binlerce snf ierdiini greceksiniz. Tm ayn derlemede tutulmu olsayd, derleme ok byk olur ve bakm zor olurdu. (Microsoft, tek bir snftaki tek bir yntemi gncellediinde, tm snf ktphanesini tm yazlm gelitiricilere datmak zorunda kalrd!) Bu nedenle, .NET Framework snf ktphanesi, snflarn ilikili olduu ilevsel alan tarafndan ayrlm ok sayda derlemeye blnmtr. rnein, System.Console gibi tm ortak snflar ieren bir ekirdek derleme ve veritabanlarn, Web hizmetlerine eriimi, grafiksel kullanc arayz oluturmay ve bunun gibi eyleri ilemek iin snflar ieren daha fazla derleme vardr. Bir snf derlemede kullanlr yapmak istiyorsanz, projenize o derleme iin bavuru eklemeniz gerekir. Daha sonra kodunuza, o derlemedeki ad alanlarndaki eleri, kapsam iine getiren using ifadelerini ekleyebilirsiniz. Derleme ve ad alan arasnda 1:1 eitlie gerek olmadn not etmelisiniz; tek bir derleme birden fazla ad alan iin snf ierebilir ve tek bir ad alan birden fazla derlemeye yaylabilir. Bu ilk nce olduka karmak gibi gelebilir, fakat yaknda alacaksnz. Bir uygulama yaratmak iin Visual Studio kullandnzda, setiiniz ablon otomatik olarak uygun derlemeye bavuru ierir. rnein, TextHello projesi iin Solution Explorerda References klasrnn sol tarafndaki art iaretini (+) tklayn. Konsol uygulamasnn, System, System.Core, System.Data ve System.Xml olarak adlandrlm derlemelere otomatik olarak bavurular ierdiini greceksiniz. References klasrn farenin sa dmesiyle tklayp Add Referencea tklayarak projenize ilave derlemeler iin referanslar ekleyebilirsiniz; bu ilemi sonraki altrmalarda uygulayacaksnz.

Grafiksel Uygulama Yaratmak


imdiye kadar, basit Konsol uygulamas yaratmak ve altrmak iin Visual Studio 2008i kullandnz. Visual Studio 2008 programlama ortam ayn zamanda grafiksel Windows-tabanl uygulamalar oluturmak iin ihtiyacnz olan hereyi kapsar. Windows tabanl uygulamann forma dayal kullanc arayzn etkileimli olarak tasarlayabilirsiniz. Visual Studio 2008, daha sonra tasarladnz kullanc arayzn uygulamak iin program ifadelerini oluturur. Visual Studio 2008 grafiksel uygulamann iki grnmn salar: tasarm grnm ve kod grnm. Grafiksel uygulama iin kod ve mant deitirmek ve bakmn yapmak iin Code and Text Editor penceresini ve kullanc arayzn yerletirmek iin de Design

18

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

View penceresini kullanrsnz. stediiniz zaman bu iki grnmn birinden tekine gei yapabilirsiniz. Aadaki altrmalarda Visual Studio 2008 kullanarak grafiksel uygulamay nasl yaratacanz reneceksiniz. Bu program, adnz girebileceiniz bir metin kutusu ve bastnzda ileti kutusunda bir selamlama iletisi gsterecek olan bir dme ieren, basit bir form grntler. Not Visual Studio 2008 grafiksel uygulamalar oluturmak iin iki ablon salar: Windows Forms

Application ablonu ve WPF Application ablonu. Windows Formlar ilk olarak .NET Framework srm 1.0 ile ortaya km olan bir teknolojidir. WPF ya da Windows Presentation Foundation, ilk olarak .NET Framework srm 3.0 ile ortaya km olan gelitirilmi teknolojidir. Windows Formlarna birok ek zellik ve kapasite salar. Tm yeni yazlm gelitirmeleri iin WPF, Windows Formlarna tercih etmelisiniz.

Visual Studio 2008de grafiksel uygulama yaratn


n

Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, yeni bir grafiksel uygulama yaratmak iin aadaki ilemleri gerekletirin: 1. File mensnde, Newi iaret edin ve daha sonra Projecti tklayn. New Project iletiim kutusu alr. 2. Project Types blmesinde Visual C# tklayn. 3. Templates blmesinde, WPF Application simgesini tklayn. 4. Location alannn Belgeler\Microsoft Press\Visual CSharp Step by Step\Chapter 1 klasrn gsterdiinden emin olun. 5. Name alanna WPFHello yazn. 6. Solution alannda, Create new solution n seili olduundan emin olun. Bu eylem projeyi tutmak iin yeni bir zm yaratr. Alternatif olarak, Add to Solution, projeyi TextHello zmne ekler. 7. OKi tklayn. Visual C# 2008 Express Edition kullanyorsanz, yeni bir grafiksel uygulama yaratmak iin aadaki ilemleri gerekletirin. 1. File mensnde New Projecti tklayn. 2. New Project ileti kutusu grnrse, TextHello projenizde yaptnz deiiklikleri kaydetmek iin Savei tklayn. Save Project iletiim kutusunda, Location alannn Belgeler klasr altndaki Microsoft Press\Visual CSharp Step by Step\Chapter 1 dosyasna ayarlanm olduunu dorulayn ve daha sonra Savei tklayn.

Blm 1

C#a Hogeldiniz

19

3. New Project iletiim kutusunda, WPF Application simgesini tklayn. 4. Name alanna WPFHello yazn. 5. OKi tklayn. Visual Studio 2008 geerli uygulamanz kapatr ve yeni bir WPF uygulamas yaratr. Aadaki resimde gsterildii gibi, formun XAML tanmn ieren baka bir pencere ile birlikte, Design View penceresinde bo bir WPF formu grntler: pucu Design View penceresini grntlemek zere ekranda daha fazla alan salamak iin
Output ve Error List pencerelerini kapatn.

XAML, Extensible Application Markup Language anlamna gelir ve formun yapsn ve ieriini tanmlamak iin WPF uygulamalar tarafndan kullanlan XML benzeri bir dildir. XML dilini biliyorsanz, XAML dili de size aina gelmelidir. Visual Studionun Design View penceresini kullanmay istemiyorsanz ya da Visual Studioya eriime sahip deilseniz, bir XAML tanm yazarak bir WPF formunu tam olarak tanmlayabilirsiniz; Microsoft, Windows SDK ile birlikte yklenmi olan XAMLPad ad verilen bir XAML dzenleyicisi salar. Aadaki altrmalarda, Windows formuna denetim eklemek iin Design View penceresini kullanacak ve bu denetimleri uygulamak iin Visual Studio 2008 tarafndan otomatik olarak oluturulmu C# kodunun bazlarn inceleyeceksiniz.

20

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Kullanc arayz yaratn


1. Design View penceresinde formun sol tarafnda grnen Toolbox sekmesini tklayn. Ksmen formu engelleyerek ara kutusu grnr ve Windows formuna yerletirebileceiniz eitli bileenleri ve denetimleri grntler. Common blm birok WPF uygulamas tarafndan kullanlan denetimlerin listesini gsterir. Controls blm, denetimlerin daha geni listesini gsterir. 2. Common blmnde, Label tklayn ve daha sonra formun grlebilir ksmn tklayn. Forma etiket denetimi eklenir (ksa srede doru konuma getireceksiniz) ve Toolbox gzden kaybolur. pucu Toolboxn ak kalmasn fakat formun herhangi bir ksmn gizlememesini

isterseniz, Toolbox balkl ubuun sandaki Auto Hide dmesini tklayn (raptiye gibi grnr). Visual Studio 2008 penceresinin sol tarafnda Toolbox kalc olarak grnr ve Toolbox yerletirmek iin Design View penceresi klr. (Dk znrlkte ekrana sahipseniz, ok fazla alan kaybedebilirsiniz.) Auto Hide dmesini birden fazla tklamak Toolboxn yeniden gzden kaybolmasna neden olur.

3. Form zerindeki etiket denetimi muhtemelen sizin olmasn istediiniz yerde deildir. Forma eklediiniz denetimleri tklayarak istediiniz yere srkleyebilirsiniz. Bu teknii kullanarak, formun sol st kesine doru konumlanacak ekilde etiket denetimini tayn. (Bu uygulama iin gerek konum nemli deildir.) Not Kk blmedeki formun XAML tanm imdi, Margin zellii tarafndan ynetilen

form zerindeki konum gibi zelliklerle birlikte, etiket denetimini de ierir. Margin zellii, etiketin her kesinin formun kelerine uzakln gsteren drt saydan ibarettir. Denetimi form etrafnda tarsanz, Margin zelliinin deeri deiir. Form yeniden boyutlandrlrsa, formun kenarlarna tutturulmu tanan denetimler kenar deerlerini korumak iin yeniden boyutlandrlr. Margin deerlerini sfr olarak ayarlayarak bunu engelleyebilirsiniz. Blm 22, Windows Presentation Foundationa Giri blmnde WPF denetimlerinin Height ve Width zelliklerini ve Margin zelliini daha ayrntl olarak reneceksiniz.

4. View mensnde Properties Windowu tklayn. Ekrann sa alt kesinde, Solution Explorer altnda, Properties penceresi grnr (Zaten ekranda deilse). Properties penceresi, projedeki dier zellikler kadar, form zerindeki elerin zelliklerini deitirmek iin baka bir yol salar. erik duyarldr, yani seilmi olan geerli e iin zellikleri grntler. Design View penceresinde grntlenen formun balk ubuunu tklarsanz, Properties penceresinin formun kendi zelliklerini grntlediini grebilirsiniz. Etiket denetimini tklarsanz, pencere etiket iin zellikleri grntler. Form zerinde herhangi bir yeri tklarsanz, Properties penceresi grid (klavuz) ad verilen bilinmeyen bir enin zelliklerini grntler.

Blm 1

C#a Hogeldiniz

21

Klavuz, WPF formu zerindeki eler iin bir kap gibi davranr. Bu arada, form zerindeki elerin nasl hizalandn ve birarada gruplandrldn gstermek iin klavuz kullanabilirsiniz. 5. Form zerindeki etiket denetimini tklayn. Properties penceresinde, Text blmnn yerini belirleyin. Bu blmdeki zellikleri kullanarak, etiketin gsterdii gerek metnin deil, etiketin kendisinin yaz tipi ve yaz tipi bykln belirleyebilirsiniz. 6. FontSize zelliini 20 olarak deitirin ve daha sonra formun balk ubuunu tklayn. Etiket metni gstermek iin yeterince byk olmamasna ramen, etiketdeki metnin boyutu deiir. FontSize tekrar 12 olarak deitirin. Not Etikette gsterilen metin, Design View penceresinde hemen kendiliinden yeniden

boyutlanmayabilir. Uygulamay oluturup altrdnzda ya da Design View penceresini kapatp atnzda doru deeri alr.

7. Aadaki blmedeki formun XAML tanmn saa doru kaydrn ve etiket denetiminin zelliklerini inceleyin. Etiket denetimi, zellik deerlerini ieren bir <Label> etiketi, ardndan etiketin kendisi iin metin (Label) ve daha sonra da kapanma </Label> etiketinden oluur. 8. Aadaki resimde gsterildii gibi, Etiket metnini (kapatma etiketinden hemen nce), Please enter your name olarak deitirin.

22

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Metni gstermek iin etiket hala ok kk olmakla birlikte, form zerindeki etikette grntlenen metnin deitiine dikkat edin. 9. Design View penceresinde formu tklayn ve Toolbox tekrar grntleyin. Not Design View penceresinde formu tklamazsanz, Toolbox, There are no usable
controls in this group (bu grupta kullanlabilir denetim yok) hata iletisini gsterir.

10. Toolboxda TextBox tklayn ve daha sonra da formu tklayn. Metin kutusu denetimi forma eklenir. Dorudan etiket denetiminin altnda olacak ekilde metin kutusu denetimini tayn. pucu Form zerinde denetimi srklediinizde, denetim, dier denetimlerle yatay ya da

dikey olarak hizalandnda, otomatik olarak hizalama gstergesi grnr. Bu, denetimlerin dzgn hizalandndan emin olmak iin hzl bir grsel iaret verir.

11. Metin kutusu denetimi seildiinde, Properties penceresinde, pencerenin zerinde gsterilen Name zelliinin deerini userName olarak deitirin. Not Blm 2, Deikenler, Operatrler ve fadelerle almak blmnde denetimler ve deikenler iin adlandrma kurallar hakknda daha fazlasn reneceksiniz. 12. Toolbox tekrar grntleyin, Button ve daha sonra da formu tklayn. Dme denetimini, form zerinde metin kutusu denetiminin sana srkleyin, bylece dmenin alt yatay olarak metin kutusunun alt ile hizalanr. 13. Properties penceresini kullanarak, dme denetiminin Name zelliini ok olarak deitirin. 14. Formun XAML tanmnda, dme tarafndan gsterilen bal grntlemek iin metni saa kaydrn ve Button olan bal, OK olarak deitirin. Form zerindeki dme denetiminin balnn da deitiinden emin olun. 15. Design View penceresinde, Window1.xaml formunun balk ubuunu tklayn. Properties penceresinde, Title zelliini Hello olarak deitirin. 16. Design View penceresinde, form seildiinde formun sa alt kesinde yeniden boyutlandrma tutamacnn (kk bir kare) ortaya ktna dikkat edin. Fare iaretisini, yeniden boyutlandrma tutamac zerinde hareket ettirin. Fare iaretisi, kegen ift bal oka dntnde, form zerini tklayarak formu yeniden boyutlandrmak iin iaretciyi srkleyin. Srklemeyi durdurun ve denetimler etrafndaki aralk kabaca eit olduunda farenin dmesini serbest brakn. nemli Formu yeniden boyutlandrmadan nce, form iindeki klavuzun d izgisini

deil, formun balk ubuunu tklayn. Klavuzu seerseniz, formun kendisinin boyutunu deil, form zerindeki denetimlerin yerleimini deitirirsiniz.

Blm 1

C#a Hogeldiniz

23

Not Formu daha dar yaparsanz, OK dmesi formun sadaki kesinden Margin zellii ile hesaplanan sabitlenmi uzaklkta sabit kalr. Formu ok dar yaparsanz, OK dmesi metin kutusu denetiminin zerine biner. Etiketin sol kenar boluu da sabitlenmitir ve form daralmaya baladka etiket kldnde, etiketin metni grnmez olmaya balar. Form imdi u ekilde grnmelidir:

17. Build mensnde Build Solutionu tklayn ve projenin baarl bir ekilde oluturulduunu dorulayn. 18. Debug mensnde, Start Without Debuggingi tklayn. Uygulama, formunuzu altrmal ve grntlemelidir. Metin kutusuna adnz yazn ve OKi tklayn, fakat henz hibirey olmaz. OK dmesi iin Click olayn ilemek iin baz kodlar eklemeniz gerekir. Bundan sonraki altrmada bunu yapacaksnz. 19. Formu kapatmak ve Visual Studio 2008e dnmek iin Close dmesini (formun sa st kesindeki X simgesi) tklayn. Tek bir C# kod satr yazmadan grafiksel uygulama yaratmay baardnz. Henz ou yaplmad (biraz sonra biraz kod yazmanz gerekecek), fakat Visual Studio sizin iin, formu balatmak ve grntlemek gibi tm grafiksel uygulamalarn gerekletirmek zorunda olduu rutin grevleri ileyen ok sayda kod oluturur. Uygulamaya kendi kodunuzu eklemeden nce, Visual Studionun sizin iin ne oluturduunu anlamak iyi olacaktr.

24

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Solution Explorerda Window1.xaml dosyasnn yanndaki art iaretini (+) tklayn. Window1. xaml.cs dosyas grnr. Window1.xaml.cs dosyasn ift tklayn. Formun kodu, Code and Text Editor penceresinde grntlenir. u ekilde grnr:
using using using using using using using using using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Windows; System.Windows.Controls; System.Windows.Data; System.Windows.Documents; System.Windows.Input; System.Windows.Media; System.Windows.Media.Imaging; System.Windows.Navigation; System.Windows.Shapes;

namespace WPFHello { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } } }

Dosya, birok WPF uygulamasnn kulland baz ad alanlarn kapsama getiren ok sayda using deyiminden baka, Window1 ad verilen snfn tanmn ierir, daha fazlasn deil. Window1 snf iin kurucu olarak bilinen, InitializeComponent ad verilen yntemi aran, biraz kod vardr, fakat hepsi budur. (Kurucu, snf ile ayn adda olan zel bir yntemdir. Snf rnei yaratldnda uygulanr ve rnei balatmak iin kod ierebilir. Blm 7de kurucular reneceksiniz.) Aslnda, uygulama ok sayda kod ierir, fakat ou, formun XAML tanmna dayanarak otomatik olarak oluturulmu ve sizden gizlenmitir. Bu sakl kod, formu yaratma ve grntleme, form zerindeki eitli denetimleri yaratma ve konumlandrma gibi ilemleri gerekletirir. Bu snfta grebileceiniz kodun amac, uygulamanzn mantn ilemek iin, kullanc OK dmesini tkladnda nelerin meydana gelecei gibi, kendi yntemlerinizi ekleyebilmenizdir.

Blm 1

C#a Hogeldiniz

25

pucu Design View penceresinde herhangi bir yeri farenin sa dmesiyle tklayarak ve

daha sonra View Codeu tklayarak WPF formunun C# kodu dosyasn grntleyebilirsiniz.

Bu noktada, Main ynteminin nerede olduunu ve uygulama altnda grntlenen formun nasl elde edildiini merak edebilirsiniz; Main ynteminin programn balayaca noktay tanmladn hatrlayn. Solution Explorerda, App.xaml adnda bir dier kaynak dosyaya dikkat etmi olmalsnz. Bu dosyay ift tklarsanz, Design View penceresi Intentionally Left Blank(zellikle Bo Braklm) iletisini grntler, fakat dosya XAML tanmna sahiptir. XAML kodunda bir zellik StartupUri olarak adlandrlr ve aada gsterildii gibi, Window1.xaml dosyasna bavurur:

Solution Explorerda, App.xaml dosyasna bitiik olan art iaretini (+) tklarsanz, ayrca Application.xaml.cs dosyas olduunu greceksiniz. Bu dosyay ift tklarsanz, aadaki kodu ierdiini grrsnz:
using using using using using using System; System.Collections.Generic; System.Configuration; System.Data; System.Linq; System.Windows;

26

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

namespace WPFHello { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { } }

Bir kez daha sylemek gerekirse, ok sayda using ifadesi var, fakat yeterince deil, hatta Main yntemi de yok. Aslnda, Main yntemi orada, fakat gizlenmi. Main yntemi iin kod, App. xaml dosyasndaki ayarlara dayanarak oluturulmutur; zellikle, Main yntemi, StartupUri zellii tarafndan belirlenmi formu oluturacak ve grntleyecektir. Kendi kendinize biraz kod yazmanzn zaman geldi!

OK dmesi iin kod yazn


1. Design View penceresinde Window1i grntlemek iin, Code and Text Editor penceresinin stndeki Window1.xaml sekmesine tklayn. 2. Form zerindeki OK dmesini ift tklayn. Code and Text Editor penceresinde Window1.xaml.cs dosyas grnr, fakat ok_Click olarak adlandrlm yeni bir yntem eklenmitir. Visual Studio, kullanc OK dmesini tkladnda bu yntemi armak iin otomatik olarak kod oluturur. Bu bir olay rneidir. Kitap boyunca ilerledike, olaylarn nasl alt hakknda daha fazla ayrnt reneceksiniz. 3. ok_Click yntemine, koyu renkli yazlm olan kodu ekleyin:
void ok_Click(object sender, RoutedEventArgs e) { MessageBox.Show(Hello + userName.Text); }

Bu, kullanc OK dmesini tkladnda alacak olan koddur. Henz bu kodun szdizimi hakknda fazla dnmenize gerek yok (sadece tam olarak yukarda gsterildii gibi kopyaladnzdan emin olun). Blm 3te yntemler hakknda hereyi reneceksiniz. lgin ksm MessageBox.Show ifadesidir. Bu ifade, Hello metni ile birlikte kullancnn forma eklenmi username metin kutusuna girdii ad ieren ileti kutusunu grntler. 4. Design View penceresinde Window1i tekrar grntlemek iin Code and Text Editor penceresi stndeki Window1.xaml sekmesini tklayn.

Blm 1

C#a Hogeldiniz

27

5. Formun XAML tanmn gsteren aadaki sekmede, Button esini inceleyin, fakat hibireyi deitirmemeye dikkat edin. ok_Click yntemine bavuran Click adnda bir e ierdiine dikkat edin:
<Button Height=23 Click=ok_Click>OK</Button>

6. Debug mensnde, Start Without Debuggingi tklayn. 7. Form grndnde, adnz metin kutusuna yazn ve daha sonra OKi tklayn. Adnzla sizi selamlayan ileti kutusu grnr.

8. leti kutusunda OKi tklayn. leti kutusu kapanr. 9. Formu kapatn.


n

Bir sonraki blme devam etmek istiyorsanz Visual Studio 2008i alr durumda tutun ve Blm 2ye gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde, Exiti tklayn. Save iletiim kutusu grrseniz, Yesi (Visual Studio 2008 kullanyorsanz) ya da Savei (Visual C# 2008 Express Edition kullanyorsanz) tklayn ve projeyi kaydedin.

28

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Blm 1 Hzl Bavuru


Bunun in
Visual Studio 2008 Standard ya da Professional Edition kullanarak yeni bir konsol uygulamas yaratmak

unu Yapn
File mensnde Newi iaret edin ve sonra New Project iletiim kutusunu amak iin Projecti tklayn. Proje tr olarak Visual C# sein. ablon olarak, Console Application sein. Location kutusunda proje dosyalar iin bir dizin sein. Proje iin bir ad sein. OKi tklayn. Tools mensnde Options tklayn. Options iletiim kutusunda, Projects and Solutions seeneini tklayn. Visual Studio projects location kutusunda, proje dosyalar iin bir dizin belirleyin. File mensnde New Project iletiim kutusunu amak iin Newi tklayn. ablon olarak, Console Application sein. Proje iin bir ad sein. OKi tklayn.

Tu Bileimi

Visual C# 2008 Express Edition kullanarak yeni konsol uygulamas yaratmak

Visual Studio 2008 Standard ya da Professional Edition kullanarak yeni grafiksel uygulama yaratmak

File mensnde Newi iaret edin ve sonra New Project iletiim kutusunu amak iin Projecti tklayn. Proje tr olarak Visual C# sein. ablon olarak, WPF Application sein. Location kutusunda proje dosyalar iin bir dizin sein. Proje iin bir ad sein. OKi tklayn. Tools mensnde Options tklayn. Options iletiim kutusunda, Projects and Solutions seeneini tklayn. Visual Studio projects location kutusunda, proje dosyalar iin bir dizin belirleyin. File mensnde New Project iletiim kutusunu amak iin Newi tklayn. ablon olarak, WPF Application sein. Proje iin bir ad sein. OKi tklayn .

Visual C# 2008 Express Edition kullanarak yeni grafiksel uygulama yaratmak

Uygulama oluturmak Uygulamay altrmak

Build mensnde, Build Solution tklayn. Debug mensnde, Start Without Debuggingi tklayn.

F6 Ctrl+F5

Blm 2

Deikenler, leler ve Deyimlerle almak


Bu blm tamamladktan sonra renecekleriniz:
n n n n n

fadeler, tanmlayclar ve anahtar szckleri anlamak. Bilgi depolamak iin deikenler kullanmak. Temel veri trleri ile almak. Art iareti (+) ve eksi iareti (-) gibi aritmetik ileleri kullanmak. Deikenleri artrmak ve azaltmak.

C#a Hogeldiniz balkl Blm 1de Console program ve Windows Presentation Foundation (WPF) uygulamas oluturmak ve altrmak iin Microsoft Visual Studio 2008 programlama ortamn nasl kullanacanz rendiniz. Bu blmde ise ifadeler, anahtar szckler ve tanmlayclar gibi, Microsoft Visual C# szdiziminin ve dil yapsnn eleriyle tanacaksnz. Temel C# trleriyle (C# dili iinde yerleik olan trler) ve her trn tad deerlerin zellikleriyle alacaksnz. Ayrca, yerel deikenleri (sadece bir yntem ya da baka kk kod parasndaki deikenler) bildirmeyi ve kullanmay grecek, C#n sunduu aritmetik ileleri, deerleri deitirmek iin ileleri kullanmay ve iki ya da daha fazla ile ieren deyimleri denetlemeyi reneceksiniz.

fadeleri Anlamak
Bir ifade (statement), bir eylem gerekletiren komuttur. fadeler yntemlerin iinde bulunurlar. Blm 3, Yntemler Yazmak ve Kapsam Uygulamak blmnde, yntemler hakknda daha fazlasn reneceksiniz. Fakat imdilik, yntemi adlandrlm ve sralanm ifadeler olarak dnn. Bir nceki blmde grdmz Main, yntem iin bir rnektir. C#daki ifadeler, iyi tanmlanm bir kurallar kmesine uymaldr. Bu kurallar topluca szdizimi olarak bilinir. (Kart olarak, ifadelerin ne yaptnn belirtimi topluca anlambilim olarak bilinir). C# szdizimi kurallarndan biri ve en nemlisi, her ifadenin bir noktal virgl ile bitmesi gerektiidir. rnein, sonundaki noktal virgl olmadan, aadaki ifade derlenmeyecektir:
Console.WriteLine(Hello World);

29

30

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

pucu C#, serbest biimli bir dildir. Bunun anlam udur: boluk karakteri ya da satr ba

karakteri gibi boluk karakterleri ayra olmak dnda bir anlam ifade etmez. Dier bir deyile, ifadelerinizi istediiniz stilde yazabilirsiniz. Bununla birlikte, basit ve tutarl bir grnm stili programn okunmasn ve anlalmasn kolaylatrr.

Herhangi bir dilde iyi bir program yazmann pf noktas udur: nce dilin szdizimi ve anlambilimini renmek ve daha sonra dili doal ve deyimsel yolla kullanmaktr. Bu yaklam, programlarnzn ok daha kolay okunmasn ve deitirilmesini salar. Kitapta blmler boyunca, en nemli C# ifadelerinin rneklerini greceksiniz.

Tanmlayclar Kullanmak
Tanmlayclar (identifiers), programlarnzda ad alanlar, snflar, yntemler ve deikenler (birazdan deikenlerin ne olduunu reneceksiniz) gibi eleri tanmlamak iin kullandnz adlardr. C# dilinde, tanmlayclar seerken aadaki szdizimi kurallarna uymalsnz:
n n

Yalnzca harf (byk ve kk), rakam ve alt izgi karakterini kullanabilirsiniz. Tanmlayc, bir harf ile (alt izgi harf olarak kabul edilir) balamak zorundadr.

rnein, result, _score, footballTeam ve plan9 geerli iken, result%, footballTeam$ ve 9plan geersiz tanmlayclardr. nemli C# byk kk harfe duyarl bir dildir: footballTeam ve FootballTeam ayn anlama
gelen tanmlayclar deildir.

Anahtar Szckleri Tanmlamak


C# dili, 77 adet tanmlaycy kendisi kullanmak iin ayrmtr ve bu tanmlayclar kendi amalarnz iin yeniden kullanamazsnz. Bu tanmlayclar anahtar szckler olarak adlandrlr ve her biri zel bir anlama sahiptir. Anahtar szcklere rnek olarak class, namespace ve using verilebilir. Kitap boyunca ilerledike, birok C# anahtar szcnn anlamn reneceksiniz. Anahtar szckler aada listelenmitir.

Blm 2

Deikenler, leler ve Deyimlerle almak

31

abstract as base bool break byte case catch char checked class const continue decimal default delegate

do double else enum event explicit extern false finally fixed float for foreach goto if implicit

in int interface internal is lock long namespace new null object operator out override params private

protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw

true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while

pucu Visual Studio 2008 Code and Text Editor penceresinde, anahtar szckler, siz yazdka
mavi renk olarak grntlenir.

C# ayrca, aadaki tanmlayclar kullanr. Bu tanmlayclar C# tarafndan kendi kullanm iin ayrlmamtr, yani kendi yntemleriniz, deikenleriniz ve snflarnz iin tanmlayc olarak bu adlar kullanabilirsiniz, fakat mmkn olduunca bunu yapmaktan kanmalsnz.
from get group into join let orderby partial select set value where yield

Deikenleri Kullanmak
Deiken (variable) bir deeri tutan depolama konumudur. Deikeni, bilgisayarnzn belleinde geici bilgi tutan bir kutu gibi dnebilirsiniz. Programdaki her bir deikene, kullanldklar ortamda deikeni benzersiz olarak tanmlayan tek ve benzersiz bir ad vermek zorundasnz. Deikeni tuttuu deere gre adlandrabilirsiniz. rnein, bir dkkandaki mallarn maliyet deerini depolamak istiyorsanz, maliyet adnda bir deiken yaratabilir ve mallarn maliyet deerini bu deikende saklayabilirsiniz. Daha sonra, maliyet deikenine bavurduunuzda elde edilen deer, daha nce deikende depolanan maliyet deeri olacaktr.

32

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Deikenleri Adlandrmak
Deiken tanmlamakta karklktan kanmanza yardmc olan adlandrma kurallarna bal kalmalsnz. Baz neriler aada listelenmitir:
n n

Tanmlayclarda alt izgi kullanmayn. Yalnzca kk-byk harf ayrmna bal olarak deien tanmlayc yaratmayn. rnein, ayn anda kullanlan iki deikenden birini degiskenim olarak, dierini de Degiskenim olarak adlandrmayn, nk ok kolay karkla neden olabilir. Not Yalnzca kk-byk harf ayrmna bal olarak deien tanmlayclar kullanmak,
Microsoft Visual Basic gibi kk ve byk harfe duyarl olmayan dier programlama dillerinde yazlan programlardaki snflar yeniden kullanabilmenizi engeller.

n n

Ad kk harfle balatn. Birden fazla kelimeden oluan tanmlayclarda, ilk kelimeden sonra gelen kelimenin ilk harfini byk yazn (Bu, camelCase gsterim biimi olarak bilinir). Macar gsterim biimini kullanmayn. (Microsoft Visual C++ yazlm gelitiriciler, Macar gsterim biimine aina olabilir. Macar gsterim biimini bilmiyorsanz dert etmeyin!) nemli Yukarda gsterilen ilk iki neri Common Language Specification (CLS) (Ortak Dil zellikleri) ile ilgili olduundan, bunlar gerekletirilmesi zorunlu neriler olarak dnmelisiniz. Microsoft Visual Basic .NET gibi dier dillerle birlikte alan programlar yazmak istiyorsanz, bu nerilere uymalsnz.

rnein, skor, futbolTakimi, _skor ve FutbolTakimi adlarnn tm geerli bir deiken addr fakat sadece ilk ikisi nerilir.

Deikenleri Bildirmek
Deikenler deerleri tutar. C#, depolayabilecei ve ileyebilecei ok sayda farkl deer trne sahiptir: tamsay, kayan nokta says ve karakterler dizesi gibi. Bir deiken bildirdiinizde, iinde ne tr bir deiken tutacan da belirtmelisiniz. Bir deikenin adn ve trn bir tanmlama ifadesi iinde bildirirsiniz. rnein, aadaki ifade, age adnda ve int (tamsay) deerler tayan bir deikeni bildirir. Her zamanki gibi, ifade sonunda noktal virgl yer alr.
int age;

Blm 2

Deikenler, leler ve Deyimlerle almak

33

int deiken tr, temel C # trlerinden biri olan tamsaydr. (Bu blmde daha sonra birka temel veri trn reneceksiniz.) Not Microsoft Visual Basic ile program gelitirenlerin, C# dilinin kapal (implicit) deiken

bildirimlerini kabul etmediine dikkat etmeleri gerekir. Tm deikenleri, kullanmadan nce akca (explicit) bildirmelisiniz.

Deikeninizi bildirdikten sonra, deikene bir deer atayabilirsiniz. Aadaki deyim age deikenine 42 deerini atar. Yine, greceiniz gibi noktal virgl gereklidir:
age = 42;

Eittir iareti (=), sa tarafndaki deeri sol tarafndaki deikene atayan bir atama ilecidir. Bu atamadan sonra, age deikeni tuttuu deere bavurmak iin kodunuzda kullanlabilir. Aadaki deyim, konsola age deikeninin deeri olarak 42 yazar:
Console.WriteLine(age);

pucu Visual Studio 2008 Code and Text Editor penceresinde fare iaretisini bir deikenin
zerinde tutarsanz, deikenin trn gsteren bir ekran ipucu belirir.

Temel Veri Trleri ile almak


C#, temel veri trleri olarak adlandrlan birka yerleik tre sahiptir. Aadaki tabloda, C# dilinde en ok kullanlan temel veri trleri ve her birinde depolayabileceiniz deer oran listelenmitir.
Veri Tr
int long float double

Aklama
Tam saylar Tam saylar (daha byk aralk) Kayan noktal saylar ki kat daha hassas (daha fazla kesin) kayan noktal saylar Parasal deerler

Boyut (bit)
32 64 32 64

Aralk1
231 den 231 1e kadar 263 ten 263 1e kadar 1,5 10 45 ten 3,4 1038 e kadar 5,0 10324 ten 1,7 10308 e kadar 28 basamak

rnek Kullanm
int count; count = 42; long wait; wait = 42L; float away; away = 0.42F; double trouble; trouble = 0.42;

decimal

128

decimal coin; coin = 0.42M;

34

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Veri Tr
string char bool

Aklama
Karakter sralar Tek karakter Boolean

Boyut (bit)
Karakter bana 16 bit 16 8

Aralk1
Geersiz 0dan 216 1e kadar Doru ya da yanl

rnek Kullanm
string vest; vest = fortytwo; char grill; grill = x; bool teeth; teeth = false;

Atanmam Yerel Deikenler


Bir deiken bildirdiinizde, siz deikene bir deer atayana kadar rastgele bir deer ierir. Bu, bir deikenin yaratld ve deikene bir deer verilmeden nce yanllkla bilgi kayna olarak kullanld, C ve C++ programlarnda zengin bir hata kaynayd. C#, deer atanmam deikeni kullanmanza izin vermez. Bir deikeni kullanmadan nce, deikene bir deer atamak zorundasnz; aksi takdirde programnz derlenmeyebilir. Bu koul, Definite Assignment Rule (Kesin Atama Kural) olarak adlandrlr. rnein, aadaki ifadeler, age deikenine bir deer atanmad iin derleme hatas verecektir:
int age; Console.WriteLine(age); // derleme zaman hatas

Temel Veri Tr Deerlerini Grntlemek


Aadaki altrmada, birka temel veri trnn nasl altn gstermek iin PrimitiveDataTypes adl bir C# program kullanacaksnz.

Temel veri trlerinin deerlerini grntleyin


1. Visual Studio 2008i balatn. 2. Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, File mensnde, Open iaret edin ve daha sonra Project/Solution tklayn. Visual C# 2008 Express Edition kullanyorsanz, File mens zerinde, Open Projecti tklayn. Open Project iletiim kutusu grntlenir. 3. Belgeler klasrnzde \Microsoft Press\ Visual CSharp Step by Step\Chapter 2\ PrimitiveDataTypes klasrne gidin. PrimitiveDataTypes zm dosyasn sein ve Open tklayn. zm yklenir ve Solution Explorer, PrimitiveDataTypes projesini grntler.

Blm 2

Deikenler, leler ve Deyimlerle almak

35

Not zm dosyas, PrimitiveDataTypes.sln gibi, .sln uzantsna sahiptir. zm dosyas bir ya da daha fazla proje ierir. Proje dosyalar, .csproj uzantsna sahiptir. zm deil de bir proje aarsanz, Visual Studio 2008 otomatik olarak proje iin yeni bir zm dosyas oluturur. zm oluturuyorsanz, Visual Studio 2008 yeni oluturulan ya da gncellenen dosyalar otomatik olarak kaydeder bu nedenle yeni zm dosyasn kaydetmek iin konum ve ad belirlemek iin bir uyar alrsnz. 4. Debug mensnde, Start Without Debugging tklayn. Aadaki uygulama penceresi grntlenir:

5. Choose a data type listesinde, string trn tklayn. Sample value kutusunda, krk iki grnr. 6. Listede int trn tklayn. Sample value kutusunda, bir int deerini grntlemek iin gereken ifadelerin halen yazlmam olduunu gsteren to do deeri belirir. 7. Listedeki her bir veri trn tklayn. Double ve bool trleri iin de kodun tamamlanmas gerektiini dorulayn. 8. Pencereyi kapatmak ve program durdurmak iin Quit i tklayn. Denetim, Visual Studio 2008 programlama ortamna dner.

Temel veri trlerini kodda kullann


1. Solution Explorer da, Window1.xaml i ift tklayn. Design View penceresinde uygulama iin WPF formu grntlenir. 2. Window1.xaml formunu gsteren Design View penceresinde, herhangi bir yeri farenin sa dmesiyle tklayn ve daha sonra View Codeu tklayn. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresi alr.

36

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Not Koda ulamak iin ayrca, Solution Explorer da kullanabileceinizi hatrlayn. Window1.xaml dosyasnn solundaki art iaretini, +, tklayn ve daha sonra Window1.xaml. csyi ift tklayn. 3. Code and Text Editor penceresinde, showFloatValue yntemini bulun. pucu Projenizde bir enin yerini bulmak iin, Edit mens zerinde Find and Replacei
iaret edin ve daha sonra Quick Find tklayn. Ne bulmak istediinizi soran bir iletiim kutusu alr. Aradnz enin adn yazn ve daha sonra Find Next i tklayn. Varsaylan ayar olarak arama kk ve byk harfe duyarl deildir. Kk-byk harfe duyarl bir arama yapmak istiyorsanz, Find Options etiketi yanndaki art dmesini, +, tklayn ve daha sonra Match Case onay kutusunu iaretleyin. Zamannz varsa, dier seenekleri de deneyebilirsiniz.

Quick Find iletiim kutusunu grntlemek iin, Edit mensn kullanmak yerine, ayn zamanda Ctrl+F (Control tuunu basl tutarken F tuuna basarak) tularna da basabilirsiniz. Ayn ekilde, Quick Replace iletiim kutusunu grntlemek iin Ctrl+H tularna basabilirsiniz.

Liste kutusunda float trn tkladnzda showFloatValue yntemi alr. Bu yntem aadaki ifadeleri ierir:
float variable; variable=0.42F; value.Text = 0.42F;

lk ifade float trnde, variable olarak adlandrlm deikeni bildirir. kinci ifade, variable deikenine 0.42F deerini atar. (F, 0.42 deerinin, float deer olarak ele alnmas gerektiini belirten bir sonektir. F ekini unutursanz, 0.42 deeri double olarak ele alnacak ve bir trdeki deikene, ilave kod yazmadan farkl trde bir deiken atayamayacanz iin C# bu konuda ok katdr programnz derlenmeyecektir.) nc ifade, form zerinde value metin kutusundaki deiken deerini grntler. Bu ifade, biraz dikkatli olmanz gerektirir. Metin kutusu iinde eyi grntleme yolu, enin Test zelliini ayarlamaktr. Nesnenin zelliklerine, bir yntemi altrrken kullandnz nokta gsterimi yoluyla eritiinize dikkat edin. (Blm 1den Console. WriteLine ifadesini hatrlayn.) Text zelliine yerletirdiiniz veri, say deil dize (ift trnak iine alnm karakterler dizisi) olmak zorundadr. Text zelliine bir say atamaya alrsanz, programnz derlenmez. Bu programda, ifade metin kutusundaki 0.42F metnini grntler. Gerek dnya uygulamasnda, variable deikeninin deerini dizeye eviren ve daha sonra bu deeri Text zelliine yerletiren ifadeler ekleyebilirsiniz, fakat bunu yapabilmek iin ncelikle C# ve Microsoft .NET Framework hakknda biraz daha fazla bilgiye sahip olmanz gerekir. (Parametre Dizilerini Anlamak balkl Blm 11de ve le Ar Yklemesi balkl Blm 21de veri tr dnmleri ele alnmtr.)

Blm 2

Deikenler, leler ve Deyimlerle almak

37

4. Code and Text Editor penceresinde, showIntValue ynteminin yerini bulun. yle grnmelidir:
private void showIntValue() { value.Text = to do; }

Liste kutusunda int trn tkladnzda showIntValue yntemi arlr. pucu Code and Text Editor penceresinde, bir yntemi bulmann bir dier yolu, pencere
zerinde beliren Members srkle brak listesini tklamaktr. Bu pencere, Code and Text Editor penceresinde gsterilen classdaki tm yntemlerin (ve dier elerin) listesini gsterir. ye adn tklarsanz, Code and Text Editor penceresinde dorudan o yeye gtrlrsnz.

5. showIntValue ynteminin balangcnda, al kme parantezinden sonra, yeni bir satra aadaki kodda koyu olarak gsterilen iki ifadeyi yazn:
private void showIntValue() { int variable; variable = 42; }

6. Bu yntemdeki orijinal ifadede, to do dizesini 42 olarak deitirin. Bu yntem tam olarak u ekilde grnmelidir:
private void showIntValue() { int variable; variable = 42; value.Text = 42; }

Not Programlama deneyimine sahipseniz, nc ifadeyi u ekilde deitirmek isteyebilirsiniz:


value.Text = variable;

Bu ifade, form zerindeki value metin kutusundaki variable deerini gstermeli gibi grnr. Bununla birlikte, C#, sk bir yazm denetimi yapar; metin kutular sadece string deerlerini ve variable deikeninin int trnde olduunu gsterebilir; bu nedenle bu ifade derlenmez. Saysal ve dize deerleri arasnda nasl dnm yapldn daha sonra bu blmde greceksiniz.

7. Debug mensnde, Start Without Debugging i tklayn. Form tekrar grntlenir.

38

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

8. Choose a data type listesinde int trn sein. Sample value metin kutusunda 42 deerinin gsterildiini dorulayn. 9. Pencereyi kapatmak ve program durdurmak iin Quit i tklayn. 10. Code and Text Editor penceresinde, showDoubleValue yntemini bulun. 11. showDoubleValue yntemini tam olarak aadaki gibi deitirin:
private void showDoubleValue() { double variable; variable = 0.42; value.Text = 0.42; }

12. Code and Text Editor penceresinde, showBoolValue yntemini bulun. 13. showBoolValue yntemini tam olarak aadaki gibi deitirin:
private void showBoolValue() { bool variable; variable = false; value.Text = false; }

14. Debug mens zerinde, Start Without Debugging i tklayn. 15. Choose a data type listesinde, int, double ve bool trlerini sein. Her bir durumda, Sample value metin kutusunda doru deerin gsterildiini dorulayn. 16. Program durdurmak iin Quiti tklayn.

Aritmetik leleri Kullanmak


C#, kklnzde rendiiniz drt ilemin aritmetik ilelerini destekler: toplama iin art iareti (+), karma iin eksi iareti (-), arpma iin yldz (*) ve blme iin de (/) iareti. +, -, * ve / simgeleri, yeni deerler yaratmak iin deerler zerinde ilem yaptndan, ileler olarak adlandrlr. Aadaki rnekte, moneyPaidToConsultant (cretDanman) deikeni 750 (gnlk faiz) ve 20 (danmann alt gn saysnn) arpmnn sonucunu verir:
long moneyPaidToConsultant; moneyPaidToConsultant = 750 * 20;

Blm 2

Deikenler, leler ve Deyimlerle almak

39

Not lecin zerinde ilem yapt deerler ilenen (operands) olarak adlandrlr. 750*20 deyiminde, * ile, 750 ve 20 de ilenendir.

leler ve Trler
Tm ileler, tm veri trlerine uygulanamaz. Bir deer zerinde kullanabileceiniz ileler, deerin trne baldr. rnein, char, int, long, float, double ya da decimal veri trlerinde tm aritmetik ilelerini kullanabilirsiniz. Bununla birlikte, string ya da bool tr deikenler zerinde, art ileci dnda aritmetik ileleri kullanamazsnz. Bu nedenle, string tr karma ilecini desteklemediinden aadaki ifade derlenmez (bir dizenin dier bir dizeden karlmas anlamszdr):
// derleme zaman hatas Console.WriteLine(Gillingham Forest Green Rovers);

Dize deerlerini birletirmek iin + ilecini kullanabilirsiniz. Beklenmeyen bir sonu verebileceinden, dikkatli olmalsnz. rnein, aadaki ifade konsola 431 (44 deil) yazar:
Console.WriteLine(43 + 1);

pucu .NET Framework, dizeler olarak tutulan deerler zerinde aritmetik hesaplamalar
yapmanz gerekirse, dize deerini tamsay deerine dntrmek iin kullanabileceiniz Int32.Parse adl bir yntem salar.

Ayrca, aritmetik ilem sonucundaki deer trnn, kullanlan ilenenler trne bal olduunu farketmi olmalsnz. rnein, 5.0/2.0 ifadesinin deeri 2.5dur; her iki ilenenin tr double dr (C#de, ondalk sabit saylar, mmkn olduunca kesinlik salamak iin, her zaman float deil, double dr), bu nedenle sonu tr de double dr. Bununla birlikte, 5/2 ifadesinin deeri 2dir. Bu defa, her iki ilenen de int trndedir, yani sonu deeri de int trndedir. C#, bunun gibi koullarda her zaman deerleri aaya yuvarlar. lenenlerin trn kark yaparsanz durum biraz daha karmak hale gelir. rnein, 5/2.0 ifadesi, int ve double veri tr ierir. C# derleyicisi, tr uyumsuzluunu farkeder ve ilemi gerekletirmeden nce int trn, double trne dntren kodu retir. Sonu tr bu nedenle double (2.5) olur. almakla birlikte, trleri bu ekilde kartrmak zayf bir programlama olarak dnlr.

40

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Saysal Trler ve Sonsuz Deerler


C#da saylarn bir ya da iki zellii daha olduunun farkna varm olmalsnz. rnein, herhangi bir sayy sfra blmenin sonucu sonsuzdur, yani int, long ve decimal trlerinin aralklar dndadr. Bu nedenle 5/0 ifadesi hata verir. Bununla birlikte, double ve float trleri, sonsuzu gstermek iin zel bir deere sahiptir ve 5.0/0.0 ifadesinin sonucu Infinity olur. Bu kurala tek istisna, 0.0/0.0 ifadesi sonucudur. Genellikle, sfr herhangi bir sayya blerseniz, sonu sfr olur, fakat herhangi bir sayy sfra blerseniz sonu sonsuz olur. 0.0/0.0 ifadesi bir paradoks olarak sonulanr (sonu deeri sfr olmal ve ayn zamanda da sonsuz olmaldr). C#, bu durum iin, say deil anlamna gelen ve NaN olarak adlandrlan dier bir zel deere sahiptir. Yani, 0.0/0.0 ifadesinin sonucu NaN olur . NaN ve Infinity deyimler zerinde yaylr. 10 + NaN ifadesinin sonucu NaN, 10 + Infinity ifadesinin sonucu da Infinity olur. Bu kurala istisna olarak, NaN * 0 ifadesinin sonucu NaN iken, Infinity * 0 ifadesinin sonucu 0dr.

C# ayrca, az bilinen bir aritmetik ileci destekler: yzde iareti ile gsterilen kalan ya da mod ileci. x % y ifadesinin sonucu, xin ye blnmesi sonucunda kalan deerdir. rnein, 9un 2ye blnmesi sonucu 4, kalan da 1 olduundan, 9 % 2 sonucu 1dir. Not C ya da C++ diline ainaysanz, bu dillerde float ya da double deerler zerinde kalan

ilecini kullanamayacanz bilirsiniz. Bununla birlikte, C#, bu kural esnetir. Kalan ileci, tm saysal trlerde geerlidir ve sonucun tamsay olmas gerekmez. rnein, 7.0 % 2.4 ifadesinin sonucu 2.2dir.

Aritmetik leleri ncelemek


Aadaki altrma, daha nceden C# dilinde yazlm MathsOperators adl program kullanarak aritmetik ilelerin int deerler zerinde kullanmn gsterir.

Aritmetik ilelerle aln


1. Belgeler klasrnzdeki Microsoft Press\Visual CSharp Step By Step\Chapter 2\ MathsOperators dizinindeki MathsOperators projesini an. 2. Debug mensnde Start Without Debugging i tklayn. Ekranda bir form belirir. 3. left operand metin kutusuna 54 yazn.

Blm 2

Deikenler, leler ve Deyimlerle almak

41

4. right operand metin kutusuna 13 yazn. imdi metin kutularndaki deerlere herhangi bir ileci uygulayabilirsiniz. 5. Subtraction seeneini iaretleyip Calculate i tklayn. Expression metin kutusundaki metin 54-13 olarak deiir ve aadaki resimde gsterildii gibi, Result kutusunda 41 deeri grnr.

6. / Division seeneini iaretleyip Calculate i tklayn. Expression metin kutusundaki metin 54/13 olarak deiir ve Result kutusunda 4 deeri grnr. Gerekte, 54/13 sonucu 4.153846dr; fakat C# tamsay blmnde, daha nce akland gibi, bir tamsayy dier bir tamsayya bldnzde sonu deeri de tamsaydr. 7. % Remainder seeneini iaretleyip Calculatei tklayn. Expression metin kutusundaki metin 54 % 13 olarak deiir ve Result metin kutusunda 2 deeri belirir. nk 54/13 ileminde kalan 2dir. (54 ((54/13) * 13)) ifadesinde her aamada aaya doru yuvarlama yaparsanz sonu 2 olur. Okuldaki yal matematik retmenime (54/13) * 13 sonucunun 54 olmad sylense, ok olurdu! 8. Dier saylarla ileleri deneyin. Bitirdiinizde, Visual Studio 2008 programlama ortamna geri dnmek iin Quit i tklayn. imdi, MathsOperators programnn koduna bir gz atalm.

42

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

MathsOperators programnn kodunu inceleyin


1. Design View penceresinde Window1.xaml formunu grntleyin (Solution Explorer da Window1.xaml dosyasn ift tklayn). 2. View mens zerinden, Other Windows u iaret edin ve daha sonra Document Outline tklayn. Form zerindeki denetimlerin adn ve trn gsteren, Document Outline penceresi belirir. Form zerindeki denetimlerin her birini tklarsanz, Document Outline penceresinde denetim ad vurgulanr. Ayn ekilde, Document Outline penceresinde bir denetimi seerseniz, Design View penceresinde de uygun denetim seilir. 3. Form zerinde, kullanc trleri saysndaki iki TextBox denetimini tklayn. Document Outline penceresinde, lhsOperand ve rhsOperand olarak adlandrldn dorulayn. (denetimin sandaki parantezde denetimin adn grebilirsiniz.) Form altnda, bu denetimlerin her birinin Text zellii, kullancnn girdii deerleri tutar . 4. Formun altna doru, gerekletirilen deyimin, deyim olarak ve hesaplama sonucunun sonu olarak adlandrldn gstermek iin TextBox denetiminin kullanldn dorulayn. 5. Document Outline penceresini kapatn. 6. Window1.xaml.cs dosyasnn kodunu, Code and Text Editor penceresinde gsterin. 7. Code and Text Editor penceresinde, subtractValues yntemini bulun. u ekilde grnr:
private void subtractValues() { int lhs = int.Parse(lhsOperand.Text); int rhs = int.Parse(rhsOperand.Text); int outcome; outcome = lhs rhs; expression.Text = lhsOperand.Text + + rhsOperand.Text; result.Text = outcome.ToString(); }

Bu yntemdeki ilk ifade, lhs ad verilen bir int deikeni bildirir ve kullanc tarafndan lhsOperand metin kutusunda girilen deere uygun tamsay deeri ile balatr. Metin kutusu denetiminin Text zelliinin dize ierdiini hatrlayn, bu nedenle, int deikenine atayabilmeniz iin bu dizeyi tamsayya evirmeniz gerekir. int veri tr tam olarak bunu yapan int.Parse yntemi salar. kinci ifade, rhs ad verilen bir int deikeni bildirir ve rhsOperand metin kutusundaki deeri int trne evirdikten sonra balag deeri olarak atar. nc ifade outcome adnda bir int deikeni bildirir.

Blm 2

Deikenler, leler ve Deyimlerle almak

43

Drdnc ifade, lhs deikeninin deerinden rhs deikeninin deerini karr ve sonucu outcome deikenine atar. Beinci ifade, gerekletirilen hesaplamay gsteren dizeyi birletirir (+, art ilecini kullanarak) ve sonucu expression.Text zelliine atar. Bu, form zerindeki expression metin kutusunda dizenin belirmesine neden olur. Altnc ifade, hesaplama sonucunu result metin kutusunun Text zelliine atamak yoluyla gsterir. Text zelliinin dize ve hesaplama sonucunun int olduunu hatrlayn, bu nedenle dizeyi Text zelliine atamadan nce int trne evirmeniz gerekir. int trnn ToString yntemi bunu yapar.

ToString Yntemi
.NET Frameworkdeki her snf, ToString yntemine sahiptir. ToString ynteminin amac, bir nesneyi dize gsterimine dntrmektir. nceki rnekte, outcome tamsay nesnesinin ToString yntemi, outcome deikeninin tamsay deerini dize deerine dntrmek iin kullanlmtr. result metin kutusunun Text zelliinde deeri gstermek iin bu dnm gereklidir (Text zellii sadece dizeler ierebilir). Kendi snflarnz yarattnzda, snfnzn dize olarak nasl gsterileceini belirlemek iin ToString ynteminin nasl uygulanacan tanmlayabilirsiniz. Snflar ve Nesneleri Yaratmak ve Ynetmek balkl Blm 7de, kendi snflarnz yaratmak konusunda daha fazlasn greceksiniz.

ncelii Denetlemek
ncelik bir deyimdeki ilelerin gerekletirilme srasdr. + ve * ilelerini kullanan aadaki deyimi dnn:
2 + 3 * 4

Bu ifade belirsiz olmaya yatkndr; nce toplama ilemini mi yoksa arpma ilemini mi yaparsnz? Dier bir deyile, 3 deeri soldaki + ilecine mi yoksa sadaki * ilecine mi baldr? lelerin sras nemlidir nk sonucu deitirir:
n

lk olarak toplama ilemini yaparsanz, toplama sonucu (2+3), * ilecinin sol tarafndaki ileneni oluturur ve tm ifadenin sonucu 5*4, yani 20 olur. lk olarak arpma ilemini yaparsanz, arpm sonucu (3*4), + ilecinin sa tarafndaki ileneni meydana getirir ve tm ifadenin sonucu 2+12, yani 14 olur.

44

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

C#da, arpma ilemi ile ilgili ileler (*, / ve %), toplama ile ilgili ilelere (+ ve -) gre ncelie sahiptir, bu nedenle 2 + 3 * 4 gibi bir ifadede, ilk nce arpma daha sonra toplama ilemi gerekletirilir. Bu nedenle 2 + 3 * 4 ifadesinin sonucu 14dr. Sonraki blmlerde her bir ile incelendikce, ilecin ncelii de aklanacaktr. ncelii geersiz klmak ve ilenenleri ilelere farkl ekilde balamak iin ayra kullanabilirsiniz. rnein, aadaki ifadede, parantez 2 ve 3 deerini + ilecine balanmaya zorlar (sonu 5 olur) ve bu toplamann sonucu, * ilecinin sol ilenenini meydana getirir ve sonu 20 olur:
(2 + 3) * 4

Not ( ) imleri parantez, {} imleri kme parantezi, [ ] imleri ise keli parantez olarak adlandrlr.

lemleri Gerekletirmek in Birleim zelliini Kullanmak


lem ncelii, hikayenin sadece yarsdr. Ayn ncelie sahip farkl ileler ieren bir ifade olduunda ne olacak? Bu noktada, birleim nemli hale gelir. Birleim ilecin uygulanan ileneninin (sol ya da sa) yndr. / ve * ileleri kullanan aadaki ifadeyi dnn:
4 / 2 * 6

Bu ifade de biraz belirsizdir. Blme ilemini mi yoksa arpma ilemini mi nce yaparsnz? Her iki ilecin de ncelii ayndr (her ikisi de arpma ilemi ile ilgili) fakat iki farkl sonu elde edebileceinizden hangi ilemin nce yaplaca nemlidir:
n

lk nce blme ilemini yaparsanz, (4/2) sonucu * ilecinin solundaki ileneni meydana getirir ve tm ifadenin sonucu (4/2)*6, yani 12 olur. lk nce arpm ilemini yaparsanz, (2*6) arpmnn sonucu, / ilecinin sandaki ileneni meydana getirir ve tm ifadenin sonucu 4/(2*6), yani 4/12 olur.

Bu durumda, ilelerin birleimi, ifadenin nasl gerekletirileceini belirler. * ve / ilelerinin her ikisi de sola birleim zellii tar, yani ilenenler soldan saa doru ilem grr. Bu rnekte, ilk olarak 4/2 ilemi yaplr, daha sonra 6 ile arplr ve 12 sonucunu verir. lerleyen blmlerde yeni ileler incelendikce, birleim zellii de ele alnacaktr.

Blm 2

Deikenler, leler ve Deyimlerle almak

45

Birleim ve Atama leci


C# dilinde, eittir iareti (=) bir iletir. Tm ileler, ilenenlerine bal olarak bir deer dndrr. Atama ileci (=) de farkl deildir. ki ilenen alr; sa tarafndaki ilenen deerlendirilir ve daha sonra sol taraftaki ilenende depolanr. Atama ilecinin deeri, sol ilenene atanm olan deerdir. rnein, aadaki atama ifadesinde, atama ileci tarafndan dndrlen deer 10dur, ayn zamanda myInt deikenine atanan deerdir.
int myInt; myInt = 10; //atama ifadesinin deeri 10

Bu noktada, bunun olduka ho ve nadir bir ey olduunu dnebilirsiniz fakat ne ie yarar? Atama ileci bir deer dndrdnden, atama ifadesinin baka bir oluumunda da ayn deeri kullanabilirsiniz:
int myInt; int myInt2; myInt2 = myInt = 10;

myInt2 deikenine atanan deer, myInt deikenine atanm olan deerle ayndr. Atama ifadesi, her iki deikene de ayn deeri atar. Birka deikeni ayn deerle balatmak isterseniz, bu teknik olduka kullanldr. Kodunuzu okuyan birisi iin, tm deikenlerin ayn deerde olmas gerektii daha net anlalr:
myInt5 = myInt4 = myInt3 = myInt2 = myInt = 10;

Bu ifadeden, atama ilecinin sadan sola doru birleim zelliine sahip olduunu ortaya karabilirsiniz. lk olarak sa taraftaki atama gerekleir ve atanan deer sadan sola doru deikenler boyunca yaylr. Herhangi bir deiken daha nce bir deere sahipse, atanan deer zerine yazdrlr.

Deikenleri Artrmak ve Azaltmak


Bir deikene 1 eklemek isterseniz, + ilecini kullanabilirsiniz:
count = count + 1;

Bununla birlikte, bir deikeni 1 artrmak olduka yaygndr, C# dili sadece bu ama iin ayr bir ile salar: ++ ileci. count deikenini 1 artrmak iin aadaki ifadeyi yazabilirsiniz:
count++;

46

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Benzer ekilde, C#, bir deikenden 1 azaltmak iin kullanabileceiniz ileci salar:
count--;

Not ++ ve ileleri, sadece tek bir ilenen alan anlamna gelen, tekli ilelerdir. Blm 4, Karar fadelerini Kullanmak blmnde incelenen, ! birli ileci ile ayn ncelii ve sol birleim zelliini paylar.

nek ve Sonek
++, artrma ve , azaltma ilelerini, deikenden nce ve sonra yerletirebilirsiniz. le simgesinin deikenden nce yer almas, ilenenin nek (prefix) biimi olarak ve deikenden sonra yer almas da sonek (postfix) biimi olarak adlandrlr. rnein:
count++; ++count; count--; -count; // // // // sonek artrma nek artrma sonek azaltma nek azaltma

++ ya da ilecinin nek ya da sonek biimini kullanmak, deikenin artrlmas ya da azaltlmasnda bir fark oluturmaz. rnein, count++ yazsanz da ++count yazsanz da, count deeri 1 artar. yleyse, neden iki farkl yazm biimi olduunu merak edebilirsiniz. Bunun nedenini anlamak iin, ++ ve simgelerinin ile olduunu ve tm ilelerin bir deere sahip deyimi deerlendirmek iin kullanldn hatrlayn. count++ tarafndan oluturulan deer, count deikeninin artrm gereklemeden nceki deeridir oysa ++count tarafndan oluturulan deer saynn artrma gerekletirildikten sonraki deeridir. Bir rnek verelim:
int x; x = 42; Console.WriteLine(x++); // x imdi 43tr, 42 yazlr x = 42; Console.WriteLine(++x); // x imdi 43tr, 43 yazlr

nek ya da sonek ifadesinde, hangi ilenenin ne olduunu hatrlamann yolu, elerin (ilenen ve ile) srasna bakmaktr. x++ deyiminde, ilk olarak x deikeni yer alr, bu nedenle x artrlmadan nceki deeri deyimin deeri olarak kullanlr. ++x deyiminde, ilk olarak ile yer alr, bu nedenle x deeri deerlendirilmeden nce artrma ilemi gerekletirilir. Bu ileler, yaygn olarak while ve do ifadelerinde kullanlr ve Bileik Atama ve Yineleme fadelerini Kullanmak balkl Blm 5te gsterilmitir. Artrma ve azaltma ilelerini ayr olarak kullanyorsanz, sonek biimini tercih edin ve bu konuda tutarl olun.

Blm 2

Deikenler, leler ve Deyimlerle almak

47

Kapal Trde Yerel Deikenleri Bildirmek


Bu blmde daha nce, aadaki gibi, bir deikenin, veri tr ve bir tanmlayc belirtmek yoluyla bildirildiini grmtnz:
int myInt;

Ayrca, deikeni kullanmaya balamadan nce deikene bir deer atamanz gerektiinden bahsedilmiti. Aadaki gibi, ayn ifadede deikeni bildirebilir ve balang deeri atayabilirsiniz:
int myInt = 99;

Hatta, myOtherInt deikeninin, balang deeri atanm tamsay deiken olduunu varsayarsak, aadaki gibi deiken bildirebilir ve balang deeri atayabilirsiniz:
int myInt = myOtherInt * 99;

Bir deikene atadnz deerin, deiken ile ayn trde olmas gerektiini hatrlayn. rnein, int trnde deikene sadece int tr deer atayabilirsiniz. C# derleyici, bir deikene balang deeri atamak iin kullanlan ifadenin trn hzl bir ekilde ortaya karabilir ve deikenin tr ile ayn deilse size bildirebilir. Ayrca, C# derleyicisinden bir ifadedeki deikenin trn bulmasn ve aadaki gibi tr yerine var anahtar szcn kullanarak deiken bildirdiinizde, bulduu tr kullanmasn isteyebilirsiniz:
var myVariable = 99; var myOtherVariable = Hello;

myVariable ve myOtherVariable deikenleri, kapal trde deikenler olarak adlandrlr. var anahtar szc, derleyicinin, deikenlerin trn, deikene balang deeri atamak iin kullanlan ifadeden karmasna neden olur. Bu rneklerde, myVariable deikeni int trnde ve myOtherVariable deikeni de string trndedir. Bu, sadece deiken bildirmek iin bir kolaylktr ve deiken bildirildikten sonra deikene sadece derleyicinin ortaya kard deeri atayabilirsiniz. myVariable deikenine float, double ya da string deerler atayamazsnz. Ayrca, var anahtar szcn sadece, bir deikene balang deeri atamak iin bir ifade saladnzda kullanabilirsiniz. Aadaki bildirim geerli deildir ve derleme hatasna neden olur.
var yetAnotherVariable; // Hata derleyici tr ortaya karamad

nemli Daha nce Visual Basic ile programlama yaptysanz, bir deikende herhangi bir trde deer saklamak iin kullanabileceiniz Variant trne aina olabilirsiniz. Visual Basic ile programlama yaptnz zaman Variant deikenlerle ilgili rendiiniz her eyi unutmalsnz. Anahtar szckler benzer grnmekle birlikte, var ve Variant tamamen farkl eylerdir. C# dilinde var anahtar szcn kullanarak deiken bildirdiinizde, deikene atadnz deerlerin tr, deikene balang deeri atamak iin kullanlan trden sonra deitirilemez.

48

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

C# gibi dzenli bir dilin tasarmclarnn, neden bu dilde var anahtar szc gibi bir zelliin var olmasna izin verdiini merak ediyor olabilirsiniz. Neticede, bir ksm programc tarafndan ar tembellik mazereti gibi grnr ve programn ne yaptn anlamay ve hatalar bulmay zorlatrabilir (hatta kodunuza yeni hatalar bile getirebilir). Bununla birlikte, bana gvenin, ilerleyen blmlerin birou zerinde altnzda, var anahtar szcnn C#da geerli bir yere sahip olduunu greceksiniz. Bununla birlikte, imdilik, kapal tr gerekli olana kadar deiken trn ak bir ekilde belirtmeye devam edeceiz.
n

Bir sonraki blmden devam etmek istiyorsanz. Visual Studio 2008i alr halde brakn ve Blm 3e gein. Visual Studio 2008den imdi kmak istiyorsanz, File mensnde, Exiti tklayn. Save iletiim kutusunu gryorsanz, Yesi tklayn (Visual Studio 2008 kullanyorsanz) ya da Savei tklayn (Visual C# 2008 Express Edition kullanyorsanz) ve projeyi kaydedin.

Blm 2 Hzl Bavuru


Bunun in
Bir deiken bildirmek

unu Yapn
Trn adn sonra da deikenin adn yazn, sonuna da noktal virgl ekleyin. rnein:
int outcome;

Bir deikenin deerini deitirmek

Deikenin adn sola yazn, ardndan atama ilecini yazp sonra da deeri hesaplayan deyimi yazn, sonuna da noktal virgl ekleyin. rnein:
outcome = 42;

string i int e dntrmek ncelii geersiz klmak

System.Int32.Parse yntemini arn. rnein:


System.Int32.Parse(42);

lenenleri belirli ilelere zorlamak iin deyimlerde ayra kullann. rnein:


(3 + 4) * 5

Birka deikene ayn balang deerini atamak Bir deikeni artrmak ya da azaltmak

Tm deikenlere balang deeri atayan atama ifadesini kullann. rnein:


myInt4 = myInt3 = myInt2 = myInt = 10;

++ ya da ilelerini kullann. rnein:


count++;

(Dipnotlar)
1 216 deeri 65.536; 231 deeri 2.147.483.648; ve 263 deeri 9.223.372.036.854.775.808e eittir.

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak


Bu blm tamamladktan sonra renecekleriniz:
n n n n n

Yntemleri bildirmek ve armak. Ynteme bilgi geirmek. Yntemden bilgi almak. Yerel ve snf kapsam tanmlamak. Yntemler alrken yntem iine girmek ve yntem iinden kmak iin tmleik hata ayklaycy kullanmak.

Deikenler, leler ve Deyimlerle almak balkl Blm 2de, deikenleri bildirmeyi, ileler kullanarak deyimler yaratmay ve birden fazla ile ieren deyimlerde ncelik ve birleim denetimini rendiniz. Bu blmde, yntemleri reneceksiniz. Ayrca, bir ynteme bilgi aktarmak iin bamsz deikenler ve parametreleri kullanmay ve return ifadelerini kullanmak yoluyla yntemden bilgi almay reneceksiniz. Son olarak, Microsoft Visual Studio 2008 tmleik hata ayklaycy kullanarak yntemlerin ilerine girmeyi ya da kmay greceksiniz. Bu, beklediiniz gibi almadklarnda yntemlerinizin ileyilerini izlemek iin ok yararl olabilir.

Yntemleri Bildirmek
Yntem (method), adlandrlm ifadeler grubudur. Daha nce C ya da Microsoft Visual Basic ile programlama yaptysanz, yntemin, ilev ya da alt yordama olduka benzer olduunu bilirsiniz. Yntem ad, yntemin tm amacn gsteren anlaml bir tanmlayc olmaldr (rnein, CalculateIncomeTax (GelirVergisi Hesapla)). Yntem gvdesi, yntem arldnda alacak olan gerek ifadeleri ierir. Birok yntem, ilemek zere veri alr ve ileminin sonucu olan verileri dndrr. Yntemler temel ve gl mekanizmalardr.

49

50

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Yntem Bildirme Szdizimini Belirlemek


Microsoft Visual C# ynteminin szdizimi aadaki gibidir:
returnType methodName ( parameterList ) { // yntem gvde ifadeleri buraya gelir } n

returnType, bir trn addr ve yntemin ilem sonucu olarak dndrecei bilgi trn belirler. Bu, int ya da string gibi, herhangi bir tr olabilir. Herhangi bir deer dndrmeyen bir yntem yazyorsanz, dnen tr yerine void anahtar szcn kullanmanz gerekir. methodName, yntemi armak iin kullanlan addr. Yntem adlar da deiken adlarnn uymas gereken tanmlayc kurallarna uymaldr. rnein, addValues (ekleDeerler) ad geerli bir yntem addr fakat add$Values geerli bir ad deildir. imdilik, yntem adlar iin camelCase kuralna uymalsnz; rnein, displayCustomer . parameterList, istee baldr ve ilemesi iin ynteme verebileceiniz bilginin adlarn ve trlerini tanmlar. Parametreleri, nce tr ad daha sonra da parametre ad olacak biimde, parantez iinde deiken bildiriyormu gibi yazarsnz. Yazdnz yntem iki ya da daha fazla parametreye sahip olacaksa, parametreleri virglle ayrmanz gerekir. method body statements (yntem gvde ifadeleri), yntem arldnda altrlacak olan kod satrlardr. Kme parantezleri, { }, arasnda yer alrlar.

nemli C, C++ ve Microsoft Visual Basic ile program gelitirenler, C#'n genel yntemleri desteklemediine dikkat etmeliler. Kodunuzun derlenebilmesi iin tm yntemlerinizi bir snf iinde yazmanz gerekir. leftHandSide (sol taraf) ve rightHandSide (sa taraf) adl iki int parametre alan ve bir int dndren addValues adl yntemin tanm aadaki gibidir:
int addValues(int leftHandSide, int rightHandSide) { // ... // yntem gvde ifadeleri buraya gelir // ... }

Not Yntemin dn trn ve parametrelerin trn ak bir ekilde belirtmeniz gerekir. var anahtar szc kullanamazsnz.

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

51

Sadece answer (yant) adnda int parametre alan ve bir deer dndrmeyen showResult (gsterSonu) ynteminin tanm ise yledir:
void showResult(int answer) { // ... }

Yntemin bir deer dndrmediini gstermek iin void anahtar szcnn kullanldna dikkat edin. nemli Visual Basic ile program gelitirenler, C#n deer dndren (ilev) ve deer dndrmeyen (yordam ya da altyordam) yntemleri birbirinden ayrmak iin farkl anahtar szckler kullanmadna dikkat etmeliler. Her zaman bir dn tr belirtmeniz ya da void anahtar szcn kullanmanz gerekir.

return fadeleri Yazmak


Ynteminizin bir bilgi dndrmesini istiyorsanz (baka bir deyile dn trnn void olmasn istemiyorsanz), yntem iinde bir return ifadesi yazmalsnz. return anahtar szcnden sonra, dnen deeri hesaplayan deyim ve sonunda noktal virgl yer alr. Deyimin tr, yntem tarafndan belirtilen dn tr ile ayn olmak zorundadr. Dier bir deyile, yntem bir int tr dndryorsa, return ifadesi de int tr dndrmelidir, aksi takdirde, programnz derlenmez. rnein:
int addValues(int leftHandSide, int rightHandSide) { // ... return leftHandSide + rightHandSide; }

return ifadesi, yntemin bitmesine neden olduundan, genellikle yntemin sonunda yer alr. return ifadesinden sonra yer alan herhangi bir ifade altrlmaz (return ifadesinden sonra herhangi bir ifade yazarsanz, derleyici sizi uyarr). Ynteminizin bir deer dndrmesini istemiyorsanz (dier bir deyile, dn tr void ise), yntemden kmak iin return ifadesinin farkl bir biimini kullanabilirsiniz. return anahtar szcnden sonra noktal virgl yazarsnz. rnein:
void showResult(int answer) { // yant grntle ... return; }

52

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Ynteminiz herhangi bir ey dndrmyorsa, return ifadesini yazmayabilirsiniz, nk sondaki kme parantezi kapatma iaretine ulatnda yntem otomatik olarak sonlanr. Bu uygulama yaygn olmakla birlikte, iyi bir kullanm ekli deildir. Aadaki altrmada, Blm 2deki MathsOperators uygulamasnn farkl bir srmn inceleyeceksiniz. Bu srm, baz kk yntemlerin dikkatlice kullanmyla gelitirilmitir.

Yntem tanmlamalarn inceleyin


1. Visual Studio 2008i balatn. 2. Documents klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\ Chapter 3\Methods klasrndeki Methods projesini an. 3. Debug mensnde, Start Without Debugging i tklayn. Visual Studio 2008, uygulamay oluturur ve altrr. 4. Uygulamann nasl altn deneyin ve daha sonra Quit i tklayn. 5. Code and Text Editor penceresinde Window1.xaml.cs iin kodu grntleyin. 6. Code and Text Editor penceresinde, addValues yntemini bulun. Yntem u ekilde grnmelidir:
private int addValues(int leftHandSide, int rightHandSide) { expression.Text = leftHandSide.ToString() + + + rightHandSide.ToString(); return leftHandSide + rightHandSide; }

addValues yntemi iki ifade ierir. lk ifade, form zerindeki expression metin kutusunda yaplan hesaplamay gsterir. leftHandSide ve rightHandSide parametrelerinin deerleri dizelere evrilir (Blm 2de grdnz ToString yntemi kullanlarak) ve ortasnda (+) ilevinin string gsterimi ile birbirine balanr. kinci ifade, leftHandSide ve rightHandSide int deikenlerinin deerlerini toplamak iin + ilecini kullanr ve ilemin sonucunu dndrr. ki int deerinin toplanmasnn baka bir int deer oluturduunu hatrlayn, yani addValues ynteminin dn tr de int olur . subtractValues, multiplyValues, divideValues ve remainderValues yntemlerine bakarsanz, ayn ekilde olduunu grrsnz.

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

53

7. Code and Text Editor penceresinde, showResult yntemini bulun. showResult yntemi u ekilde grnr:
private void showResult(int answer) { result.Text = answer.ToString(); }

Bu yntem, result metin kutusunda answer parametresinin string gsterimini gsteren bir ifade ierir. pucu Bir yntem iin minimum uzunluk snrlamas yoktur. Eer bir yntem

tekrarlamadan kanmanza yardmc oluyorsa ve programnz daha kolay anlalr hale getiriyorsa, ne kadar kk olursa olsun yntem kullanldr. Bir yntem iin ayn zamanda maksimum uzunluk snrlandrmas da yoktur, fakat genellikle ynteminizin kodunu, ilevini yerine getirmeye yetecek uzunlukta tutmak istersiniz.

Yntemleri armak
Yntemler arlmak iin vardr! Bir yntemi, grevini gerekletirmesi iin adn kullanarak arrsnz. Yntem bilgi gerektiriyorsa (parametreleriyle belirtildii gibi), verileri istendii gibi sunmalsnz. Yntem bir bilgi dndryorsa (dn tr ile belirtildii gibi), bu bilgiyi bir biimde yakalamalsnz.

Yntemin arlma Szdizimini Belirlemek


Bir C# ynteminin arlma szdizimi u ekildedir:
result = methodName ( argumentList ) n

methodName tam olarak ardnz yntemin ad olmaldr. Unutmayn, C# byk kk harfe duyarldr. result = cmlesi istee baldr. Eer kullanlmsa, result (sonu) olarak tanmlanm deiken, yntemden dnen deeri ierir. Yntem void ise (bir sonu deeri dndrmyorsa), ifadeden result = cmlesini karmalsnz. argumentList (bamszdeikenListesi) yntemin alaca istee bal bilgiyi salar. Her parametre iin bir bamsz deiken vermeniz gerekir ve her bamsz deikenin deeri kendine karlk gelen parametrenin trne uygun olmaldr. ardnz yntemin iki ya da daha ok parametresi varsa, bamsz deikenleri virglle ayrmalsnz.

54

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

nemli Yntemleri bamsz deikenler olmadan arsanz bile, her yntem arlnda parantezleri yazmalsnz. Bu noktalar netletirmek iin, addValues yntemine tekrar bakalm:
int addValues(int leftHandSide, int rightHandSide) { // ... }

addValues ynteminin iki adet int parametresi vardr, bu nedenle bu yntemi virglle ayrlm iki int bamsz deikenle armalsnz:
addValues(39, 3); // okay

39 ve 3 deerlerini iki int deikenine atayabilirsiniz. Bu deikenlerdeki deerler daha sonra, aadaki gibi bamsz deikenler olarak ynteme verilir:
int arg1 = 99; int arg2 = 1; addValues(arg1, arg2);

Aada gsterildii gibi, addValues yntemini farkl ekillerde arrsanz, aada tanmlanan nedenlerden dolay baarl olamazsnz:
addValues; addValues(); addValues(39); addValues(39, 3); // // // // derleme derleme derleme derleme zaman zaman zaman zaman hatas, hatas, hatas, hatas, parantez yok yetersiz bamsz deiken yetersiz bamsz deiken yanl trler

addValues yntemi, int trnde bir deer dndrr. Bu int deer, int deerlerin kullanlabilecei her yerde kullanlabilir. rnein:
int result = addValues(39, 3); showResult(addValues(39, 3)); // bir atamann sa tarafnda // baka bir yntem arsnda bamsz deiken olarak

Aadaki altrma, Methods uygulamasna bakmaya devam ediyor. Bu defa, baz yntem arlarn inceleyeceksiniz.

Yntem arlarn inceleyin


1. Methods projesine dnn. (Bir nceki altrmadan devam ediyorsanz, bu proje zaten Visual Studio 2008de ak olmal. Ak deilse, Belgeler klasrndeki \Microsoft Press\ Visual CSharp Step by Step\Chapter 3\Methods klasrnden an.) 2. Code and Text Editor penceresinde Window1.xaml.cs iin kodu grntleyin.

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

55

3. calculateClick yntemini bulun ve try ifadesinden ve alan parantezden sonraki ilk iki ifadeye bakn. (try ifadelerinin amacn, Hatalar ve zel Durumlar Ynetmek balkl Blm 6da ele aldk.) fadeler aadaki gibidir:
int leftHandSide = System.Int32.Parse(lhsOperand.Text); int rightHandSide = System.Int32.Parse(rhsOperand.Text);

Bu iki ifade, leftHandSide ve rightHandSide adnda iki int deikeni bildirir. Ama, ilgin olan ksm deikenlere balang deeri atanma yollardr. Her iki durumda da, System. Int32 snfnn Parse yntemi arlr (System, ad alandr ve Int32 ise bu ad alanndaki snfn addr). Bu yntemi daha nce grdnz; tek bir string parametresi alr ve int deerine dntrr. Bu iki kod satr, kullancnn form zerindeki lhsOperand ve rhsOperand metin kutularna yazdklarn alr ve int deerlerine dntrr. 4. calculateClick yntemindeki drdnc ifadeye bakn (if ifadesinden ve dier alan parantezden sonra):
calculatedValue = addValues(leftHandSide, rightHandSide);

Bu ifade addValues yntemini arr ve leftHandSide ve rightHandSide deikenlerinin deerini, bamsz deikenler olarak ynteme geirir. addValues yntemi tarafndan dndrlen deer, calculatedValue deikeninde saklanr. 5. Bir sonraki ifadeye bakn:
showResult(calculatedValue);

Bu ifade, showResult yntemini arr, calculatedValue deikenindeki deeri bamsz deiken olarak ynteme geirir. showResult yntemi bir deer dndrmez. 6. Code and Text Editor penceresinde daha nce incelediiniz showResult yntemini bulun. Bu yntemin tek ifadesi udur:
result.Text = answer.ToString();

ToString ynteminin bamsz deikeni olmad halde parantezler kullanlarak arldna dikkat edin. pucu Dier nesnelere ait olan yntemleri, nesnenin adn yntem adnn nne ekleyerek
arabilirsiniz. nceki rnekte, answer.ToString() deyimi, answer nesnesine ait ToString yntemini arr.

56

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Kapsam Uygulamak
Baz rneklerde, yntem iinde deiken yaratabileceinizi grebilirsiniz. Bu deikenler tanmlandklar yerde yaratlrlar ve ayn yntemdeki sonraki ifadeler bu deikenleri daha sonra kullanabilir. Deiken yaratldktan hemen sonra kullanlabilir. Yntem tamamlandnda, bu deikenler ortadan kalkar. Bir deiken, programda belirli bir konumda kullanlabiliyorsa, deiken o konumda kapsam (scope) iindedir. Farkl bir biimde ifade etmek gerekirse, bir deikenin kapsam, deikenin o program iinde kullanlabildii blgedir. Kapsam, deikenler iin olduu gibi yntemler iin de geerlidir. Tanmlaycnn (deiken ya da yntemin) kapsam, reneceiniz gibi, o tanmlaycy program iinde tanmlayan bildirimin yeri ile balantldr.

Yerel Kapsam Tanmlamak


Bir yntemin gvdesini oluturan alan ve kapanan kme parantezleri, kapsam tanmlar. Bir yntemin gvdesi iinde bildirdiiniz btn deikenler, o yntemin kapsamna eklenir; yntem bittiinde ortadan kalkarlar ve sadece o yntemde alan kod ile eriilebilirler. Bildirildikleri yntem iin yerel olduklarndan, bu deikenler yerel deikenler olarak adlandrlr. Baka bir yntemin kapsam iinde deillerdir. Bu dzenleme, yerel deikenleri yntemler arasnda bilgi paylam iin kullanamayacanz anlamna gelir. rnein:
class Example { void firstMethod() { int myVar; ... } void anotherMethod() { myVar = 42; // hata deiken kapsamda deil ... } }

anotherMethod (bakaYntem), kendi kapsamnda olmayan myVar (benimDeikenim) deikenini kullanmaya altndan, bu kodun derlemesi baarszlkla sonulanacaktr. myVar deikeni sadece firstMethod (ilkYntem) ifadesinde geerlidir ve myVar deikenini bildiren kod satrndan sonra ortaya kar.

Snf Kapsamn Tanmlamak


Bir snfn gvdesini oluturan alan ve kapanan kme parantezleri de bir kapsam oluturur. Snf gvdesi iinde (fakat bir yntem iinde deil) bildirdiiniz btn deikenler, o snfn

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

57

kapsamndadr. Snf tarafndan tanmlanm deikenler C#da en uygun olarak field (alan) olarak adlandrlr. Yerel deikenlere ramen, yntemler arasnda bilgiyi paylamak iin alanlar kullanabilirsiniz. rnein:
class Example { void firstMethod() { myField = 42; // tamam ... } void anotherMethod() { myField++; // tamam ... } int myField = 0; }

myField (benimAlanm) deikeni, snf iinde fakat firstMethod ve anotherMethod yntemleri dnda bildirilmitir. Bu nedenle, myField deikeni snf kapsamna sahiptir ve snf iindeki tm yntemler tarafndan kullanlabilir. Bu rnek ile ilgili bir baka nemli nokta daha var. Bir yntemde, kullanmadan nce deikeni bildirmeniz gerekir. Alanlar biraz farkldr. Bir yntem, alan tanmlayan ifadeden nce, o alan kullanabilir (derleyici detaylar sizin iin dzenler!).

Yntemleri Ar Yklemek
ki tanmlayc ayn ada sahipse ve ayn kapsam iinde bildirildilerse, ar ykl (overloaded) olduklar sylenir. ounlukla ar ykl bir tanmlayc, derleme zaman hatas olarak yakalanan bir hatadr. rnein, ayn yntem iinde ayn adla iki yerel deiken bildirirseniz, derleme zaman hatas alrsnz. Benzer ekilde, ayn snf iinde ayn adla iki alan ya da ayn snf iinde tmyle ayn iki yntem bildirirseniz yine derleme zaman hatas alrsnz. imdiye dek her eyin bir derleme zaman hatas olduunu dnrsek, tm bunlarn sz etmeye demeyecek eyler olduunu dnebilirsiniz. Bir tanmlaycy ar yklemenin hem yarar hem de nemli bir yntemi vardr. Console snfnn WriteLine yntemini dnn. Daha nce ekrana bir dize kts grntlemek iin bu yntemi kullandnz. Bununla birlikte, C# kodu yazarken Code and Text Editor penceresinde WriteLine yazdnzda, IntelliSensen size 19 farkl seenek sunduuna dikkat edin! WriteLine ynteminin her bir srm farkl parametre kmesi alr; bir srm hi bir parametre almaz ve bo bir satr sonucu verirken, bir dieri bool parametre alr ve parametre deerinin dize gsterimi sonucunu verir, baka bir srm de decimal (ondalk)

58

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

parametre alr ve dizi olarak sonu verir. Derleme zamannda, derleyici ynteme verdiiniz bamsz deiken trlerine bakar ve daha sonra parametre kmesine uygun olan yntemi arr. rnein:
static void Main() { Console.WriteLine(The answer is ); Console.WriteLine(42); }

Ar ykleme ncelikle, ayn ilemi farkl veri trleri zerinde gerekletirmeniz gerektiinde kullanldr. Farkl uygulamalar farkl parametre kmelerine sahip olduunda yntemi ar ykleyebilirsiniz; baka bir deyile, ayn ada fakat farkl parametre saysna sahip olduklarnda ya da parametre trleri farkl olduunda. Bu g ile, bir yntem ardnzda, virglle ayrlm bamsz deikenler listesi salayabilirsiniz. Ar yklenmi yntemlerden birini semek iin bamsz deiken says ve trleri derleyici tarafndan kullanlr. Bununla birlikte, yntemin parametrelerini ar ykleyebilmenize karn yntemin dn trn ar ykleyemezsiniz. Dier bir deyile, yalnzca dn trleri farkl olan ayn ada sahip iki yntem bildiremezsiniz (Derleyici aklldr, fakat o kadar da deil.)

Yntemler Yazmak
Aadaki altrmalarda, sabit bir gnlk oranla alan bir danmana belirli sayda gn altnda ne kadar deme yaplacan hesaplayan bir yntem yaratacaksnz. Uygulama mantn gelitirmekle balayacak ve daha sonra bu mantkta kullanlan yntemleri yazmanza yardmc olmas iin Generate Method Stub Wizard kullanacaksnz. Daha sonra, program anlamak iin Konsol uygulamasnda bu yntemleri altracaksnz. Son olarak, yntemler alrken ilerine girmek ve kmak iin Visual Studio 2008 hata ayklaycy kullanacaksnz.

Uygulama mantn gelitirin


1. Visual Studio 2008i kullanarak, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 3\DailyRate klasrnde yer alan DailyRate projesini an. 2. Code and Text Editor penceresinde, program kodunu grntlemek iin, Solution Explorerda, Program.cs dosyasn ift tklayn. 3. Parantez arasndaki run ynteminin gvdesine aadaki ifadeleri ekleyin:
double dailyRate = readDouble(Enter your daily rate: ); int noOfDays = readInt(Enter the number of days: ); writeFee(calculateFee(dailyRate, noOfDays));

Uygulama baladnda, Main yntemi tarafndan run yntemi arlr. (arl yolunu anlamak iin snflarn anlalmas gerekir. Bu konuyu, Snflar ve Nesneleri Yaratmak ve Ynetmek balkl Blm 7de inceledik.)

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

59

run yntemine eklediiniz kod blou, danmann gnlk cret orann kullancya sormak iin readDouble yntemini (bu yntemi yazacaksnz) arr. Sonraki ifade, gn saysn elde etmek iin readInt yntemini (bunu da yazacaksnz) arr. Son olarak, sonular ekranda grntlemek iin writeFee yntemi (yntem yazlmtr) arlr. writeFee yntemine verilen deerin, gnlk oran ve gn saysn alarak denecek toplam creti hesaplayan calculateFee ynteminden (yazmanz gereken son yntem) dnen deer olduuna dikkat edin. Not Henz readDouble, readInt, writeFee ya da calculateFee yntemlerini yazmadnz, bu nedenle, bu kodu yazdnzda IntelliSense bu yntemleri gstermez. Henz uygulamay oluturmaya almayn, baarszlkla sonulanr.

Generate Method Stub Wizard kullanarak yntemleri yazn


1. Code and Text Editor penceresinde, run yntemindeki readDouble yntem arsn farenin sa dmesiyle tklayn. Aada gsterildii gibi, kodu retmek ve dzenlemek iin yararl komutlar ieren ksayol mens grnr.

2. Ksayol mensnde, Generate Method Stub tklayn.

60

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Generate Method Stub Wizard, readDouble ynteminin arlmasn denetler, parametrelerini ve dn deerinin trn renir ve varsaylan uygulama ile yntemi retir:
private double readDouble(string p) { throw new NotImplementedException(); }

Yeni yntem, Blm 7de aklanan private tanmlandrc ile yaratlmtr. Yntem gvdesi, hemen NotImplementedException (zel durumlar Blm 6da tanmlanmtr) oluturur. Bir sonraki basamakta, yntem gvdesini kendi kodunuzla deitireceksiniz. 3. readDouble ynteminden throw new NotImplementedException(); ifadesini silin ve aadaki kod satrn yazn:
Console.Write(p); string line = Console.ReadLine(); return double.Parse(line);

Bu kod blou, ekrana p deikenindeki dize ktsn verir. Bu deiken, yntem arldnda ynteme verilen dize tr parametredir ve kullancdan gnlk oran girmesini isteyen iletiyi ierir. Not Console.Write yntemi, iletiden sonra yeni satr karakteri olmamas dnda, daha
nceki altrmalarda kullandnz Console.WriteLine ifadesi ile ayndr.

Kullanc bir deer yazar. Bu deer ReadLine yntemi tarafndan string tr olarak okunur ve double.Parse yntemi kullanlarak double trne dntrlr. Sonu, arlan yntemin dn deeri olarak verilir. Not ReadLine yntemi WriteLine yntemine benzerdir; kullancnn Enter tuuna basana
kadar klavyeden girdii karakterleri okur. Kullanc tarafndan girilen metin dn deeri olarak verilir.

4. run ynteminde readInt ynteminin arsn farenin sa dmesiyle tklayn ve daha sonra readInt yntemini oluturmak iin Generate Method Stub tklayn. Aadaki gibi, readInt yntemi oluturulur:
private int readInt(string p) { throw new NotImplementedException(); }

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

61

5. readInt yntemindeki throw new NotImplementedException(); ifadesini aadaki kod ile deitirin:
Console.Write(p); string line = Console.ReadLine(); return int.Parse(line);

Bu kod blou, readDouble yntemi kodu ile benzerdir. Tek fark, bu yntem int deeri dndrr, yani kullancnn klavyeden girdii string tr deer, int.Parse yntemi kullanlarak tamsayya dntrlr. 6. run ynteminde calculateFee ynteminin arsn farenin sa dmesiyle tklayn ve daha sonra Generate Method Stub tklayn. Aadaki gibi, calculateFee yntemi oluturulur:
private object calculateFee(double dailyRate, int noOfDays) { throw new NotImplementedException(); }

Generate Method Stub Wizardn parametre adlar iin verilen bamsz deiken adlarn kullandna dikkat edin. (Elbette, uygun olmayan parametre adlarn deitirebilirsiniz.) Daha ilgin olan, yntemden dnen deer trnn object olmasdr. Generate Method Stub Wizard, arlan ierikten yntem tarafndan dndrlecek deer trnn ne olmas gerektiini tam olarak hesaplayamaz. object tr sadece bir tr anlamndadr ve bunu ynteme kod eklerken istediiniz tr ile deitirmelisiniz. Blm 7de object tr hakknda daha fazlasn reneceksiniz. 7. Aada koyu renk olarak gsterildii gibi, calculateFee ynteminin tanmlamasn, double tr dndrecek ekilde deitirin:
private double calculateFee(double dailyRate, int noOfDays) { throw new NotImplementedException(); }

8. calculateFee yntemini, iki parametreyi arparak denecek creti hesaplayan aadaki ifade ile deitirin:
return dailyRate * noOfDays;

9. run ynteminde writeFee ynteminin arsn farenin sa dmesiyle tklayn ve daha sonra Generate Method Stub tklayn.

62

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Generate Method Stub Wizardn, calculateFee ynteminin tanmn kullanarak yntemin parametresinin double olmas gerektiini anladna dikkat edin. Ayn zamanda, yntem ars bir dnen deer kullanmaz, yani yntem void trndedir:
private void writeFee(double p) { ... }

pucu Szdizimini yeterince iyi bildiinizi dnyorsanz, Code and Text Editor

penceresinde yntemi dorudan yazabilirsiniz. Her zaman Generate Method Stub men seeneini kullanmak zorunda deilsiniz.

10. writeFee yntemine aadaki ifadeleri yazn:


Console.WriteLine(The consultants fee is: {0}, p * 1.1);

Not WriteLine ynteminin bu srm, biim dizesinin kullanmn gsterir. WriteLine ynteminin ilk parametresi olarak kullanlan dizedeki {0} metni, alma zamannda deeri hesaplanan (p * 1.1) dizesi deyiminin deeri ile yer deitiren yertutucudur. 11. Build mensnde Build Solution tklayn.

Kod Unsurlarn Yeniden Belirlemek


Visual Studio 2008in olduka kullanl bir zellii, kod unsurlarn yeniden belirleme (refactor) imkandr. Bazen, uygulamada ayn kodu (ya da benzer kodu) birden fazla yerde yazdnz grrsnz. Byle bir durumda, yazdnz kodu seerek Refactor mensnde Extract Method tklayn. Bu kodu ierecek olan yeni ynteme bir ad vermenizi isteyen Extract Method iletiim kutusu alr. Bir ad yazn ve OKi tklayn. Kodunuzu ieren yeni yntem oluturulur ve yazdnz kod yerine bu yntemin arld ifade yer alr. Extract Method ayrca, yntemin bir parametre alp almayacan ve bir deer dndrp dndrmeyeceini anlayacak kadar aklldr.

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

63

Program snayn
1. Debug mensnde, Start Without Debugging tklayn. Visual Studio 2008 program oluturur ve altrr. Bir konsol penceresi alr. 2. Enter your daily rate (Gnlk oran girin) satrna 525 yazn ve Entera basn. 3. Enter the number of days (Gn saysn girin) satrna 17 yazn ve Entera basn. Program, konsol penceresine aadaki iletiyi yazar:
The consultants fee is: 9817.5

4. Uygulamay kapatmak ve Visual Studio 2008 programlama ortamna dnmek iin Enter tuuna basn. Son altrmada programnz yava biimde altrmak iin Visual Studio 2008 hata ayklaycsn kullanacaksnz. Her yntemin ne zaman arldn (bu, stepping into the method yntemin iine adm atmak olarak adlandrlr) ve her return ifadesinin, aran ifadeye denetimi nasl aktardn (bu, stepping out of the method yntemin dna adm atmak olarak adlandrlr) greceksiniz. Yntemlerin iine girerken ve yntemlerden karken Debug ara ubuundaki aralar kullanacaksnz. Bununla birlikte, ayn komutlar uygulama Debug modunda alrken Debug mensnde de bulunur.

Visual Studio 2008 hata ayklaycsn kullanarak yntemler arasnda gezinin


1. Code and Text Editor penceresinde run yntemini bulun. 2. Fare iaretisini run yntemindeki ilk ifadeye gtrn:
double dailyRate = readDouble(Enter your daily rate: );

3. Bu satrda herhangi bir yeri farenin sa dmesiyle tklayn ve ksayol mensnde Run To Cursor tklayn. Program, run yntemindeki ilk ifadeye ulaana kadar alr ve sonra durur . Code and Text Editor penceresinin sol tarafndaki sar ok, etkin ifadeyi gsterir. Etkin ifade ayrca sar bir arka planla vurgulanr. 4. View mensnden Toolbars iaret edip Debug ara ubuunun seili olduundan emin olun. Seili deilse, Debug ara ubuu alr. Dier ara ubuklaryla yanak olabilir. Onu ayrt edemiyorsanz, View mensnden Toolbars komutunu kullanarak onu seim d brakmay deneyin ve hangi dmelerin kaybolduuna dikkat edin. Sonra ara ubuunu tekrar grntleyin. Debug ara ubuu aadaki gibi grnr (Visual Studio 2008 ve Microsoft Visual C# 2008 Express Edition ara ubuklar arasnda biraz farkllk vardr):
Step into Step over

Continue

Step out

64

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

pucu Debug ara ubuunu kendi penceresinde grntlemek iin solundaki tutamac tklayp Code and Text Editor penceresine srkleyin. 5. Debug ara ubuunda Step Into dmesini tklayn. (Soldan altnc dme.) Bu hareket, hata ayklaycnn arlan yntemin iine adm atmasna neden olur. Sar imle readDouble ynteminin parantez ama ifadesine atlar. 6. Tekrar Step Intoyu tklayn. mle ilk ifadeye ilerler:
Console.Write(p);

pucu Tekrar tekrar Debug ara ubuundaki Step Into dmesine basmak yerine F11
tuuna basabilirsiniz.

7. Debug ara ubuunda Step Over tklayn. (Soldaki yedinci dme.) Bu hareket, hata ayklama yapmadan (yntemin iine girmeden) bir sonraki ifadenin altrlmasn salar. Sar imle yntemin ikinci ifadesine hareket eder ve Visual Studio 2008e dnmeden nce program Consol penceresinde Enter your daily rate (Gn saysn girin) satrn grntler. (Console penceresi Visual Studio arkasnda gizlenmi olabilir.) pucu Debug ara ubuunda Step Overa tklamak yerine F10 tuuna da basabilirsiniz. 8. Debug ara ubuunda Step Over tklayn. Bu defa, sar imle yok olur ve program Console.ReadLine yntemini altrdndan Console penceresi etkin hale gelir ve bir eyler yazmanz bekler. 9. Console penceresinde 525 yazn ve daha sonra Entera basn. Denetim Visual Studio 2008e dner. Sar imle, yntemin nc satrnda grnr. 10. Fare iaretisiyle yntemin ikinci ya da nc satrndaki (hangisi olduu nemli deil) line deikenini iaret edin, fakat tklamayn. line deikeninin geerli deerini (525) grntleyen, Ekran pucu grnr. Yntemler iinde gezinirken, bir deikenin istenilen deerde olduundan emin olmak iin bu zellii kullanabilirsiniz. 11. Debug ara ubuunda, Step Outu tklayn. (Soldan sekizinci dme.)

Blm 3

Yntemler Yazmak ve Kapsam Uygulamak

65

Bu eylem, geerli yntemin kesintiye uramadan sonuna kadar almasna neden olur. readDouble yntemi tamamlanr ve sar imle run ynteminin ilk ifadesine geri dner. pucu Debug ara ubuunda Step Outu tklamak yerine Shift+F11 tularna basabilirsiniz. 12. Debug ara ubuunda, Step Intoyu tklayn. Sar imle run ynteminin ikinci ifadesine hareket eder:
int noOfDays = readInt(Enter the number of days: );

13. Debug ara ubuunda Step Over tklayn. Bu defa, yntemi iine girmeden altrmay semi olursunuz. Tekrar Console penceresi grnr ve gn says girmenizi ister. 14. Console penceresinde 17 yazn ve Entera basn. Denetim Visual Studio 2008e dner. Sar imle run ynteminin nc ifadesine hareket eder:
writeFee(calculateFee(dailyRate, noOfDays));

15. Debug ara ubuunda Step Intoyu tklayn. Sar imle calculateFee ynteminin alan parantez ifadesine atlar. calculateFee ynteminden dnen deer, writeFee yntemine verilecek parametre olacandan, calculateFee yntemi daha nce alr. 16. Debug ara ubuunda Step Outu tklayn. Sar imle, run ynteminin nc ifadesine atlar. 17. Debug ara ubuunda Step Intoyu tklayn. Bu defa, sar imle writeFee ynteminin bandaki alan parantez ifadesine atlar. 18. Fare iaretisiyle yntem tanmndaki p deikenini iaret edin. p deikeninin deeri, Ekran pucunda 8925.0 olarak grntlenir. 19. Debug ara ubuunda Step Outu tklayn. Console penceresinde The consultants fee is: 9817.5 (Danman creti:9817.5) iletisi grntlenir. (Console penceresi Visual Studio 2008 arkasna gizlenmi ise, n tarafa getirmeniz gerekebilir.) Sar imle, run yntemindeki nc ifadeye dner. 20. Debug ara ubuunda, Continueu tklayn (ara ubuundaki ilk dme), program her ifadede durmadan, almaya devam eder.

66

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

pucu Hata ayklaycnn almaya devam etmesi iin F5 tuuna basabilirsiniz. Uygulama tamamlanr ve almas sona erer. Tebrikler! Baarl bir ekilde yntemler yazp ardnz ve almakta olan yntemlerin iine ve dna adm atmak iin Visual Studio 2008 hata ayklaycsn kullandnz.
n

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i alr durumda brakarak, Karar fadeleri Kullanmak balkl Blm 4e gein.

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusunu grrseniz, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 3 Hzl Bavuru


Bunun in
Yntem bildirmek

unu Yapn
Yntemi bir snfn iine yazn. rnein:
int addValues(int leftHandSide, int rightHandSide) { ... }

Bir yntemin iinden deer dndrmek Bir yntemden yntemin sonundan nce dnmek Bir yntemi armak

Yntemin iine bir return ifadesi yazn. rnein:


return leftHandSide + rightHandSide;

Yntemin iine bir return ifadesi yazn. rnein:


return;

Yntemin adn ve ardndan da parantez iinde gereken bamsz deikenleri yazn. rnein:
addValues(39, 3);

Generate Method Stub Wizard kullanmak Debug ara ubuunu grntlemek Bir yntemin iine adm atmak

Yntemin arsn farenin sa dmesiyle tklayn ve daha sonra ksayol mensnden Generate Method Stub tklayn. View mensnde Toolbars iaret edin ve daha sonra Debug tklayn. Debug ara ubuunda Step Intoyu tklayn ya da Debug mensnde Step Intoyu tklayn.

Bir yntemin dna adm atmak

Debug ara ubuunda Step Outu tklayn ya da Debug mensnde Step Outu tklayn.

Blm 4

Karar fadeleri Kullanmak


Bu blm tamamladktan sonra renecekleriniz:
n n n

Boolean deikenleri bildirmek. Sonular doru ya da yanl olan deyimler yaratmak iin Boolean ileleri kullanmak. Boolean deyimlerinin sonularna dayanarak karar verme ilemi gerekletirmek iin if ifadeleri yazmak. Daha karmak karar verme ilemleri iin switch ifadeleri yazmak.

Yntemler Yazmak ve Kapsam Uygulamak balkl Blm 3te, ilikili ifadeleri yntemler iinde nasl gruplayacanz rendiniz. Ayrca, yntemlere bilgi geirmek iin bamsz deikenleri ve parametreleri kullanmay ve bir yntemden bilgi alabilmek iin return ifadelerinin kullanmn da rendiniz. Bir program, her biri belirli bir grevi ya da hesaplamay yapmak iin tasarlanm ayr ayr yntemlere blmek, gerekli bir tasarm stratejisidir. Birok programn geni ve karmak problemleri zmesi gerekir. Program yntemlere blmek, her seferinde bir paras olmak zere problemleri nasl zeceinizi anlamanza yardmc olur. Ayrca, koullara bal olarak farkl eylemleri gerekletiren seici yntemler yazabilmeniz gerekir. Bu blmde, bunu yapmay greceksiniz.

Boolean Deikenleri Bildirmek


Programlama dnyasnda (gerek dnyann aksine), her ey siyah ya da beyaz, doru ya da yanltr. rnein, x adnda bir tamsay deiken yaratp buna 99 deerini atadktan sonra x 99 deerini mi ierir? diye sorduunuzda yant kesinlikle doru olacaktr. x 10dan kk m? diye sorduunuzda da yant kesinlikle yanl olacaktr. Bunlar Boolean deyimlerine rnektir. Bir Boolean deyiminin sonucu her zaman doru ya da yanltr. Not Bu sorularn yantlar, tm programlama dilleri iin kesin deildir. Atanmam deiken,

tanmlanmam deere sahiptir ve rnein 10dan kk olduunu kesin olarak syleyemezsiniz. Bunun gibi eyler, C ve C++ programlarnda yaygn olan hata kaynaklardr. Microsoft Visual C# derleyicisi, bir deikeni sorgulamadan nce her zaman bir deer atadnzdan emin olarak bu problemi zer. Bir deer atanmam deikenin ieriini sorgulamaya altnzda, programnz derlenmez.

67

68

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Microsoft Visual C#, bool ad verilen bir veri tr salar. bool deikeni u iki deerden birini tutabilir: true (doru) ya da false (yanl). rnein, aadaki ifade areYouReady (SenHazrmsn) adnda bool veri trnde bir deiken tanmlyor, true deerini atyor ve sonra da bu deeri konsola yazyor:
bool areYouReady; areYouReady = true; Console.WriteLine(areYouReady); // True yazar

Boolean lelerini Kullanmak


Boolean ileci, sonucu doru ya da yanl olan hesaplamay gerekletiren bir iletir. C#da birok yararl Boolean ileci vardr. En basit Boolean ileci nlem iareti (!) ile gsterilen NOT ilecidir. ! ilecini Boolean deere uygularsanz, sonu o deerin tersi olur. Bir nceki rnekte, areYouReady deikeninin deeri doru ise, !areYouReady deyiminin deeri yanl olur.

Eitlik ve likisel leleri Anlamak


Sk olarak kullanacanz iki Boolean ileci de, eitlik (==) ve eitsizlik (!=) ileleridir. Ayn trdeki iki deerin birbiri ile ayn olup olmadn bulmak iin bu ikili ileleri kullanrsnz. Aadaki tabloda, rnek olarak age ad verilen int deikeni kullanlarak, bu ilelerin nasl alt zetlenmitir.
le
== !=

Anlam
Eittir Eit deildir

rnek
age == 100 age != 0

Ya 42 ise sonu
False True

Bu iki ilele yakndan ilgili dier ileler ise ilikisel (relational) ilelerdir. likisel ileleri, bir deerin ayn trde baka bir deerden kk ya da byk olup olmadn bulmak iin kullanrsnz. Aadaki tablo, bu ilelerin kullanmn gsterir.
le
< <= > >=

Anlam
Kktr Kk ya da eittir Byktr Byk ya da eittir

rnek
age < 21 age <= 18 age > 16 age >= 30

Ya 42 ise sonu
False False True True

Not Eitlik ilecini (==), atama ileci (=) ile kartrmayn. x==y deyimi, x ile yyi karlatrr ve
deerler aynysa true deerini ierir. x=y deyimi ise ynin deerini xe atar.

Blm 4

Karar fadeleri Kullanmak

69

Koullu Mantksal leleri Anlamak


C#, ayrca iki Boolean ile daha ierir: && simgesi ile gsterilen mantksal AND ileci ve || simgesi ile gsterilen mantksal OR ileci. Bunlar koullu mantksal ileler olarak bilinir. Bu iki ilecin amac, iki Boolean deyimini ya da deerlerini tek bir Boolean sonuta birletirmektir. Bu ikili ileler, sonularnn true ya da false olmas asndan eitlik ilelerine ve ilikisel ilelere benzerdir ancak zerlerinde ilem gerekletirdikleri deerlerin kendileri true ya da false olmaldr. && ilecinin sonucu, ancak ve ancak zerlerinde ilem gerekletirdii her iki deer de true ise truedur. rnein, aadaki ifade ancak ve ancak percent deeri sfrdan byk ya da sfra eitse ve 100den kk ya da 100e eitse, validPercentage (geerliYzde) deikenine true deeri atar.
bool validPercentage; validPercentage = (percent >= 0) && (percent <= 100);

pucu Yeni balayanlarn en sk yaptklar hata, percent deikenini sadece bir defa kullanarak iki snamay birletirmeye almaktr:
percent >= 0 && <= 100 // bu ifade derlenmeyecektir

Parantezler kullanmak bu tr hatalardan kanmanza yardmc olur ve ayrca deyimin amacn netletirir. rnein, aadaki iki deyimi karlatrn:
validPercentage = percent >= 0 && percent <= 100

ve
validPercentage = (percent >= 0) && (percent <= 100)

Her iki deyim de ayn deeri dndrr. nk && ileci, >= ve <= ilelerine gre ncelie sahiptir Bununla birlikte, ikinci deyim, daha iyi okunabilir ve anlalrdr.

zerinde ilem gerekletirdii Boolean deyimlerinden biri true ise, || ilecinin sonucu, true olur. Boolean deyimlerinin birleimlerinden birinin true olup olmadn belirlemek iin || ilecini kullann. rnein, aadaki ifade ancak ve ancak percent deeri sfrdan kkse veya 100den bykse, invalidPercentage (geersizYzde) deikenine true deerini atar:
bool invalidPercentage; invalidPercentage = (percent < 0) || (percent > 100);

70

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Kestirmeler Yaratmak
&& ve || ilelerinin her ikisi de kestirmeler yaratmak (short-circuiting ) ad verilen bir zellie sahiptir. Bazen, koullu mantksal deyimin sonucunu renmeye alrken her iki ileci de gerekletirmek gerekmez. rnein, && ilecinin sol tarafndaki ilenen false deeri veriyorsa, sa ilenenin deeri ne olursa olsun, tm deyimin sonucu false olmak zorundadr. Benzer ekilde, || ilecinin sol tarafndaki ilenenin deeri true ise, sa taraftaki ilenenin deerine baklmakszn sonu deeri true olur. Bu durumlarda && ve || ileleri sa taraflarndaki deyimleri atlar. Baz rnekler verelim:
(percent >= 0) && (percent <= 100)

Bu deyimde, percent deeri sfrdan kkse, && ilecinin sol tarafndaki Boolean deyiminin sonucu false olur. Bunun anlam sa tarafndaki deyim ne olursa olsun tm deyimin sonucu false olur, bu yzden && ilecinin sa tarafndaki deyimler atlanr.
(percent < 0) || (percent > 100)

Bu deyimde, percent deeri sfrdan kkse, || ilecinin sol tarafndaki Boolean deyiminin sonucu true olur. Bunun anlam sa tarafndaki deyim ne olursa olsun tm deyimin sonucu true olur, bu yzden || ilecinin sa tarafndaki deyimler atlanr. Koullu mantksal ileler kullanan deyimleri dikkatlice tasarlarsanz, gereksiz almadan kanarak kodunuzun performansn artrabilirsiniz. Kolaylkla gerekletirilen basit Boolean deyimleri, koullu mantksal ilecin sol tarafna ve daha karmak deyimleri de sa tarafa yerletirin. Birok durumda, programn karmak deyimleri deerlendirmesi gerekmeyecektir.

le ncelii ve Birleim zelliini zetlemek


Aadaki tablo, buraya kadar rendiiniz ilelerin nceliklerini ve birleim zelliklerini zetliyor. Ayn kategorideki ileler ayn zellie sahiptir. st kategorideki ileler alt kategoridekilere gre nceliklidir.

Blm 4

Karar fadeleri Kullanmak

71

Kategori
Birincil

leler
() ++ -! + ++ -* / % + < <= > >= == != && || =

Aklama
ncelii geersiz klar Sonra artrma Sonra azaltma Mantksal NOT Toplama karma nce artrma nce azaltma arpma Blme Kalan Toplama karma Kktr Kk ya da eittir Byktr Byk ya da eittir Eittir Eit deildir Mantksal AND Mantksal OR

Birleim
Sol

Tekli

Sol

arpmsal

Sol

Toplamsal likisel

Sol Sol

Eitlik Koullu AND Koullu OR Atama

Sol Sol Sol Sa

Karar Vermek iin if fadelerini Kullanmak


Boolean deyiminin sonucuna bal olarak iki farkl kod blou arasnda seim yapmak istediinizde, if ifadesini kullanabilirsiniz.

if fadesinin Szdizimini Anlamak


if ifadesinin szdizimi (if ve else C# anahtar szckleridir) aadaki gibidir:
if ( booleanExpression ) statement-1; else statement-2;

72

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

booleanExpression deyiminin sonucu true ise, statement-1 alr; aksi takdirde statement-2 alr. else anahtar szc ve sonraki statement-2 istee baldr. Eer else koulu yoksa ve booleanExpression deeri false ise, uygulama, if ifadesinden sonraki kod ile almaya devam eder. rnein, kronometrenin saniye ksmn (dakikalar imdilik yok saylmtr) gsteren deikeni artran if ifadesi aadadr. seconds (saniyeler) deikeninin deeri 59 ise, 0 deerine sfrlanr; aksi takdirde, ++ ileci kullanlarak artrlr:
int seconds; ... if (seconds == 59) seconds = 0; else seconds++;

Yalnzca Boolean Deyimleri Ltfen!


Bir if ifadesindeki deyim parantez iinde yazlmaldr. Buna ek olarak, deyim mutlaka Boolean olmaldr. Baz baka programlama dillerinde (zellikle C ve C++), tamsay deyim yazabilirsiniz ve derleyici tamsay deeri arka planda true (sfrdan farkl) ya da false (sfr) olarak deitirir. C# bunu desteklemez ve byle bir deyim yazarsanz derleyici hata verir. Bir if ifadesinde, eitlik snamas ileci, ==, yerine yanllkla atama ileci, =, yazarsanz, C# derleyicisi hatanz fark eder ve kodu derlemez. rnein:
int seconds; ... if (seconds = 59) // derleme zaman hatas ... if (seconds == 59) // tamam

Yanllkla atama ileci kullanlmas, C ve C++ programlarndaki yaygn hatalardan bir dieridir. Boolean deyimine 59 deerinin atanmas (sfrdan farkl bir say, true anlamna gelir), if ifadesinden sonraki kodun her zaman gerekletirilmesi ile sonulanr. Bu arada, aada gsterildii gibi, bir if ifadesi deyimi olarak, yine parantez arasnda yer alacak ekilde, Boolean deikeni kullanabilirsiniz:
bool inWord; ... if (inWord == true) // doru ama yaygn olarak kullanlmaz ... if (inWord) // daha iyi

Blm 4

Karar fadeleri Kullanmak

73

fadeleri Gruplamak iin Bloklar Kullanmak


Daha nce gsterilen if ifadesi szdiziminin, if (Boolean deyimi)nden sonra tek bir ifade ve else anahtar szcnden sonra da tek bir ifade belirttiine dikkat edin. Bazen, Boolean deyimi true olduunda birden fazla ifadeyi gerekletirmek istersiniz. Bu ifadeleri bir yntem iinde gruplayabilir ve sonra yeni yntemi arabilirsiniz; ancak daha basit bir zm olarak ifadeleri bir block (blok) iinde gruplayabilirsiniz. Bir blok, parantez iinde gruplanm ifadeler kmesidir. Blok ayn zamanda yeni bir kapsam balatr. Blok iinde deikenler tanmlayabilirsiniz, fakat bu deikenler blok sonunda yok olur. Aadaki rnekte, seconds deikenini sfrlayan ve minutes (dakikalar) deikenini artran iki ifade blok iinde gruplandrlmtr ve seconds deeri 59a eit ise tm blok gerekletirilir:
int seconds = 0; int minutes = 0; ... if (seconds == 59) { seconds = 0; minutes++; } else seconds++;

nemli Parantezleri kullanmazsanz, C# derleyicisi yalnzca ilk ifadeyi (seconds = 0;) if ifadesi ile ilikilendirir. Sonraki ifade (minutes++;), program derlendiinde if ifadesinden bamsz olarak her zaman altrlr. Ayrca, derleyici else anahtar szcne ulatnda, nceki if ifadesi ile ilikilendiremez ve szdizimi hatas verir.

if fadelerini Basamaklamak
if ifadelerini baka if ifadeleriyle i ie kullanabilirsiniz. Bu yolla Boolean deyimlerini, biri true sonucunu verene kadar art arda sralamak iin birbirine balayarak bir zincir oluturabilirsiniz. Aadaki rnekte, day (gn) deikeninin deeri sfrsa ilk snama true deeri verir ve dayName (gnAd) deikenine Sunday (Pazar) atanr. day deikeninin deeri sfr deilse, ilk snama baarsz olur ve denetim, ikinci if ifadesini altrp day deikenini 1 ile karlatracak olan else yantmcesine geer. Benzer ekilde, nc if ifadesine de yalnzca birinci ve ikinci snama false olduunda eriilir.
if (day == 0) dayName = Sunday; else if (day == 1) dayName = Monday;

74

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

else if (day == 2) dayName = Tuesday; else if (day == 3) dayName = Wednesday; else if (day == 4) dayName = Thursday; else if (day == 5) dayName = Friday; else if (day == 6) dayName = Saturday; else dayName = unknown;

Aadaki altrmada, iki tarihi karlatrmak iin basamakl if ifadeleri kullanan bir yntem yazacaksnz.

if ifadeleri yazn
1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzde \Microsoft Press\Visual CSharp Step by Step\Chapter 4\Selection klasrnde yer alan Selection projesini an. 3. Debug mensnde Start Without Debuggingi tklayn. Visual Studio 2008 uygulamay oluturur ve altrr. Form zerinde first ve second adnda iki DateTimePicker denetimi vardr. (Bu denetimler, aa alr okunu tklayarak tarih semenizi salayan bir takvim grntler.) Her iki denetim de bugnn tarihine ayarldr. 4. Comparei tklayn. Aadaki metin, metin kutusunda belirir:
first first first first first first == != < <= > >= second second second second second second : : : : : : False True False False True True

first == second Boolean deyimi true olmaldr; nk her ikisi de bugnn tarihini gsteriyor. Aslnda, yalnzca kktr ve byktr ileleri doru alyor gibi grnyor!

Blm 4

Karar fadeleri Kullanmak

75

5. Visual Studio 2008 programlama ortamna dnmek iin Quiti tklayn. 6. Code and Text Editor penceresinde, Window1.xaml.cs kodunu grntleyin. 7. compareClick yntemini bulun. Aadaki gibi grnr:
private int compareClick(object sender, RoutedEventArgs e) { int diff = dateCompare(first.Value, second.Value); info.Text = ; show(first == second, diff == 0); show(first != second, diff != 0); show(first < second, diff < 0); show(first <= second, diff <= 0); show(first > second, diff > 0); show(first >= second, diff >= 0); }

Kullanc form zerindeki Compare dmesini tkladnda bu yntem alr. Form zerinde first ve second DateTimePicker denetimlerinde gsterilen tarihlerin deerlerini karlatrmak iin dateCompare adnda bir baka yntem arr. dateCompare yntemini bir sonraki basamakta inceleyeceksiniz. show yntemi, form zerindeki info metin kutusunda karlatrma sonularn zetler. 8. dateCompare yntemini bulun. Aadaki ekilde grnr:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide) { // TO DO return 42; }

Bu yntem, parametrelerindeki deere bal olarak 0, -1 ya da +1 deerleri dndrmez, ne zaman arlrsa arlsn ayn deeri dndrr. Bu, neden uygulamann beklenildii gibi almadn aklar. Bu yntemin amac, bamsz deikenlerini sorgulamak ve greceli deerlerine dayanarak bir tamsay deeri dndrmektir; bamsz deikenler ayn deere sahipse

76

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

0 dndrmeli, ilk bamsz deiken deeri ikincisinden kkse -1 ve bykse +1 dndrmelidir. (Kronolojik olarak bir gn dierinden sonra geliyorsa byk olduu dnlr.) ki tarihi doru olarak karlatrmak iin bu yntemdeki mant uygulamanz gerekir. 9. // TO DO aklamasn ve return ifadesini dateCompare ynteminden silin. 10. Aada koyu renkle vurgulanan ifadeleri dateCompare ynteminin gvdesine ekleyin:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide) { int result; if (leftHandSide.Year < rightHandSide.Year) result = -1; else if (leftHandSide.Year > rightHandSide.Year) result = +1; }

leftHandSide.Year < rightHandSide deyimi true ise, leftHandSide deikenindeki gn,

rightHandSide deikenindeki gnden nce gelmelidir, yani program result deikenine -1 deeri atar. Aksi halde, leftHandSide.Year > rightHandSide.Year deyimi true ise, leftHandSide deikenindeki tarih, rightHandSide deikenindeki tarihten sonraki bir gn olmaldr, bylece program result deikenine +1 deeri atar.
leftHandSide.Year < rightHandSide.Year deyimi ve leftHandSide.Year > rightHandSide deyimi de false ise, her iki tarihin de Year zellii ayndr, bu nedenle programn her bir tarihteki aylar karlatrmas gerekir.

11. Bir nceki basamakta yazdnz koddan sonra, aada koyu renkle vurgulanan ifadeleri dateCompare yntemine ekleyin:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide) { ... else if (leftHandSide.Month < rightHandSide.Month) result = -1; else if (leftHandSide.Month > rightHandSide.Month) result = +1; }

Bu ifadeler, bir nceki basamakta yllarn karlatrlmas iin kullanlan mant izler.

Blm 4

Karar fadeleri Kullanmak

77

leftHandSide.Month < rightHandSide.Month deyimi ve leftHandSide.Month > rightHandSide. Month deyiminin her ikisi de false ise, her iki tarihin de Month zellii ayn olmaldr; bu nedenle programn son olarak her iki tarihteki gnleri karlatrmas gerekir.

12. nceki iki basamakta yazdnz koddan sonra, aada koyu renkle vurgulanan ifadeleri dateCompare yntemine ekleyin:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide) { ... else if (leftHandSide.Day < rightHandSide.Day) result = -1; else if (leftHandSide.Day > rightHandSide.Day) result = +1; else result = 0; return result; }

imdi, bu mantktaki modeli anlam olmalsnz.


leftHandSide.Day < rightHandSide.Day ve leftHandSide.Day > rightHandSide.Day

deyimlerinin her ikisi de false ise, her iki deikendeki Day zelliklerinin deerinin ayn olmas gerekir. Month deerleri ve Year deerlerinin de ayn olmas, bu nedenle iki tarihin ayn olmas gerekir ve program result deikenine 0 deeri atar. Son ifade, result deikeninde depolanan deeri dndrr. 13. Debug mensnde Start Without Debuggingi tklayn. Uygulama yeniden oluturulur ve yeniden balatlr. (first ve second), ki DateTimePicker denetimi (gnn tarihini) ayarlar. 14. Comparei tklayn. Metin kutusunda aadaki metin grnr:
first first first first first first == != < <= > >= second second second second second second : : : : : : True False False True False True

Bunlar ayn olan tarihler iin doru sonulardr. 15. kinci DateTimePicker denetiminin alr okunu ve daha sonra da yarnn tarihini tklayn.

78

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

16. Comparei tklayn. Metin kutusunda aadaki metin grnr:


first first first first first first == != < <= > >= second second second second second second : : : : : : False True True True False False

Ayn ekilde, ilk tarih ikinciden nce geldiinde, bunlar doru sonulardr. 17. Baka tarihleri de snayn ve sonularn beklediiniz gibi olduunu dorulayn. Bitirdiinizde Quiti tklayn.

Gerek Dnya Uygulamalarnda Tarihleri Karlatrmak


imdiye kadar, uzun ve karmak if ve else ifadelerini nasl kullanacanz grdnz; bunun gerek dnyada tarihleri karlatrmak iin kullanmayacanz bir teknik olduunu sylemeliyim. Microsoft .NET Framework snf ktphanesinde, tarihler DateTime ad verilen zel bir tr kullanlarak tutulur. Bir nceki altrmada yazdnz dateCompare yntemine bakarsanz, leftHandSide ve rightHandSide parametrelerinin DateTime deerlerinde olduunu grrsnz. Yazdnz mantk, bu deikenlerde sadece tarih ksmn karlatrr- ayrca zaman esi de vardr. ki DateTime deerinin eit olduu dnlrse, sadece ayn tarihe deil ayn zamana da sahip olmalar gerekir. Tarihleri ve zaman karlatrmak iin, DateTime tr Compare ad verilen yerleik ynteme sahiptir. Compare yntemi iki DateTime bamsz deikeni alr ve bunlar karlatrr; ilk bamsz deiken ikinciden kk ise sonu olarak negatif bir deer, byk ise pozitif bir deer ya da iki bamsz deiken ayn ise sonu olarak 0 deeri dndrr.

switch fadeleri Kullanmak


Basamaklanm bir if ifadesi yazdnzda kimi zaman tm if ifadelerinin benzer grndn fark edersiniz; hepsi de benzer deyimleri karlatrrlar. Tek fark, her if ifadesinin ayn deyimin sonucunu farkl bir deerle karlatryor olmasdr. rnein, day deikenindeki deeri

Blm 4

Karar fadeleri Kullanmak

79

incelemek ve haftann hangi gn olduunu bulmak iin if ifadesi kullanan aadaki kod blounu dnn:
if (day == 0) dayName = Sunday; else if (day == 1) dayName = Monday; else if (day == 2) dayName = Tuesday; else if (day == 3) ... else dayName = Unknown;

Bu durumlarda ou zaman, programnz daha etkin ve kolay okunur yapmak iin basamaklanm if ifadelerini bir switch ifadesi olarak yeniden yazabilirsiniz.

switch fadelerinin Szdizimini Anlamak


Bir switch (switch, case ve default anahtar szcklerdir) ifadesinin szdizimi aadaki gibidir:
switch ( controllingExpression ) { case constantExpression : statements break; case constantExpression : statements break; ... default : statements break; }

controllingExpression (denetimDeyimi) bir kez deerlendirilir ve constantExpression (sabitDeyim) deyiminin deeri controllingExpression deerine eit olan case (durum) altndaki ifadeler altrlr. Uygulama break ifadesine kadar alr, bu noktada switch ifadesi biter ve program switch ifadesinin kapanan parantezinden sonraki ilk ifade ile devam eder. Hibir constantExpression deeri, controllingExpression deerine eit deilse, istee bal olan default etiketinin altndaki ifadeler alr. Not Her constantExpression deeri benzersiz olmak zorundadr; bu nedenle

controllingExpression bunlardan sadece biri ile eleir. controllingExpression deeri, herhangi bir constantExpression deeri ile elemezse ve bir default etiketi yoksa program switch ifadesinin kapanan parantezinden sonraki ilk ifade ile almaya devam eder.

80

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

rnein, nceki basamaklanm if ifadesini aadaki gibi bir switch ifadesi ile yeniden yazabilirsiniz:
switch (day) { case 0 : dayName = break; case 1 : dayName = break; case 2 : dayName = break; ... default : dayName = break; }

Sunday;

Monday;

Tuesday;

Unknown;

switch fadesi Kurallarn zlemek


switch ifadesi olduka kullanldr fakat ne yazk ki her zaman istediiniz gibi kullanamazsnz. Yazdnz switch ifadesi aadaki kurallara uymak zorundadr:
n

switch ifadesini sadece int ya da string gibi temel veri trleriyle kullanabilirsiniz. Dier veri trleri ile (float ve double dahil) kullanmak isterseniz, if ifadesi kullanmanz gerekir. Durum etiketleri, 42 ya da 42 gibi, sabit deyimler olmaldr. Durum etiketlerinizi alma zamannda hesaplamak isterseniz, bir if ifadesi kullanmanz gerekir. Durum etiketleri benzersiz deyimler olmaldr. Dier bir deyile, ayn deere sahip iki durum etiketi yazamazsnz. Arada ifadeler olmadan durum etiketlerini listelemek yoluyla ayn ifadeleri birden fazla deer iin altrabilirsiniz. Byle bir durumda, listedeki tm durumlar iin son etiket kodu uygulanr. Bununla birlikte, bir etiket birden fazla ilikili ifadeye sahipse, uygulama sonraki etiketlere geemez ve derleyici hata verir. rnein:
switch (trumps) { case Hearts : case Diamonds : // Geie izin verildi etiketler arasnda kod yok color = "Red"; // Hearts ve Diamonds iin kod altrlr break; case Clubs : color = "Black"; case Spades : // Hata etiketler arasnda kod var color = "Black"; break; }

Blm 4

Karar fadeleri Kullanmak

81

Not break ifadesi, baarsz olmay engellemenin en yaygn yoludur, fakat ayn zamanda return ifadesi ya da throw ifadesi de kullanabilirsiniz. throw ifadesi, Hatalar ve zel Durumlar Ynetmek balkl Blm 6da tanmlanmtr.

switch Gei Kurallar


ki case etiketi arasnda herhangi bir kod varsa, bir case etiketinden dierine geemeyeceiniz iin, switch ifadesinin case etiketi blmlerini istediiniz gibi dzenleyebilirsiniz. (bu, default etiketi iin de geerlidir. Genellikle son etiket olarak yazlmakla birlikte, byle olmak zorunda deildir.) C ve C++ programclar, break ifadesinin, switch ifadesindeki her durum iin (default iin bile) zorunlu olduuna dikkat etmeliler. Bu iyi bir eydir; C ya da C++ programlarnda break ifadesinin unutulmas olduka yaygn bir durumdur, uygulamann bir sonraki etikete gemesine imkan verir ve zlmesi olduka zor bir bilgisayar hatasna neden olur . Gerekten istiyorsanz, sonraki case ya da default etiketine gitmek iin goto ifadesini kullanarak, C#daki baarszl taklit edebilirsiniz. Genel olarak goto ifadesi kullanmak nerilmez ve bu kitapta bunu nasl yapacanz gsterilmeyecektir! Aadaki altrmada, bir dizenin karakterlerini okuyan ve her karakteri XML karlna eleyen bir program tamamlayacaksnz. rnein, < karakterinin XMLde zel bir anlam vardr (eleri biimlendirmek iin kullanlr) ve &lt; olarak deitirilmelidir. Bylece XML ilemcisi, bunun bir XML yaps paras deil, bir veri olduunu anlar. Benzer kurallar (<), (&), () ve () iin de geerlidir. Karakterin deerini snayan ve zel XML karakterlerini durum etiketleriyle yakalayan bir switch ifadesi yazacaksnz.

switch ifadeleri yazn


1. Visual Studio 2008i balatn. 2. Belgeler klasrnzde \Microsoft Press\Visual CSharp Step by Step\Chapter 4\ SwitchStatement klasrnde bulunan SwitchStatement projesini an. 3. Debug mensnde, Start Without Debuggingi tklayn. Visual Studio 2008, uygulamay oluturur ve altrr. Uygulama, Copy dmesi ile ayrlm iki metin kutusu ieren bir form gsterir.

82

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

4. stteki metin kutusuna aadaki ifadeyi yazn:


inRange = (lo <= number) && (hi >= number);

5. Copy dmesini tklayn. fade, karakter karakter aadaki metin kutusuna kopyalanr. 6. Formu kapatn ve Visual Studio 2008e dnn. 7. Code and Text Editor penceresinde Window1.xaml.cs iin kodu grntleyin ve copyOne yntemini bulun. copyOne yntemi, stteki metin kutusundan alttaki metin kutusuna bir karakter kopyalar. u anda, copyOne yalnzca default blm olan bir switch ifadesi iermektedir. imdiki admlarda bu switch ifadesini, XMLe zg karakterleri XML karlklarna dntrmek iin deitireceksiniz. rnein, < karakteri &lt; dizesine dntrlecektir. 8. Aadaki ifadeleri, alan parantezden sonra ve dorudan default etiketinden nce switch ifadesine ekleyin:
case < : target.Text += &lt;; break;

Kopyalanan geerli karakter < ise, bu kod, k olacak metnin sonuna &lt; dizesini ekleyecektir. 9. switch ifadesine, yeni eklediiniz break ifadesinden sonra ve default etiketinden nce aadaki ifadeleri ekleyin:
case > : target.Text += &gt;; break; case & : target.Text += &amp;; break;

Blm 4
case \ : target.Text += &#34;; break; case \ : target.Text += &#39;; break;

Karar fadeleri Kullanmak

83

Not: Tek trnak iareti () ve ift trnak iareti (), XMLde olduu gibi C#da zel bir anlama
sahiptir (karakter ve dize sabitlerini snrlamak iin kullanlrlar). Son iki case etiketindeki ters kesme iareti (\), C# derleyicisinin bu karakterleri snrlayc olarak deil sabitler olarak ele almasna neden olan k karakteridir.

10. Debug mensnde, Start Without Debuggingi tklayn. 11. stteki metin kutusuna aadaki metni yazn:
inRange = (lo <= number) && (hi >= number);

12. Copyyi tklayn. fade aadaki metin kutusuna kopyalanr. Bu defa, her karakter switch ifadesinde gerekletirilen XML karlyla geer. Hedef metin kutusu aadaki metni grntler:
inRange = (lo &lt;= number) &amp;&amp; (hi &gt;= number)

13. Dier dizelerle denemeler yapn ve tm zel karakterlerin (<, >, &, , ve ) doru olarak ele alndn dorulayn. 14. Formu kapatn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 5e gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

84

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Blm 4 Hzl Bavuru


Bunun in
ki deerin eit olup olmadn grmek ki deyimin deerini karlatrmak Boolean deiken bildirmek Yalnzca iki koul da doru olduunda doru olan bir Boolean deyimi yaratmak ki kouldan biri doru olduunda doru olan bir Boolean deyimi yaratmak Bir koul doru ise bir ifadeyi altrmak Bir koul doru ise birden fazla ifadeyi altrmak

unu Yapn
== ya da != ilecini kullann. <, <=, > ya da >= ilecini kullann. Deiken tr olarak bool anahtar szcn kullann. && ilecini kullann.

rnek
answer == 42

Age >= 21

bool inRange;

inRange = (lo <= number) && (number <= hi);

|| ilecini kullann.

outOfRange = (number < lo) || (hi < number);

Bir if ifadesi kullann. Bir if ifadesi ve bir blok kullann.

If (inRange) process(); If (seconds == 59) { seconds = 0; minutes++; } switch (current) { case 0: ... break; case 1: ... break; default : ... break; }

Bir denetim deyiminin farkl deerlerini farkl ifadelerle ilikilendirmek

Bir switch ifadesi kullann.

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak


Bu blm tamamladktan sonra renecekleriniz:
n n n

Bir deikenin deerini gncellemek iin bileik atama ileleri kullanmak. while, for ve do yineleme ifadelerini yazmak. Bir do ifadesinin iine girmek ve deikenleri deiirken izlemek.

Karar fadelerini Kullanmak balkl Blm 4te, ifadeleri seime bal olarak altrmak iin if ve switch yaplarnn kullanmn rendiniz. Bu blmde, bir ya da daha ok ifadeyi yinelenen biimde altrmak iin eitli yineleme (ya da looping-dngye sokma) ifadelerini kullanmay reneceksiniz. Yineleme ifadeleri yazdnzda, yineleme ileminin ka kez yinelendiini denetlemek iin bir deikeni gncellemeniz gerekir. Bir deiken kullanarak, deikenin deerini her yinelemede gncelleyerek ve deiken belirli bir deere ulatnda yineleme srecini durdurarak bunu yapabilirsiniz. Bu durumlarda deikenin deerini gncellemek iin kullanmanz gereken baz zel atama ilelerini de reneceksiniz.

Bileik Atama leleri Kullanmak


Aritmetik ileler kullanarak yeni deerler yaratmay grmtnz. rnein, aadaki ifade answer deikeninden 42 fazla olan bir deeri konsolda grntlemek iin + ilecini kullanr.
Console.WriteLine(answer + 42);

Bir deikenin deerini deitirmek iin atama ifadelerini nasl kullanacanz da grmtnz. Aadaki ifade, answer deikeninin deerini 42 olarak deitirmek iin atama ileci kullanr:
answer = 42;

Bir deikenin deerine 42 eklemek istiyorsanz, atama ileci ile toplama ilecini birletirebilirsiniz. rnein, aadaki ifade answer deikenine 42 ekler. Bu ifade altktan sonra, answer deikeninin deeri, nceki deerinin 42 fazlas olur:
answer = answer + 42;

85

86

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Bu ifade alyor olmakla birlikte, deneyimli bir programcnn byle bir ifade kullandn gremezsiniz. Bir deikene bir deer eklemek o kadar sk rastlanan bir durumdur ki C#, bunu += ileci kullanarak, ksayoldan yapmanz salar. answer deikenine 42 eklemek iin aadaki ifadeyi yazabilirsiniz:
answer += 42;

Aadaki tabloda gsterildii gibi, atama ileci ile herhangi bir aritmetik ileci birletirmek iin bu ksayolu kullanabilirsiniz. Bu ileler toplu olarak bileik atama ileleri olarak bilinir.
Byle yazmayn
deiken = deiken * say; deiken = deiken / say; deiken = deiken % say; deiken = deiken + say; deiken = deiken - say;

Byle yazn
deiken *= say; deiken /= say; deiken %= say; deiken += say; deiken -= say;

pucu Bileik atama ileleri, basit atama ileleri ile ayn ncelik ve birleim zelliklerine sahiptir.
+= ileci ayn zamanda dizeler zerinde de alr. Bir dizeyi baka bir dizenin sonuna ekler.

rnein, aadaki kod, konsolda Hello John iletisini gsterir:


string name = John; string greeting = Hello ; greeting += name; Console.WriteLine(greeting);

Dier bileik atama ilelerini dizelerde kullanamazsnz. Not Bir deikeni bir artrmak ya da bir azaltmak iin bileik atama ileci yerine artrma (++) ve
azaltma (--) ilelerini kullann. rnein:
count += 1;

yerine
count++;

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

87

while fadeleri Yazmak


Bir Boolean deyiminin deeri true olarak kald srece bir ifadeyi tekrar tekrar altrmak iin while ifadesini kullanrsnz. while ifadesinin szdizimi aadaki gibidir:
while ( booleanExpression ) statement

Boolean deyimi deerlendirilir ve true ise ifade altrlr; daha sonra Boolean deyimi yeniden deerlendirilir. Deyimin deeri hala doru ise ifade yeniden altrlr ve Boolean deyimi yeniden deerlendirilir. Boolean deyimi false olana kadar, yani while ifadesinden kld zamana kadar bu ilem srer. Uygulama daha sonra while ifadesinden sonraki ilk ifade ile devam eder. while ifadesi, szdizimi kural bakmndan if ifadesi ile birok benzerlik gsterir (aslnda, anahtar szck dnda szdizimi ayndr):
n n n n

Deyim, bir Boolean deyim olmaldr. Boolean deyimi, parantez iinde yazlmaldr. Boolean deyiminin sonucu ilk ilemde yanl olursa, ifade almaz. while ifadesinin denetimi altnda birden ok sayda ifade gerekletirmek istiyorsanz, bu ifadeleri parantez iinde blok halinde gruplandrmalsnz.

0dan 9a kadar olan deerleri yazan bir while ifadesi yledir:


int i = 0; while (i < 10) { Console.WriteLine(i); i++; }

Tm while ifadeleri bir noktada sonlanmaldr. Boolean deyiminin deerini hatal yapacak ve dngy sonlandracak bir ifade eklemek, balang seviyesindeki programclarn yaygn olarak yapt bir hatadr. Bu, programn sonsuza kadar almasna neden olur. Bu rnekte, i++ ifadesi bunu yapmaktadr. Not while dngsndeki i deikeni, gerekletirilen yineleme saysn kontrol eder. Bu olduka

yaygn bir deyimdir ve bu rol gerekletiren deiken bazen Sentinel deiken olarak adlandrlr.

Aadaki altrmada, her seferinde bir satr olmak zere bir metin dosyas boyunca yineleme yapmak ve her satr formdaki metin kutusuna yazmak iin bir while dngs yazacaksnz.

88

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Bir while ifadesi yazn


1. Microsoft Visual Studio 2008 kullanarak, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 5\WhileStatement klasrnde bulunan WhileStatement projesini an. 2. Debug mensnde Start Without Debuggingi tklayn. Visual Studio 2008, uygulamay oluturur ve altrr. Uygulama, bir dosyay semek ve ieriini grntlemek iin kullanabileceiniz basit metin dosyas grntleyicisidir. 3. Open File tklayn. Open iletiim kutusu alr. 4. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 5\ WhileStatement\WhileStatement klasrne gidin. 5. Window1.xaml.cs dosyasn an ve daha sonra Open tklayn. Dosya ad, Window1.xaml.cs, form zerindeki kk metin kutusunda grnr fakat Window1.xaml.cs dosyasnn ierii geni metin kutusunda grnmez. Bunun nedeni, dosyann ieriini okuyacak ve gsterecek olan kodu henz altrmam olmanzdr. Bu fonksiyonellii aadaki basamaklarda ekleyeceksiniz. 6. Formu kapatn ve Visual Studio 2008e dnn. 7. Code and Text Editor penceresinde Window1.xaml.cs dosyas iin kodu grntleyin ve openFileDialogFileOk yntemini bulun. Kullanc Open iletiim kutusunda bir dosyay setikten sonra Open dmesini tkladnda bu yntem alr. Yntem ifadeleri aadaki gibi uygulanr:
private void openFileDialogFileOk(object sender, System.ComponentModel. CancelEventArgs e) { string fullPathname = openFileDialog.FileName; FileInfo src = new FileInfo(fullPathname); filename.Text = src.Name; // add while loop here }

lk ifade, fullPathname adnda bir string deiken bildirir ve openFileDialog nesnesinin FileName zelliini balang deeri olarak atar. Bu zellik, Open iletiim kutusunda seilen kaynak dosyasnn tam adn (klasr de dahil) ierir. Not openFileDialog nesnesi, OpenFileDialog snfnn bir rneidir. Bu snf, standart

Windows Open iletiim kutusunu grntlemek, dosya semek ve seilen dosyann adn ve yolunu elde etmek iin kullanabileceiniz yntemler salar.

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

89

kinci ifade, src ad verilen bir FileInfo deikeni bildirir ve Open iletiim kutusunda seilen dosyay gsteren nesneyi balang deeri olarak atar. (FileInfo, dosyalar ilemek iin kullanabileceiniz Microsoft .NET Framework tarafndan salanan bir snftr.) nc ifade, filename denetiminin Text zelliini, src deikeninin Name zelliine atar . src deikeninin Name zellii, klasr ad olmadan, Open iletiim kutusunda seilen dosyann adn tutar. fade, dosyann adn form zerindeki metin kutusunda gsterir. 8. // add while loop here (buraya while dngsn ekleyin) yorum satr yerine aadaki ifadeyi yazn:
source.Text = ;

source deikeni, form zerindeki geni metin kutusunu gsterir. Bu deikenin Text zelliine bo dize () atamak, bu metin kutusunda grntlenen mevcut metni temizler. 9. openFileDialogFileOk yntemine eklediiniz satrdan hemen sonrasna aadaki ifadeyi yazn:
TextReader reader = src.OpenText();

Bu ifade, reader adnda bir TextReader deikeni bildirir. TextReader, .NET Framework tarafndan salanan, dosya gibi bir kaynaktan karakter akn okumak iin kullanabileceiniz baka bir snftr. System.IO ad alannda yer alr. FileInfo snf, okunacak dosyay amak iin OpenText yntemi salar. Bu ifade, kullanc tarafndan Open iletiim kutusunda seilen dosyay aar, bylece reader deikeni bu dosyann ieriini okuyabilir. 10. openFileDialogFileOk yntemine eklediiniz bir nceki satrdan sonra aadaki ifadeyi ekleyin:
string line = reader.ReadLine();

Bu ifade, line adnda bir string deiken bildirir ve dosyadan ilk satr okuyarak bu deikene atamak iin reader.ReadLine yntemini arr. Bu yntem, ya metnin bir sonraki satrn ya da baka bir satr yoksa null ad verilen zel bir deeri dndrr. (balangta herhangi bir satr yoksa dosya bo olmaldr.) 11. Son yazdnz koddan sonra openFileDialogFileOk yntemine aadaki ifadeleri ekleyin:
while (line != null) { source.Text += line + \n; line = reader.ReadLine(); }

Bu, tm satrlar bitene kadar her seferinde dosyadaki bir satr zerinde yinelenen bir while dngsdr.

90

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

while dngsnn balangcndaki Boolean deyimi, line deikenindeki deeri inceler. Deer bo (null) deilse, dng gvdesi deikenin deerini yeni satr karakteri ile birlikte, source metin kutusunun Text zelliinin sonuna ekleyerek, metindeki geerli satr gsterir. (\n TextReader nesnesinin ReadLine yntemi, her satr okuduka satr sonundaki yeni satr karakterini karp atar, bu nedenle kodun yeni satr karakterini yeniden eklemesi gerekir.) While dngs, bir sonraki yinelemeyi gerekletirmeden nce, metnin sonraki satrn okur. Dosya sonuna gelindiinde, yani dosyada okunacak baka satr kalmadnda, while dngs sona erer ve ReadLine yntemi bo deer dndrr. 12. while dngsnn sonundaki kapanan kme parantezi sonrasna aadaki ifadeyi ekleyin:
reader.Close();

Bu ifade dosyay kapatr. 13. Debug mensnde Start Without Debuggingi tklayn. 14. Form grndnde, Open File tklayn. 15. Open File iletiim kutusunda, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 5\WhileStatement\WhileStatement klasrne gidin. Window1. xaml.cs dosyasn sein ve daha sonra Open tklayn. Bu defa, seilen dosyann ierii metin kutusunda grnr; dzenlediiniz kodu tanm olmalsnz:

16. Metin kutusundaki metni kaydrn ve openFileDialogFileOk yntemini bulun. Bu yntemin eklediiniz kodu ierdiini dorulayn. 17. Formu kapatn ve Visual Studio 2008 programlama ortamna dnn.

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

91

for fadeleri Yazmak


Birok while ifadesi aadaki genel yapya sahiptir:
balatma while (Boolean deyimi) { ifade denetim deikenini gncelleme }

Bir for ifadesi, balatma, Boolean deyim ve gncelleme (dngnn dzeni) ilemlerini birletirerek bu tip bir while ifadesinin daha biimsel bir srmn yazmanz salar. Bu ksmdan herhangi birini unutmak daha zor olacandan, for ifadesini kullanl bulacaksnz. for ifadesinin szdizimi aadaki gibidir:
for (balatma; Boolean deyimi; denetim deikenini gncelleme) ifade

Daha nce gsterilen, 0dan 9a kadar tamsaylar gsteren while dngsn, for dngs kullanarak yeniden yazabilirsiniz:
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }

Balatma, dngnn en banda bir defa gerekleir. Boolean deyiminin sonucu true ise, ifade alr. Denetim deikeni gncellenir ve Boolean deyimi yeniden deerlendirilir. Koul hala true ise, ifade yeniden alr, denetim deikeni gncellenir, Boolean deyimi yeniden deerlendirilir ve byle devam eder. Balatma ileminin bir defa gerekletiine, ifadenin her seferinde gncelleme gereklemeden nce altna ve gncellemenin Boolean deyiminin sonucu bulunmadan nce gerekletiine dikkat edin. for ifadesinin blmnden istediinizi kullanmayabilirsiniz. Boolean deyimini kullanmazsanz, varsaylan olarak true kabul edilir. Aadaki for ifadesi sonsuza kadar alacaktr:
for (int i = 0; ;i++) { Console.WriteLine(somebody stop me!); }

92

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Balatma ve gncelleme blmlerini kullanmazsanz, garip bir ekilde yazlm bir while ifadesi elde edersiniz:
int i = 0; for (; i < 10; ) { Console.WriteLine(i); i++; }

Not Bir for ifadesinin balatma, Boolean deyimi ve denetim deikenini gncelleme blmleri, kullanlmasa bile virglle ayrlmaldr. Gerekirse, bir for dngsnde birden fazla balatma ve birden fazla gncelleme kullanabilirsiniz (sadece bir Boolean deyimine sahip olabilirsiniz). Bunun iin, aadaki rnekte gsterildii gibi, eitli balatmalar ve gncellemeleri virglle ayrrsnz:
for (int i = 0, j = 10; i <= j; i++, j--) { ... }

Son rnek olarak, daha nceki altrmadaki while dngs, for dngs olarak aada gsterilmitir.
for (string line = reader.ReadLine(); line != null; line = reader.ReadLine()) { source.Text += line + \n; }

pucu if, while ve for gvdelerinde blok, tek bir ifade ierse bile ak biimde bir ifade blou kullanmak iyi bir alkanlk olarak grlr. Blok kullanarak, gelecekte dngye ifade ekleme iini kolaylatrm olursunuz. Blok kullanmazsanz, baka bir ifade eklediinizde, parantezleri de eklemeyi unutmamanz gerekir ve bu, olduka kolay unutulur.

for fadesinin Kapsamn Anlamak


Bir for ifadesinin balatma blmnde bir deiken bildirebildiinizi fark etmisinizdir. Bu deikenin kapsam, for ifadesinin gvdesi ile snrldr ve for ifadesi tamamlandnda yok olur. Bu kuraln iki nemli sonucu vardr. lk olarak, bu deikeni for ifadesi bittikten sonra kullanamazsnz nk artk kapsam iinde deildir. rnein:
for (int i = 0; i < 10; i++) { ... } Console.WriteLine(i); // derleme zaman hatas

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

93

kinci olarak, yan yana iki ya da daha ok for ifadesini ayn deikeni kullanarak oluturabilirsiniz nk her deiken farkl kapsam iindedir. rnein:
for (int i = 0; i < 10; i++) { ... } for (int i = 0; i < 20; i += 2) // tamam { ... }

do fadeleri Yazmak
while ve for ifadelerinin her ikisi de Boolean deyimini dngnn balangcnda test eder. Bunun anlam udur; deyim ilk deerlendirmede false sonucunu verirse, dng bir kez bile altrlmaz. do ifadesi farkldr: Boolean deyimi her yinelemeden sonra deerlendirilir, yani ifadenin gvdesi her zaman en azndan bir kez alr. do ifadesinin szdizimi aadaki gibidir (sondaki noktal virgl unutmayn):
do statement while (booleanExpression);

Dng gvdesinin birden fazla ifade iermesini isterseniz, bir ifade blou kullanmanz gerekir. Bu defa do ifadesi ile yazlm, 0dan 9a kadar olan deerleri konsola yazan rnek aadaki gibidir:
int i = 0; do { Console.WriteLine(i); i++; } while (i < 10);

94

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

break ve continue fadeleri


Blm 4te, switch ifadesinden kmak iin kullanlan break ifadesini grmtnz. break ifadesini yineleme ifadesi gvdesinden kmak iin de kullanabilirsiniz. Bir dngy krdnzda dng aniden sonlanr ve uygulama dngden sonraki ilk ifadede devam eder. Gncelleme de, devam koulu da yeniden altrlmaz. Bunun aksine, continue ifadesi, programn dngnn bir sonraki yinelemesini hemen gerekletirmesine neden olur (Boolean deyimini yeniden deerlendirdikten sonra). Konsola 0dan 9a kadar olan deerleri yazan, bu defa break ve continue ifadelerini kullanan rnek aadaki gibidir:
int i = 0; while (true) { Console.WriteLine(continue + i); i++; if (i < 10) continue; else break; }

Bu kesinlikle berbat bir kod. ou programclk klavuzu continue ifadesinin ya ok dikkatli kullanlmasn ya da hi kullanlmamasn nerir; nk her zaman anlalmas ok zor kodlar oluturur. Ayrca continue ifadesinin davran ok zor anlalr bir davrantr. rnein, bir for ifadesinin iinden bir continue ifadesi altrrsanz, dngnn bir sonraki yinelemesi gereklemeden nce gncelleme ksm alr. Aadaki altrmada, pozitif bir tamsayy, sekizlik gsteriminde dize gsterimine dntrmek iin bir do ifadesi yazacaksnz.

Bir do ifadesini inceleyin


1. Visual Studio 2008 kullanarak, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 5\DoStatement klasrndeki DoStatement projesini an. 2. Debug mensnde, Start Without Debuggingi tklayn. Uygulama, zerinde iki metin kutusu ve Show Steps adnda bir dme bulunan bir form grntler. stteki metin kutusuna pozitif bir tamsay yazdnzda (program negatif tamsaylarla almaz) ve Show Steps dmesini tkladnzda program yazdnz sayy sekizlik gsterimde dize karlna evirir. Program, sayy srekli 8e blerek her

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

95

seferinde kalan deeri hesaplar. Aadaki metin kutusu sekizlik gsterimi oluturmak iin tekrarlanan basamaklar gsterir. 3. stteki metin kutusuna 2693 yazn ve daha sonra Show Stepsi tklayn. Alttaki metin kutusu 2693 saysnn sekizlik gsterimini (5205) oluturmak iin kullanlan basamaklar gsterir:

4. Visual Studio 2008 programlama ortamna dnmek iin pencereyi kapatn. 5. Code and Text Editor penceresinde Window1.xaml.cs iin kodu gsterin. 6. showStepsClick yntemini bulun. Bu yntem, kullanc form zerindeki Show Steps dmesini tkladnda alr. Bu yntem aadaki ifadeleri ierir:
int amount = int.Parse(number.Text); steps.Text = ; string current = ; do { int nextDigit = amount % 8; int digitCode = 0 + nextDigit; char digit = Convert.ToChar(digitCode); current = digit + current; steps.Text += current + \n; amount /= 8; } while (amount != 0);

lk ifade, int trnn Parse yntemini kullanarak, number metin kutusunun Text zelliindeki dize deerini int deerine dntrr:
int amount = int.Parse(number.Text);

96

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

kinci ifade, alttaki metin kutusunda (steps ad verilen) gsterilen metnin Text zelliini bo dize olarak ayarlayarak, metni temizler.
steps.Text = ;

nc ifade current ad verilen bir string deiken bildirir ve deikene bo dize atar:
string current = ;

Bu yntemde gerek alma, drdnc ifade olan do ifadesi tarafndan gerekletirilir:


do { ... } while (amount != 0);

Algoritma, srekli olarak amount deikenini 8e bler ve kalan hesaplar, her baarl blme ilemi oluturulan dizede bir sonraki sayy oluturur. En sonunda, amount deeri 0 olduunda, dng biter. Dng gvdesinin en azndan bir defa almas gerektiine dikkat edin. Bu davran, 0 says da bir sekizlik sayya sahip olduundan gerekten istenilen bir davrantr. Kodu daha yakndan incelediinizde, do dngs iindeki ilk ifadenin aadaki gibi olduunu grrsnz:
int nextDigit = amount % 8;

Bu ifade nextDigit (sonrakiBasamak) ad verilen bir int deikeni bildirir ve amount deikenindeki deeri 8e bldkten sonra kalan deeri atar. Bu say 0 ile 7 arasnda bir say olacaktr. Sonraki ifade u ekildedir:
int digitCode = 0 + nextDigit;

Bu ifade biraz aklama gerektirir! Karakterler, iletim sistemi tarafndan kullanlan karakter kmesine uygun olarak benzersiz koda sahiptir. Microsoft Windows iletim sistemi tarafndan sklkla kullanlan karakter kmesinde, 0 karakteri iin kod 48 tamsay deeridir. 1 karakteri iin kod 49, 2 iin 50dir ve 9 karakterine kadar kod bir artarak devam eder, 9 karakteri iin kod 57dir. C# dili, bir karakteri tamsay olarak ele almanza ve zerinde aritmetik ilem yapabilmenize imkan tanr. Aritmetik ilemlerde C# deer olarak karakterin kodunu kullanr. Yani, 0 + nextDigit deyimi, sonu olarak 48 ve 55 arasnda bir deer verecektir (nextDigit deerinin 0 ile 7 arasnda bir deer olacan hatrlayn). do dngsnn iindeki nc ifade udur
char digit = Convert.ToChar(digitCode);

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

97

Bu ifade, digit (basamak) ad verilen bir char deikeni bildirir ve deikene Convert. ToChar(digitCode) yntemi arsnn sonucunu atar. Convert.ToChar(digitCode) yntemi, karakter kodunu tutan tamsayy alarak uygun karakteri dndrr. Yani, rnein, digitCode deikeni 54 deerine sahipse, Convert.ToChar(digitCode), 6 karakterini dndrr. zet olarak, do dngsndeki ilk ifade, kullancnn girdii say ile ilgili olarak en kk anlaml (en sada bulunan) sekizlik sayy gsteren karakteri hesaplar. Bir sonraki grev, bu sayy sonu dizesine aadaki gibi eklemektir:
current = digit + current;

do dngsndeki sonraki ifade yledir:


steps.Text += current + \n;

Bu ifade, saynn sekizlik gsterimi iin imdiye kadar retilen saylar ieren dizeyi, Steps metin kutusuna ekler. do dngsndeki son ifade yledir:
amount /= 8;

Bu bir bileik atama ifadesidir ve amount = amount / 8; ifadesi ile ayndr. amount deikeninin deeri 2693 ise, bu ifade altktan sonra amount deeri 336 olur. Son olarak, dngnn sonundaki while yan tmcesindeki koul gerekletirilir:
while (amount != 0)

amount deikeninin deeri henz 0 olmadndan, dng baka bir yineleme gerekletirir. Son altrmada, nasl altn anlamanza yardmc olmas iin, Visual Studio 2008 hata ayklaycsn kullanarak nceki do ifadesinin iine gireceksiniz.

do ifadesinin iine girin


1. Window1.xaml.cs dosyasn gsteren Code and Text Editor penceresinde, imleci showStepsClick (basamaklarTklaGster) ynteminin ilk ifadesine getirin:
int amount = int.Parse(number.Text);

2. lk ifadede herhangi bir yeri farenin sa dmesiyle tklayn ve daha sonra Run To Cursor tklayn. 3. Form grndnde, stteki metin kutusuna 2693 yazn ve daha sonra Show Stepsi tklayn. Program durur ve Visual Studio 2008 hata ayklama moduna geersiniz. Code and Text Editor penceresinin sol tarafndaki sar ok geerli ifadeyi gsterir.

98

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

4. Zaten ak deilse, Debug ara ubuunu grntleyin. (View mensnde Toolbars iaret edin ve daha sonra Debug tklayn.) 5. Debug ara ubuunda, Windows alr okunu tklayn. Not Windows simgesi, Debug ara ubuunda en sadaki simgedir. Aadaki men grnr:

Not Microsoft Visual C# 2008 Express Edition kullanyorsanz, ortaya kan ksayol mens, sonraki resimde gsterilenleri ierir. 6. Menden Localsi tklayn. Locals penceresi grnr (zaten ak deilse). Bu pencere, geerli yntemde, amount yerel deikeni de dahil olmak zere, yerel deikenlerin adn, deerini ve trn gsterir. amount deikeninin deerinin 0 olduuna dikkat edin:

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

99

7. Debug ara ubuunda Step Into dmesini tklayn. Hata ayklayc aadaki ifadeyi altrr:
int amount = int.Parse(number.Text);

Locals penceresinde amount deikeninin deeri 2693 olarak deiir ve sar ok bir sonraki ifadeye geer. 8. Tekrar Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
steps.Text = ;

Bu ifade, Locals penceresini etkilemez nk steps bir yerel deiken deildir, form zerinde bir denetimdir. Sar ok bir sonraki ifadeye hareket eder. 9. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
string current = ;

Sar ok, do dngsnn bandaki alan paranteze hareket eder. 10. Step Intoyu tklayn. Sar ok, do dngs iindeki ilk ifadeye hareket eder. do dngs yerel deiken ierir: nextDigit, digitCode ve digit. Bu yerel deikenlerin Locals penceresinde grndne ve deikenin tmnn deerinin 0 olduuna dikkat edin. 11. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
int nextDigit = amount % 8;

Locals penceresindeki nextDigit deeri 5 olarak deiir. Bu, 2693n 8e blnmesi sonucu kalan deerdir. 12. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
int digitCode = 0 + nextDigit;

Locals penceresindeki digitCode deeri 53 olarak deiir. Bu, 5 karakterinin kodudur (48+5).

100

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

13. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:


char digit = Convert.ToChar(digitCode);

Locals penceresindeki digit deeri 5 olarak deiir. Locals penceresi, alt izili saysal deer (bu rnekte, 53) ve ayn zamanda karakter gsteriminin (5) her ikisini kullanarak char deerlerini gsterir. Locals penceresinde, current deikeninin deerinin olduuna dikkat edin. 14. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
current = current + digit;

Locals penceresinde current deeri 5 olarak deiir. 15. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
steps.Text += current + \n;

Bu ifade, arkasnda metin kutusunda yeni satrn gsterilmesi iin yeni satr karakteri ile birlikte 5 metnini steps metin kutusunda gsterir. (Form, Visual Studio arkasna gizlenmitir, bu nedenle gremeyebilirsiniz.) 16. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
amount /= 8;

Locals penceresinde amount deeri 336 olarak deiir. Sar ok do dngsnn sonundaki kapanan paranteze hareket eder. 17. Step Intoyu tklayn. Sar ok while ifadesine hareket eder. 18. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
while (amount != 0);

amount deeri 336dr ve 336 != 0 deyimi true sonucunu verir, bu nedenle do dngs dier yinelemeyi gerekletirir. Sar ok, do dngsnn bandaki alan paranteze atlar. 19. Step Intoyu tklayn. Sar ok do dngsndeki ilk ifadeye hareket eder.

Blm 5

Bileik Atama ve Yineleme fadeleri Kullanmak

101

20. do dngsnn sonraki yinelemesinin iine girmek iin tekrar tekrar Step Intoyu tklayn ve Locals penceresinde deikenin deerinin nasl deitiini izleyin. 21. Dngnn drdnc yinelemesinin sonunda, amount deeri 0 ve current deeri 5205 olur. Sar ok, do dngsnn srdrme koulu zerindedir.
while (amount != 0);

amount deeri imdi 0dr, bu nedenle amount != 0 deyimi false olacak ve do dngs sonlanacaktr. 22. Step Intoyu tklayn. Hata ayklayc aadaki ifadeyi altrr:
while (amount != 0);

Tahmin edilecei gibi, do dngs sonlanr ve sar ok showStepsClick ynteminin sonundaki kapanan paranteze hareket eder. 23. Debug ara ubuundaki Continue dmesini tklayn. 2693 saysnn sekizlik gsterimini oluturmak iin kullanlan drt basama gsteren form grntlenir: 5, 05, 205 ve 5205. 24. Visual Studio 2008 programlama ortamna dnmek iin formu kapatn. Tebrikler! Anlaml while ve do ifadelerini baaryla yazdnz ve do ifadesinin iine girmek iin Visual Studio 2008 hata ayklaycsn kullandnz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i alr durumda brakn ve Blm 6ya gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

102

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Blm 5 Hzl Bavuru


Bunun in
Bir deikene bir miktar eklemek Bir deikenden bir miktar karmak Bir koul doru iken bir ya da daha fazla ifade altrmak

unu Yapn
Bileik toplama ilecini kullann. rnein:
variable += amount;

Bileik karma ilecini kullann. rnein:


variable -= amount;

while ifadesi kullann. rnein:


int i = 0; while (i < 10) { Console.WriteLine(i); i++; }

Ya da for ifadesi kullann. rnein:


for (int i = 0; i < 10; i++) { Console.WriteLine(i); }

fadeleri bir ya da daha fazla sayda tekrar tekrar uygulamak

do ifadesi kullann. rnein:


int i = 0; do { Console.WriteLine(i); i++; } while (i < 10);

Blm 6

Hatalar ve zel Durumlar Ynetmek


Bu blm tamamladktan sonra renecekleriniz:
n n n n

try, catch ve finally ifadelerini kullanarak zel durumlar ilemek. checked ve unchecked anahtar szcklerini kullanarak tamsay tamalarn denetlemek. throw anahtar szcn kullanarak kendi yntemlerinizde zel durumlar oluturmak. Bir finally blou kullanarak, zel bir durum meydana gelse bile kodunuzun her zaman altndan emin olmak.

Yntemler yazmak ve okumak; deikenler bildirmek; deerler yaratmak iin ileleri kullanmak; kodlar seime bal olarak altrmak iin if ve switch ifadeleri yazmak ve kodlar tekrar tekrar altrmak iin while, for ve do ifadeleri yazmak iin gereken temel Microsoft Visual C# ifadelerini grdnz. Bununla birlikte, nceki blmler baz eylerin ters gidebilecei olasln hesaba katmad. Kod paralarnn her zaman beklenildii gibi alacandan emin olmak olduka zordur. Birou programc olarak sizin kontrolnz dnda olan ok sayda nedenden dolay hatalar meydana gelebilir. Yazdnz uygulamalar hatalar fark edebilmeli ve bu hatalarn stesinden gelebilmelidir. Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri balkl Ksm 1in bu son blmnde, C#n bir hata olutuunda haber vermek iin nasl zel durumlar oluturduunu ve bu zel durumlarn gsterdii hatalar yakalamak ve hatalarn stesinden gelmek (hatalar ilemek) iin try, catch ve finally ifadelerinin nasl kullanlacan reneceksiniz. Bu blmn sonunda, C# Dilini Anlamak balkl Ksm 2de kullanacanz ok salam bir C# temeline sahip olacaksnz.

Hatalarla Baa kmak


Bazen kt eylerin meydana gelmesi hayatn gereidir. Lastikler patlar, piller biter, tornavidalar hibir zaman braktnz yerde olmaz ve uygulamalarnz nceden bilinmeyen ekilde davranr. Program alrken hemen hemen her aamasnda hatalar meydana gelebilir, yleyse hatalar zmek iin onlar nasl fark edeceksiniz? Yllar boyunca, ok sayda mekanizma gelitirilmitir. UNIX gibi eski sistemler tarafndan benimsenmi tipik yaklam, yntem baarszla uradnda zel bir genel deiken atamak iin iletim sisteminde bir dzenleme ierirdi. Daha sonra, her yntem arldktan sonra, yntemin baarl olup olmadn grmek iin genel deikeni denetlerdiniz. C# ve birok dier nesne-ynelimli programlama dilleri hatalar bu yolla ele almaz. Bu olduka zahmetlidir. Bunun yerine, zel durumlar (exceptions) kullanrlar. Gl C# programlar yazmak istiyorsanz, zel durumlar bilmeniz gerekir.
103

104

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Kodu Denemek ve zel Durumlar Yakalamak


C#, zel durumlar ve zel durum ileyicileri kullanarak, hata ileme kodunu programn ana akn gerekletiren koddan ayrmay kolaylatrr. zel durumlar fark eden programlar yazmak iin aadaki iki ilemi yapmanz gerekir: 1. Kodunuzu bir try blou (try , C# anahtar szcdr) iinde yazn. Kod altnda, try blou iindeki tm ifadeleri altrmaya kalkr ve ifadelerin hibiri bir zel durum oluturmazsa, biri dierinden sonra olmak zere tm ifadeler alr. Bununla birlikte, bir hata koulu meydana gelirse, uygulama try blou dna ve zel durumu yakalamak ve ilemek iin tasarlanm baka bir kod parasna atlar. 2. Herhangi bir olas hata koullarnn stesinden gelmek iin try bloundan hemen sonra bir ya da birden fazla catch ileyici (catch bir baka C# anahtar szcdr) yazn. catch ileyici, belirli bir tr zel durumu yakalamak ve ilemek iin tasarlanmtr. Bir try bloundan sonra, her biri belirli bir zel durumu yakalamak ve ilemek iin tasarlanm birden fazla catch ileyiciye sahip olabilirsiniz. Bylece try blou iinde oluabilecek farkl hatalar iin farkl ileyiciler salayabilirsiniz. try blou iindeki ifadelerden herhangi biri bir hataya neden olursa, alma zaman zel bir durum oluturur. alma zaman daha sonra, try bloundan sonraki catch ileyiciyi snar ve denetimi dorudan ilk eleen ileyiciye iletir. Kullancnn form zerindeki baz metin kutularna yazd dizeleri tamsay deerlere eviren, bir deeri hesaplamak iin yntem aran ve sonucu baka bir metin kutusuna yazan try bloundaki kod rnei aadadr. Bir dizeyi tamsayya evirmek iin dizenin dzenli sralanm geerli karakterler iermesi gerekir. Dizeler geersiz karakterler ierirse, int.Parse yntemi FormatException (BicimOzelDurumu) zel durumunu oluturur ve uygulama uygun catch ileyiciye aktarlr. catch ileyici bittiinde, program ileyiciden sonraki ilk ifade ile devam eder:
try { int leftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (FormatException fEx) { // zel durumu ile ... }

Blm 6

Hatalar ve zel Durumlar Ynetmek

105

Bir zel Durumu lemek


catch ileyici, yakalanacak olan zel durumu belirtmek iin, yntem parametresi tarafndan kullanlan szdizimine benzer szdizimi kullanr. nceki rnekte, FormatException zel durumu oluturulduunda, zel durumun ayrntlarn ieren nesne fEx deikenine yerletirilir. FormatException tr, zel durumun gerek nedenini belirlemek iin snayabileceiniz ok sayda zellie sahiptir. Bu zelliklerin birou tm zel durumlar iin ortaktr. rnein, Message zellii, zel duruma neden olan hatann tanmn yapan bir metin ierir. zel durumu ilerken, belki ayrntlar bir gnlk dosyasna kaydederken ya da kullancya hata olutuunu bildiren ve kullancnn tekrar denemek isteyip istemediini soran anlaml bir ileti grntlerken bu bilgiyi kullanabilirsiniz.

lenmemi zel Durumlar


Bir try blou zel bir durum oluturursa ve uygun bir catch ileyicisi yoksa ne olur? Bir nceki rnekte, lhsOperand metin kutusundaki geerli bir dizenin tamsay karl C# tarafndan desteklenen geerli tamsay aral dnda (rnein, 2147483648) olabilir. Bu durumda, int.Parse ifadesi FormatException catch ileyicisi tarafndan yakalanamayacak bir OverflowException (TasmaOzelDurumu) zel durumu oluturacaktr. Byle bir durum meydana gelirse, try blou yntemin bir parasysa, yntem aniden sona erer ve uygulama arlan ynteme dner. arlan yntem bir try blou kullanrsa, alma zaman, arlan yntemdeki try bloundan sonra eleen catch ileyiciyi bulmaya ve uygulamaya alr. arlan yntem bir try blou kullanmyorsa, ya da eleen bir catch ileyici yoksa arlan yntemden hemen klr ve uygulama srecin tekrarland, yntemin arld noktaya dner. Sonunda eleen bir catch ileyici bulunursa, catch ileyici alr ve uygulama yakalayan yntemdeki catch ileyiciden sonraki ilk ifadeden devam eder. nemli Bir zel durumun yakalanmasndan sonra, uygulamann zel durumu yakalayan catch
blounu ieren yntemde devam ettiine dikkat edin. Bir yntemde oluan zel durum, catch ileyiciyi ierenden farkl ise, denetim, zel duruma neden olan ynteme dnmez.

arlan yntemler listesine dnldkten sonra, alma zaman eleen bir catch ileyici bulamazsa, program ilenmemi bir zel durum ile sonlanr. Uygulamay Microsoft Visual Studio 2008 hata ayklama modunda altryorsanz (uygulamay altrmak iin Debug mensnden Start Debuggingi setiyseniz), aadaki bilgi iletisi grnr ve uygulama, zel durumun nedenini belirlemenizi salayan hata ayklaycya atlar.

106

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Birden ok catch leyici Kullanmak


Kukusuz, farkl hatalar farkl hata durumlarn ifade etmek iin farkl trde zel durum yaratr. Byle durumlarn stesinden gelmek iin, aadaki gibi arka arkaya birden ok catch ileyicisi yazabilirsiniz:
try { int leftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (FormatException fEx) { //... } catch (OverflowException oEx) { //... }

Birden ok zel Durumu Yakalamak


C# ve Microsoft .NET Framework tarafndan salanan zel durum yakalama mekanizmas olduka kapsamldr. .NET Frameworkde birok farkl zel durum tanmlanmtr ve yazdnz

Blm 6

Hatalar ve zel Durumlar Ynetmek

107

herhangi bir program bunlarn birounu oluturabilmelidir! Kodunuzun oluturabilecei her zel durum iin catch ileyiciler yazmak istemezsiniz. Peki, programlarnzn tm olas zel durumlar yakalayacandan ve ileyeceinden nasl emin olabilirsiniz? Bu sorunun yant, farkl zel durumlarn bir dieri ile ilikili olmasnda yatar. zel durumlar, kaltm hiyerarileri ad verilen aileler olarak dzenlenir. (Kaltm ile almak balkl Blm 12de kaltm hakknda daha fazla ey reneceksiniz) FormatException ve OverflowException zel durumlarnn her ikisi de SystemException (SistemOzelDurumu) ailesindendir. Bu zel durumlarn her birini ayr ayr yakalamak yerine, SystemException yakalayan bir ileyici yaratabilirsiniz. SystemException ailesi de Exception ad verilen tm zel durumlarn byk ailesinin bir yesidir. Exception yakalarsanz, ileyici, meydana gelebilecek her olas zel durumu yakalar. Not Exception ailesi, geni bir zel durum eitlilii ierir. Bunlarn birou .NET Frameworkun

eitli ksmlar tarafndan kullanlmak iin tasarlanmtr. Bunlarn bazlar, zeldir fakat onlarn da nasl yakalanacan anlamak yararl olacaktr.

Aadaki rnek tm olas sistem zel durumlarnn nasl yakalanacan gsterir:


try { int leftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (Exception ex) // bu genel bir catch ileyicidir { //... }

pucu Bir Exception yakalamak istiyorsanz, varsaylan zel durum olduundan, catch ileyiciye zel durumun adn vermeyebilirsiniz:
catch { // ... }

Bununla birlikte, bu her zaman nerilmez. catch ileyiciye verilen zel durum nesnesi, zel durum ile ilgili yararl bilgi ierebilir. Bu bilgi, yukardaki catch yaps kullanldnda mevcut deildir.

Bu noktada sormanz gereken son bir soru var: Bir zel durum, try blounun sonunda birden ok catch ileyicisi ile eleirse ne olur? ki farkl ileyicide FormatException ve Exception yakalarsanz, hangisi alr (ya da her ikisi de alacak mdr)?

108

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

zel bir durum meydana geldiinde, zel durum ile eleen alma zaman tarafndan bulunan ilk ileyici kullanlr ve dierleri yok saylr. Bunun anlam udur: FormatException iin ileyiciden nce, Exception iin ileyici bulunursa, FormatException ileyicisi hibir zaman almayacaktr. Bu nedenle, daha zel catch ileyicilerini, bir try bloundan sonraki genel catch ileyicisinin stne yerletirmelisiniz. zel catch ileyicilerinin hibiri zel durumla elemezse, genel catch ileyici eleecektir. Aadaki altrmada bir try blou yazacak ve bir zel durumu yakalayacaksnz.

Bir try/catch ifadesi yazn


1. Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step By Step\Chapter 6\ MathsOperators klasrnde yer alan MathsOperators zmn an. Bu zm, Deikenler, leler ve Deyimlerle almak balkl Blm 2de grmtnz. Farkl aritmetik ileleri gstermek iin kullanlmt. 3. Debug mensnde Start Without Debuggingi tklayn. Bir form alr. Left Operand metin kutusuna geerli olmayan bir metin girin. Bu, programn u anki durumunun salamlktan ne kadar uzak olduunu gsterecek. 4. Left Operand metin kutusuna John yazp Calculate dmesini tklayn. Bir iletiim kutusunda, Left Operand metin kutusunda girdiiniz metnin uygulamann baarsz olmasna neden olduu, ilenmemi zel durum olutuu rapor edilir.

Not Microsoft Visual C# 2008 Express Edition kullanyorsanz, Debug dmesi grnmeyecektir. Denetim Masasnda problem raporlamay nasl yaplandrdnza bal olarak iletiim kutusunun farkl bir srmn (daha sonra gsterilecektir) grebilirsiniz. Yukardaki iletiim kutusunu grrseniz, aadaki basamaklardaki ynergelerde Close Program dmesini tklayn dendiinde Close the program balantsn tklayn, Debug dmesini tklayn dendiinde Debug the program balantsn tklayn. (Windows Vista deil, Windows XP kullanyorsanz, Debug, Send Error Report ve Dont Send dmeleri olan farkl bir iletiim kutusu greceksiniz. Program kapatmak iin Dont Send dmesini tklayn.)

Blm 6

Hatalar ve zel Durumlar Ynetmek

109

5. Visual Studio 2008 kullanyorsanz, Debug tklayn. Visual Studio Just-In-Time Debugger iletiim kutusundaki, Possible Debuggers listesinden MathsOperators Microsoft Visual Studio: Visual Studio 2008i sein ve Yesi tklayn:

6. Visual C# 2008 Express Edition kullanyorsanz, Close Program tklayn. Debug mensnde Start Debuggingi tklayn. Left Operand metin kutusuna John yazn ve Calculatei tklayn. 7. Visual Studio 2008 de kullansanz, Visual C# 2008 Express Edition da kullansanz Visual Studio 2008 hata ayklayc balar ve zel duruma neden olan kod satrn vurgulayp zel durum hakknda baz ek bilgiler grntler:

110

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

calculateClick yntemindeki int.Parse yntemini armak yoluyla zel durum oluturulduunu grebilirsiniz. Problem, bu yntemin John metnini geerli bir sayya ayrtramamasdr. Not zel duruma neden olan kodu, ancak bilgisayarnzda gerekten kaynak koda sahip
olursanz grebilirsiniz.

8. Debug mensnde Stop Debuggingi tklayn. 9. Code and Text Editor penceresinde Window1.xaml.cs dosyasnn kodunu grntleyin ve calculateClick yntemini bulun. 10. Aadaki gibi, ynteme drt ifadeden oluan try blounu ekleyin:
try { int leftHandSide = int.Parse(lhsOperand.Text); int rightHandSide = int.Parse(rhsOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); }

11. Bu yeni try blounun kapanan kme parantezinden hemen sonra bir catch blou ekleyin:
catch (FormatException fEx) { result.Text = fEx.Message; }

Bu catch ileyici, int.Parse tarafndan oluturulan FormatException zel durumunu yakalar ve daha sonra zel durumun Message zelliindeki metni, formun alt tarafndaki result metin kutusunda gsterir. 12. Debug mensnde Start Without Debuggingi tklayn. 13. Left Operand metin kutusuna John yazn ve daha sonra Calculatei tklayn. catch ileyici baarl bir ekilde FormatException zel durumunu yakalar ve Result metin kutusuna Input string was not in a correct format (Giri dizesi doru biimde deildi) iletisi yazlr. Uygulama imdi biraz daha gldr.

Blm 6

Hatalar ve zel Durumlar Ynetmek

111

14. John metnini 10 says ile deitirin, Right Operand metin kutusuna Sharp yazn ve daha sonra Calculatei tklayn. try blou her iki metin kutusunu da ayrtran ifadeleri evrelediinden, ayn zel durum ileyicisinin her iki metin kutusundaki kullanc giriini ilediine dikkat edin. 15. Visual Studio 2008 programlama ortamna dnmek iin Quiti tklayn.

Denetimli ve Denetimsiz Tamsay Aritmetii Kullanmak


Blm 2de, + ve * gibi ikili aritmetik ilelerini int ve double gibi temel veri trleri zerinde nasl kullanacanz rendiniz. Ayrca, temel veri trlerinin sabit boyutlar olduunu da rendiniz. rnein, bir C# int tam olarak 32 bittir. int trnn sabit bir boyutu olmasndan dolay, tamsay aralnn tam olarak ne kadar olduunu bilirsiniz: 2147483648den 2147483647ye kadardr. pucu Kod iinde intin en dk ve en yksek deerini bulmak isterseniz, int.MinValue
(tamsayMinimumDeger) ya da int.MaxValue (tamsayMaksimumDeger) alanlarn kullanabilirsiniz.

int trnn sabit boyutu sorun yaratr. rnein, deeri 2147483647 olan bir int deikenine 1 eklemek isterseniz ne olur? Bu sorunun cevab, uygulamann nasl derlendiine baldr. Varsaylan ayar olarak, C# derleyicisi, hesaplamann sessizce tamasna izin veren kod retir. Dier bir deyile, yanl sonu alrsnz. (Aslnda, hesaplama en geni negatif tamsay deerine gider ve sonu 2147483648 olur.) Bu davrann nedeni performanstr: tamsay aritmetii neredeyse her programda olan bir ilemdir ve her tamsay deyimine tama denetimi eklemek performans olduka drebilir. Birok durumda, int deerinizin snrlar amayacan bildiinizden (ya da umduunuzdan!), bu risk gze alnabilir. Bu yaklam beenmediyseniz, tama denetimi ekleyebilirsiniz.

112

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

pucu Visual Studio 2008de proje zelliklerini ayarlayarak tama denetimini etkinletirebilirsiniz.
Project mensnnde Projeniz Propertiesi tklayn (Projeniz, projenizin addr.) Proje zellikleri iletiim kutusunda, Build sekmesini tklayn. Sayfann sa alt kesindeki Advanced dmesini tklayn. Advanced Build Settings iletiim kutusunda, Check for arithmetic overflow/underflow onay kutusunu iaretleyin ya da temizleyin.

Bir uygulamay nasl derlediinize baklmakszn, uygulamanzn gerekli olduunu dndnz ksmnda aritmetik tama denetimini etkinletirmek ya da iptal etmek iin checked ve unchecked anahtar szcklerini kullanabilirsiniz. Bu anahtar szckler proje iin belirlenen derleme seeneini etkisiz klar.

Denetlenmi fadeler Yazmak


Denetlenmi ifade, banda checked anahtar szc ile balayan bir bloktur. Denetlenmi ifadedeki tm tamsay aritmetii, aada gsterildii gibi bloktaki tamsay hesaplamasnda tama olursa, her zaman OverflowException zel durumu oluturur.
int number = int.MaxValue; checked { int willThrow = number++; Console.WriteLine(this wont be reached); }

nemli Tama denetimi sadece, checked blou iindeki tamsay aritmetiinde yaplr. rnein, denetlenmi ifadelerden birisi yntem ars ise, denetim arlan yntemde alan koda uygulanmaz. unchecked blok ifadesi yaratmak iin de unchecked anahtar szcn kullanabilirsiniz. unchecked bloktaki hibir tamsay aritmetii denetlenmez ve asla bir OverflowException zel durumu oluturmaz. rnein:
int number = int.MaxValue; unchecked { int wontThrow = number++; Console.WriteLine(this will be reached); }

Blm 6

Hatalar ve zel Durumlar Ynetmek

113

Denetlenmi Deyimler Yazmak


checked ve unchecked anahtar szcklerini, parantez iinde yazlm bir tamsay deyiminin banda kullanarak bu tr deyimlerdeki tamay denetlemek iin de kullanabilirsiniz. rnein:
int wontThrow = unchecked(int.MaxValue + 1); int willThrow = checked(int.MaxValue + 1);

Bileik ileler (+= ve -= gibi) ile artrma (++) ve azaltma (--) gibi ileler aritmetik ilelerdir ve checked ve unchecked anahtar szckleri kullanlarak denetlenebilirler. Unutmayn, x += y; ile x = x + y; ayn eydir. nemli checked ve unchecked anahtar szcklerini, kayan noktal (tamsay olmayan)

aritmetikleri denetlemek iin kullanamazsnz. checked ya da unchecked anahtar szckleri sadece int ve long gibi tamsay aritmetiklerini denetler. Kayan noktal aritmetikler 0.0a blseniz bile asla zel durum yaratmazlar. (.NET Framework sonsuzluk gsterimine sahiptir.)

Aadaki altrmada, Visual Studio 2008 kullandnzda denetlenmi aritmetii nasl gerekletireceinizi greceksiniz.

Denetlenmi deyimler kullann


1. Visual Studio 2008e dnn. 2. Debug mensnde Start Without Debuggingi tklayn. imdi ok byk iki deeri arpmay deneyeceksiniz. 3. Left Operand metin kutusuna 9876543, Right Operand metin kutusuna da 9876543 yazn. Multiplication sein ve Calculatei tklayn. Form zerindeki Result metin kutusunda 1195595903 deeri grnr. Bu negatif bir deerdir, doru sonu olamaz. Bu deer, int trnn 32 bit snrndan sessizce tam olan arpma ileminin sonucudur. 4. Quiti tklayn ve Visual Studio 2008 programlama ortamna geri dnn. 5. Window1.xaml.cs dosyasn gsteren Code and Text Editor penceresinde, multiplyValues (degerleriCarp) yntemini bulun. u ekilde grnr:
private int multiplyValues(int leftHandSide, int rightHandSide) { expression.Text = leftHandSide.ToString() + * + rightHandSide.ToString(); return leftHandSide * rightHandSide; }

return ifadesinde, sessizce taan arpma ilemi vardr.

114

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

6. Dnen deer denetlenmi olacak ekilde, return ifadesini aadaki gibi dzenleyin:
return checked(leftHandSide * rightHandSide);

arpma ilemi imdi denetimlidir ve sessizce hatal bir deer dndrmek yerine bir OverflowException oluturur. 7. calculateClick yntemini bulun. 8. calculateClick yntemindeki FormatException catch ileyicisinin hemen sonrasna aadaki catch ileyiciyi ekleyin:
catch (OverflowException oEx) { result.Text = oEx.Message; }

pucu Bu catch ileyicinin mant, FormatException catch ileyicinin mant ile ayndr.
Bununla birlikte, yine de genel bir Exception catch ileyicisi yazmak yerine bu ileyicileri ayrmak nemlidir nk gelecekte bu zel durumlar farkl ekilde ilemeye karar verebilirsiniz.

9. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 10. Left Operand metin kutusuna 9876543, Right Operand metin kutusuna da 9876543 yazn. Multiplication sein ve Calculatei tklayn. kinci catch ileyici baarl bir ekilde OverflowException zel durumunu yakalar ve Result metin kutusunda Arithmetic operation resulted in an overflow (Aritmetik ilem bir tama ile sonuland) iletisini gsterir. 11. Visual Studio 2008 programlama ortamna dnmek iin Quiti tklayn.

zel Durumlar Oluturmak


Tek bir int bamsz deikeni alan ve ilgili ayn adn veren monthName (ayAdi) adl bir yntem yazdnz dnn. rnein, monthName(1) January(Ocak), monthName(2) February (ubat) deerini dndrr. Bamsz deiken 1den kk ya da 12den byk olduunda ne dndrmelidir? Bu sorunun en iyi yant yntem hibirey dndrmemeli ve zel bir durum oluturmaldr. .NET Framework snf ktphaneleri, bunun gibi durumlar iin tasarlanm ok sayda zel durum ierir. Birok durumda bu snflardan birinin sizin zel durumunuza uyduunu ve onu kullanabileceinizi greceksiniz. (Uyan bir tane bulamazsanz, kendinizinkini kolayca yaratabilirsiniz, ancak bunu yapmadan nce C# dili

Blm 6

Hatalar ve zel Durumlar Ynetmek

115

hakknda biraz daha bilgiye sahip olmanz gerekir.) Bu durumda, var olan .NET Framework ArgumentOutOfRangeException (BagimsizDegiskenLimitDisindazelDurumu) snf uygundur. Aadaki rnekte gsterildii gibi, throw ifadesini kullanarak zel durum oluturabilirsiniz:
public static string monthName(int month) { switch (month) { case 1 : return January; case 2 : return February; ... case 12 : return December; default : throw new ArgumentOutOfRangeException(Bad month); } }

throw ifadesinin, ortaya karaca bir zel durum nesnesine ihtiyac vardr. Bu nesne, bir hata iletisi de dahil olmak zere, zel durumun ayrntlarn ierir. Buradaki rnek, yeni bir ArgumentOutOfRangeException nesnesi yaratan deyim kullanr. Nesne, bir kurucu kullanarak Message zelliini yerletirecek olan bir dize ile balatlr. Kurucular, Snflar ve Nesneleri Yaratmak ve Ynetmek balkl Blm 7de ayrntl olarak ele alnmtr. Aadaki altrmalarda, bir zel durum oluturmak iin MathsOperators proje kodu ekleyeceksiniz.

Kendi zel durumunuzu oluturun


1. Visual Studio 2008e dnn. 2. Debug mende Start Without Debuggingi tklayn. 3. Left Operand metin kutusuna 24, Right Operand metin kutusuna 36 yazn ve Calculatei tklayn. Result metin kutusunda sfr deeri belirir. Aslnda, hibir ileci semediiniz hemen anlalmamaktadr. Result metin kutusunda bir tanlama iletisi grntlemek daha iyi olacaktr. 4. Visual Studio 2008 programlama ortamna dnmek iin Quiti tklayn. 5. Window1.xaml.csi gsteren Code and Text Editor penceresinde doCalculation (hesaplamaYap) yntemini bulun. doCalculation yntemi aadaki gibidir:
private int doCalculation(int leftHandSide, int rightHandSide) { int result = 0; if (addition.IsChecked.HasValue && addition.IsChecked.Value) result = addValues(leftHandSide, rightHandSide);

116

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri


else if (subtraction.IsChecked.HasValue && subtraction.IsChecked.Value) result = subtractValues(leftHandSide, rightHandSide); else if (multiplication.IsChecked.HasValue && multiplication.IsChecked.Value) result = multiplyValues(leftHandSide, rightHandSide); else if (division.IsChecked.HasValue && division.IsChecked.Value) result = divideValues(leftHandSide, rightHandSide); else if (remainder.IsChecked.HasValue && remainder.IsChecked.Value) result = remainderValues(leftHandSide, rightHandSide); return result;

addition (toplama), subtraction (karma), multiplication (arpma), division (blme) ve remainder (kalan) alanlar form zerindeki seenek dmeleridir. Her biri, kullancnn o seenei seip semediini gsteren IsChecked (Secildi) ad verilen bir zellie sahiptir. IsChecked zellii nullable (bo olabilir) deer zelliine bir rnektir, belirli bir deer ierebilir ya da tanmlanmam durumda olabilir. (Deerleri ve Bavurular Anlamak balkl Blm 8de nullable deerler ile ilgili daha ok ey greceksiniz.) IsChecked.HasValue zellii, seenek dmesinin tanmlanm durumda olup olmadn gsterir ve tanmlanmsa, IsChecked.Value zellii de durumun ne olduunu gsterir. IsChecked.Value zellii Boolean trndedir ve dme seilmi ise true, seilmemise false deerindedir. Basamaklanm if ifadesi hangi seenek dmesinin seilmi olduunu bulur. (Seenek dmeleri birbirini dlayan zelliktedir, yani kullanc sadece bir seenek dmesi seebilir.) Hibir dme seili deilse, hibir if ifadesi true olmayacaktr ve result deikeni balang deerinde (sfr) kalacaktr. Bu deiken yntem tarafndan dndrlen deeri tutar. Form zerindeki result metin kutusuna ileti yazmak iin, if-else basamaklanm ifadesine bir tane daha else ekleyerek problemi zmeye alabilirsiniz. Bununla birlikte, bu zm iyi bir fikir deildir nk ileti yazmak bu yntemin gerek amac deildir. Hatay bulma ve uyarma ile hatay yakalama ve ilemeyi ayrmak daha iyidir. 6. if-else ifadelerinin sonuna (return ifadesinden hemen nce) baka bir else ifadesi ekleyin ve aadaki gibi InvalidOperationException (GeersizIslemOzelDurumu) zel durumunu yaratn:
else throw new InvalidOperationException(no operator selected);

7. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 8. Left Operand metin kutusuna 24, Right Operand metin kutusuna 36 yazn ve Calculatei tklayn. zel durum iletiim kutusu alr. Uygulama bir zel durum oluturmutur fakat kodunuz bunu yakalamaz. 9. Close Program tklayn. Uygulama sonlanr ve Visual Studio 2008e dnersiniz.

Blm 6

Hatalar ve zel Durumlar Ynetmek

117

imdiye kadar, throw ifadesi yazdnz ve bir zel durum oluturduunu doruladnz. imdi bu zel durumu ilemek iin catch ileyici yazacaksnz.

Kendi yarattnz zel durumu yakalayn


1. Window1.xaml.csyi gsteren Code and Text Editor penceresinde calculateClick yntemini bulun. 2. Aadaki catch ileyiciyi, calculateClick yntemindeki mevcut iki catch ileyicinin hemen altna ekleyin:
catch (InvalidOperationException ioEx) { result.Text = ioEx.Message; }

Bu kod, hibir seenek dmesi seilmediinde oluturulan InvalidOperationException zel durumunu yakalar. 3. Debug mensnde Start Without Debuggingi tklayn. 4. Left Operand metin kutusuna 24, Right Operand metin kutusuna 36 yazn ve Calculatei tklayn. Result metin kutusunda no operator selected (hibir ile seilmedi) iletisi grnr. 5. Quiti tklayn. Uygulama imdi eskisinden daha salam. Ama hala yakalanmayacak olan ve uygulamann kmesine neden olabilecek zel durumlar var. rnein, sfra blmeye alrsanz, ilenmeyen bir DivideByZeroException (SifiraBolunmeOzelDurumu) oluur. (Tamsayy sfra blmek, kayan noktay sfra blmekten farkl olarak bir zel durum oluturur.) Bunu zmenin bir yolu calculateClick ynteminin iine daha fazla sayda catch ileyici yazmaktr. Fakat daha iyi bir zm catch ileyicilerinin sonuna Exception yakalayan genel catch ileyici eklemektir. Bu, tm ilenmemi zel durumlar yakalayacaktr. pucu lenmemi tm zel durumlarn ak bir ekilde bir yntemde yakalanp yakalanmama

karar, oluturduunuz uygulamann doasna baldr. Baz durumlarda, zel durumlar oluur olumaz yakalamak nemlidir. Baz durumlarda ise, zel durumun yntemin arld noktaya yaylmasna izin vermek daha yararldr.

lenmemi zel durumlar yakalayn


1. Window1.xaml.csyi gsteren Code and Text Editor penceresinde calculateClick yntemini bulun.

118

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

2. Mevcut catch ileyicilerinin sonuna aadaki catch ileyiciyi ekleyin:


catch (Exception ex) { result.Text = ex.Message; }

Bu catch ileyici, hangi trde olursa olsun, tm ilenmemi zel durumlar yakalayacaktr. 3. Debug mensnde Start Without Debuggingi tklayn. imdi, zel durumlar olumasna neden olacan bildiiniz baz hesaplamalar yapmaya ve tm zel durumlarn doru olarak ilendiini dorulamaya alacaksnz. 4. Left Operand metin kutusuna 24, Right Operand metin kutusuna 36 yazn ve Calculatei tklayn. Result metin kutusunda hala no operator selected (hibir ile seilmedi) iletisi olduunu dorulayn. Bu ileti, InvalidOperationException ileyici tarafndan retilmitir. 5. Left Operand metin kutusuna John yazn ve daha sonra Calculatei tklayn. Result metin kutusunda Input string was not in a correct format (Giri metni doru biimde deil) hata iletisinin grndn dorulayn. Bu ileti FormatException ileyicisi tarafndan retilmiti. 6. Left Operand metin kutusuna 24, Right Operand metin kutusuna 0 yazn, Divide seenek dmesini sein ve Calculatei tklayn. Result metin kutusunda Attempted to divide by zero (sfra blmeye alld) hata iletisinin grndn dorulayn. Bu ileti genel Exception ileyici tarafndan retilmiti. 7. Quiti tklayn.

Bir finally Blou Kullanmak


Bir zel durum oluturulduunda, programn akn deitireceini unutmamak nemlidir. Yani, bir ifadenin her zaman bir nceki ifade bittiinde alacan garanti edemezsiniz, nk nceki ifade bir zel durum oluturabilir. Aadaki rnee bakn. reader.Close (okuyucu.Kapat) arsnn her zaman oluacan varsaymak ok kolaydr. Ne de olsa kodun iindedir:
TextReader reader = src.OpenText(); string line; while ((line = reader.ReadLine()) != null) { source.Text += line + \n; } reader.Close();

Blm 6

Hatalar ve zel Durumlar Ynetmek

119

Bazen, belirli bir ifadenin almamas sorun deildir, fakat birok durumda bu byk bir problem olabilir. Bir ifade, bir nceki ifadede tutulan kayna serbest brakrsa, bu ifadenin uygulanmamas kaynan alkonmas olarak sonulanr. Bu rnek tam da u durumu gsterir: src.OpenText ynteminin arlmas baaryla sonulanrsa, bir kayna tutar (bir dosya ileyici) ve kayna serbest brakmak iin reader.Close yntemini ardnzdan emin olmalsnz. reader.Close yntemi arlmazsa, er ya da ge dosya ileyici almayacaktr ve daha fazla dosya aamayacaksnz demektir. (Dosya ileyiciyi nemsiz bulduysanz, bir de veritaban balantlarn dnn.) Bir zel durum oluturulsa da oluturulmasa da, ifadenin her zaman altndan emin olmann yolu, ifadeyi bir finally blounun iine yazmaktr. finally blou, bir try bloundan hemen sonra ya da try bloundan sonraki son catch ileyiciden hemen sonra ortaya kar. Program finally blou ile ilikili try blouna girdii srece finally blou her zaman alacaktr (bir zel durum meydana gelse bile). Bir zel durum oluturulur ve yerel olarak yakalanrsa, ilk olarak finally bloundan sonraki zel durum ileyici alr. zel durum yerel olarak yakalanmazsa (alma zamannn, bir ileyici bulmak iin arlan yntemleri aratrmas gerekirse), ilk olarak finally blou alr. Her durumda, finally blou alr. reader.Close probleminin zm aadaki gibidir:
TextReader reader = null; try { reader = src.OpenText(); string line; while ((line = reader.ReadLine()) != null) { source.Text += line + \n; } } finally { if (reader != null) { reader.Close(); } }

Bir zel durum oluturulsa da, finally blou, reader.Close ifadesinin her zaman alacan garanti eder. p Toplama ve Kaynak Ynetimini Kullanmak balkl Blm 4te bu problemi zmenin baka bir yolunu greceksiniz.
n

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 7e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

120

Ksm I

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri

Blm 6 Hzl Bavuru


Bunun in
Bir zel durum yaratmak Tamsay aritmetiinin her zaman tama iin denetlendiinden emin olmak

unu Yapn
Bir throw ifadesi kullann. rnein:
throw new FormatException(source);

checked anahtar szc kullann. rnein:


int number = Int32.MaxValue; checked { number++; }

Belirli bir zel durumu yakalamak

Belirli zel durum snfn yakalayan bir catch ileyici yazn. rnein:
try { ... } catch (FormatException fEx) { ... }

Btn zel durumlar bir catch ileyicisi ile yakalamak

Exception snfn yakalayan bir catch ileyicisi yazn. rnein:


try { ... } catch (Exception ex) { ... }

Baz kodlarn, zel durum olusa dahi her zaman altklarndan emin olmak

Kodu bir finally blounun iine yazn. rnein:


try { ... } finally { // her zaman alr }

Adm Adm Microsoft Visual C# 2008

C# Dilini Anlamak
Bu ksmdaki konular: Blm 7 . Snflar ve Nesneleri Yaratmak ve Ynetmek . . . . . . . . . . . . . . . . . . . . . Blm 8 . Deerleri ve Bavurular Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 9 . Numaralandrma ve Yaplar ile Deer Trleri Yaratmak . . . . . . . . . . . . Blm 10 . Dizileri ve Koleksiyonlar Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 11 . Parametre Dizilerini Anlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 12 . Kaltm ile almak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 13 . Arabirimler Yaratmak ve Soyut Snflar Tanmlamak . . . . . . . . . . . . . Blm 14 . p Toplama ve Kaynak Ynetimini Kullanmak . . . . . . . . . . . . . . . . . 123 145 167 185 207 217 239 257

Ksm II

121

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek


Bu blm tamamladktan sonra renecekleriniz:
n n n n n

likili yntemler ve veri eleri kmesi ieren bir snf tanmlamak. public ve private anahtar szcklerini kullanarak yelerin eriilebilirliini denetlemek. Bir kurucu armak iin new anahtar szcn kullanarak nesneler yaratmak. Kendi kurucularnz yazmak ve armak. static anahtar szcn kullanarak ayn snfa ait tm rnekler tarafndan paylalabilecek yntemler ve veri yaratmak.

Microsoft Visual C# ve Microsoft Visual Studio 2008e Giri balkl Ksm 1de deikenlerin bildirimini, deerler yaratmak iin ilelerin kullanmn, yntemleri armay ve bir yntem olutururken gereken ifadeleri yazmay rendiniz. Artk yntemleri ve verileri kendi snflarnzda birletirme aamasna gemek iin yeterli bilgiye sahipsiniz. Microsoft .NET Framework, binlerce snf ierir. Konsol ve zel Durum snflar da dahil olmak zere bunlarn bir ounu kullandnz. Snflar uygulamalar tarafndan ayarlanm varlklar modellemek iin uygun mekanizma salar. Bir varlk (entity), mteri gibi zel bir eyi ya da ilem gibi daha soyut bir eyi gsterebilir. Herhangi bir sistemin tasarm sreci ksm, nemli varlklar belirlemek ve daha sonra da hangi bilgilerin gerekli olduunu ve hangi ilevlerin gerekletirilmesi gerektiini bulmakla ilgilidir. Bir snfn tuttuu bilgiyi alanlar olarak saklarsnz ve snfn gerekletirebilecei ilemleri uygulamak iin yntemleri kullanrsnz. C# Dilini Anlamak balkl Ksm IIdeki blmler, kendi snflarnz yaratmak iin gerekli bilgileri salar.

Snflandrmay Anlamak
Snf (class), snflandrma (classification) teriminin kk kelimesidir. Bir snf tasarladnzda, bilgileri sistematik olarak anlaml bir ekilde dzenlemi olursunuz. Bu, snflandrma admlarndan birisidir ve yalnzca programclarn deil herkesin yapt bir eydir. rnein, btn arabalarn ortak davranlar (ynlendirilebilir, durdurulabilir, hzlandrlabilir, vs.) ve ortak znitelikleri (bir direksiyonlar, bir motorlar vs.) vardr. Bu ortak davranlara ve zniteliklere sahip btn nesneleri anlatmak iin araba szcn kullanrsnz. Bir szck, ne anlama geldii konusunda herkes fikir birliine vardnda tmyle doru i grr; karmak
123

124

Ksm II

C# Dilini Anlamak

ama kesin fikirleri ksa bir biimde ifade edebilirsiniz. Snflandrma olmadan, insanlarn dnebileceklerine ya da iletiim kurabileceklerine inanmak gtr. Snflandrmann, dnme ve iletiim kurma eklimize ne kadar kkl biimde etkisi olduunu anladmza gre, bir sorunun ve zmnn doasnda bulunan farkl kavramlar snflandrarak ve daha sonra da bu snflar bir programlama dili ile modelleyerek program yazmaya almak anlaml olur. Bu tam da Microsoft Visual C# gibi modern nesne ynelimli programlama dillerinin yapt eydir.

Kapsllemenin Amac
Kapslleme, nemli bir snf tanmlama ilkesidir. Ana fikir udur: Snf kullanan bir program o snfn nasl altn bilmek durumunda deildir; sadece snfn bir rneini yaratr ve o snfn yntemini arr. Yntemler yapmalar sylenen eyleri yapt srece, program yntemlerin nasl alt ile ilgilenmez. rnein, Console.WriteLine yntemini ardnzda, Console snfnn, ekrana yazmak iin veri zerinde nasl dzenlemeler yaptyla ilgili kark ayrntlar bilmek istemezsiniz. Snfn, eitli yntemleri gerekletirmek iin her tr dahili aamann bilgisine ihtiyac olabilir. Bu aama bilgisi ve ilemler, snf kullanan programdan gizlenir. Bu nedenle, kapslleme bazen bilgi gizleme olarak adlandrlr. Kapsllemenin iki nemli kullanm vardr:
n

Yntem ve verileri bir snf iinde birletirmek; dier bir deyile snflandrmay desteklemek. Yntem ve verilerin eriilebilirliklerini denetlemek; dier bir deyile snfn kullanmn denetlemek.

Bir Snf Tanmlamak ve Kullanmak


C#da, yeni bir snf tanmlamak iin class anahtar szcn kullanrsnz. Snfn veri ve yntemleri, kme parantez arasnda snfn gvdesinde yer alr. Aada, bir yntem (dairenin alann hesaplamak iin) ve bir para veri (dairenin yarap) ieren Circle (Daire) adl bir C# snf grebilirsiniz:
class Circle { double Area() { return Math.PI * radius * radius; } int radius; }

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

125

Not Math (Matematik) snf, matematik sabitleri ieren alanlar ve matematik hesaplamalar gerekletirmek iin yntemler ierir. Math.PI alan, pi says deerini (3.14159265358979323846) ierir. Snf gvdesi, olaan yntemler (Area gibi) ve alanlar (radius gibi) ierir; bir snf iindeki deikenlere alan ad verildiini hatrlayn. Blm 2de deikenleri nasl bildireceinizi ve Blm 3te de yntemlerin nasl yazldn grmtnz; aslnda burada hemen hemen yeni bir szdizimi yok. Circle snfnn kullanm, daha nce grdnz dier trlerin kullanm ile ayndr. Trn Circle olarak belirttiiniz bir deiken yaratrsnz ve daha sonra da deikene geerli bir balang verisi atarsnz. rnein:
Circle c; c = new Circle(); // Bir Circle deikeni yarat // Balat

new anahtar szcnn kullanmna dikkat edin. Daha nce, int ya da float trnde bir deikeni balatrken, basit olarak bir deer atardnz:
int i; i = 42;

Bunu snf trnde deikenlerle yapamazsnz. Bunun bir nedeni, C#da deikenlere sabit snf deerleri atamak iin bir szdizimi yoktur. (42nin Circle edeeri nedir?) Bir dier neden ise, alma zaman tarafndan deikenler ve snf trleri iin ayrlan ve ynetilen bellek ile ilgilidir (Bu konu, Deerler ve Bavurular Anlamak balkl Blm 8de ayrntlaryla incelenmitir). imdilik, sadece new anahtar szcnn, bir snfn yeni bir rneini (daha ok nesne olarak adlandrlr) yarattn bilmeniz yeterlidir. Bununla birlikte, aadaki gibi snfn bir rneini, dorudan ayn trde baka bir deikene atayabilirsiniz:
Circle c; c = new Circle(); Circle d; d = c;

Bununla birlikte, Blm 8de ele alnan nedenlerden dolay, bu grnd kadar kolay deildir. nemli snf ve nesne terimlerini kartrmayn. Snf bir trn tanmdr. Nesne ise, o trn
program altnda yaratlan bir rneidir.

126

Ksm II

C# Dilini Anlamak

Eriilebilirlii Denetlemek
Ne yazk ki, Circle snfnn pratik bir kullanm yoktur. Yntemlerinizi ve verilerinizi bir snf iinde kapsllediinizde, snf d dnyaya kar bir snr oluturur. Snf iinde tanmlanan alanlar (radius gibi) ve yntemler (Area gibi), snf iindeki dier yntemler tarafndan grlebilir fakat snr dndaki dnya tarafndan grlemez. Yani, program iinde bir Circle nesnesi yaratabilseniz bile, bu nesnenin radius alanna ya da Area yntemi arsna ulaamazsnz. Bu, snfn neden ok fazla kullanlmadn gsterir-henz! Bununla birlikte, bir alan ya da ynteme snr dndan eriilebileceklerini ya da eriilemeyeceklerini public ve private anahtar szckleri ile denetleyebilirsiniz:
n

Bir yntem ya da alana sadece bir snfn iinden eriilebiliyorsa, o yntem ya da alan private (zel) olarak deerlendirilir. Yntem ya da alann private olduunu bildirmek iin, bildiriminden nce private anahtar szcn kullann. Varsaylan ayar olarak yntem ve alanlar privatedr; fakat karklktan kanmak iin ak bir ekilde yntemin ya da alann private olduunu belirtmek iyi bir uygulamadr. Bir yntem ya da alana hem ierden hem de dardan eriilebiliyorsa, o yntem ya da alan public (genel) olarak deerlendirilir. O yntem ya da alann public olduunu bildirmek iin, bildiriminden nce public anahtar szcn kullann.

te yine Circle snf. Bu defa, Area bir public yntem ve radius da bir private alan olarak bildirilmitir:
class Circle { public double Area() { return Math.PI * radius * radius; } private int radius; }

Not C++ ile program gelitirenler, public ve private anahtar szcklerinden sonra iki nokta st ste olmadn farketmilerdir. Her bildirimde anahtar szcn yinelemelisiniz. radius alannn private olarak bildirildiine dikkat edin; snf dndan eriilemez. Bununla birlikte, Circle snf iinden eriilebilir. Bu nedenle, Area yntemi Circle snf iinde olduundan radius alanna eriebilir. Bunun anlam, snf hala snrl deerdedir nk radius alann balatmann bir yolu yoktur. Bunu zmek iin bir kurucu kullanabilirsiniz. pucu Bir snftaki alanlara trlerine bal olarak 0, false ya da null balang deeri otomatik olarak atanr. Bununla birlikte, alanlara balang deeri verilmesini ak bir ekilde belirtmek yine de iyi bir uygulamadr.

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

127

Adlandrma ve Eriilebilirlik
Alanlar ve yntemler iin aadaki adlandrma kurallar, snf yelerinin eriilebilirliine dayanr:
n

public tanmlayclar byk harfle balamaldr. rnein, Area, public olduundan A ile (a deil) balar. Bu sistem, PascalCase adlandrma kural olarak bilinir. (lk olarak Pascal dilinde kullanlmtr.) private tanmlayclar kk harfle balamaldr. rnein, radius, private olduundan r ile (R deil) balar. Bu sistem, camelCase adlandrma kural olarak bilinir.

Bu kurala tek bir istisna vardr: snf adlar byk harfle balamaldr ve kurucularn adlar kendi snf adlar ile elemelidir. Bu nedenle private bir kurucu ad da byk harfle balamaldr. nemli Adlarnn arasndaki tek fark kk/byk harf kullanm olan, iki public snf yesi bildirmeyin. Bildirirseniz, Microsoft Visual Basic gibi kk/byk harfe duyarl olmayan programlama dillerinde snfnz kullanlamaz.

Kurucularla almak
Bir nesne yaratmak iin new anahtar szc kullandnzda, alma zaman, snf tanmlamasn kullanarak nesneyi kurmak zorundadr. alma zamannn, iletim sisteminden bir para bellek alan almas, bu bellek alann snf tarafndan tanmlanm alanlar ile doldurmas ve daha sonra herhangi bir balatma gerektiinde bunu gerekletirmek iin bir kurucuya bavurmas gerekir. Kurucu (constructor), bir snfn rneini yarattnzda otomatik olarak alan zel bir yntemdir. Snf ile ayn ada sahiptir ve parametreler alabilir fakat bir deer dndrmez (void bile). Her snf, bir kurucuya sahip olmak zorundadr. Siz bir kurucu yazmazsanz, derleyici sizin iin otomatik olarak varsaylan kurucu retir. (Bununla birlikte, derleyicinin rettii varsaylan kurucu gerekte hibir ey yapmaz.) Kendi varsaylan kurucunuzu kolayca yazabilirsiniz; sadece, snf ile ayn adda, bir deer dndrmeyen public bir yntem ekleyin. Aadaki rnek Circle snfnn varsaylan kurucu ile radius alann 0 deeri ile balatmasn gstermektedir:
class Circle { public Circle() { radius = 0; }

// varsaylan kurucu

128

Ksm II

C# Dilini Anlamak

public double Area() { return Math.PI * radius * radius; } private int radius; }

Not C# terminolojisinde, default (varsaylan) kurucu, herhangi bir parametre almayan kurucudur. Derleyici de yaratm olsa siz de yazm olsanz farketmez; her iki durumda da varsaylan kurucudur. Kurucular Ar Yklemek balkl bir sonraki blmde de greceiniz gibi, varsaylan olmayan kurucular da (parametreler alan kurucular) yazabilirsiniz. Kurucunun public olarak iaretlendiine dikkat edin. Bu anahtar szck yazlmazsa, kurucu private olacaktr (dier yntemler ve alanlar gibi). Kurucu private ise, snf dnda kullanlamaz. Bu, Circle snfnn paras olmayan yntemlerden Circle nesneleri yaratabilmenizi engeller. Bu nedenle private kurucularn deerli olmadn dnebilirsiniz. Private kurucular da kullanldr fakat u an konu dndadr. imdi, Circle snfn kullanabilir ve Area yntemini test edebiliriz. Bir Circle nesnesinde Area yntemine bavurmak iin nokta iaretini nasl kullanacanza dikkat edin:
Circle c; c = new Circle(); double areaOfCircle = c.Area();

Kurucular Ar Yklemek
Sona yaklatnz fakat henz bitmedi. imdi bir Circle deikeni bildirebilir, onu yeni yaratlm bir Circle nesnesine ayarlayabilir ve daha sonra Area yntemini arabilirsiniz. Bununla birlikte, hala son bir problem var. Btn Circle nesnelerinin alanlar her zaman 0 olacaktr. nk varsaylan kurucu, yarap 0 olarak atar ve 0 olarak kalr; radius alan privatedr ve balang deeri atandktan sonra deitirilemez. Bu problemi zmenin bir yolu, kurucularn yalnzca zel bir tr yntem olduklarn ve btn yntemler gibi ar yklenebileceklerini anlamaktr. Console.WriteLine ynteminin her biri farkl parametreler alan birka srm olduu gibi, bir kurucunun da farkl srmlerini yazabilirsiniz. Aadaki gibi, Circle snfna radius parametresi ile bir kurucu ekleyebilirsiniz:
class Circle { public Circle() { radius = 0; } // varsaylan kurucu

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

129

public Circle(int initialRadius) // ar yklenmi kurucu { radius = initialRadius; } public double Area() { return Math.PI * radius * radius; } private int radius; }

Not Bir snftaki kurucularn sras nemsizdir. stediiniz srada tanmlayabilirsiniz. Daha sonra, yeni bir Circle nesnesi yaratrken bu kurucuyu kullanabilirsiniz:
Circle c; c = new Circle(45);

Uygulama oluturduunuzda, derleyici new (yeni) ilecinde belirlediiniz parametrelere dayanarak, hangi kurucunun arlacan bulur. Bu rnekte, int tr parametre geirdiniz, bu nedenle derleyici int parametre alan kurucuya bavuran bir kod retir. C# dilinin garipliinin farknda olmalsnz: bir snf iin kendi kurucunuzu yazarsanz, derleyici varsaylan kurucuyu oluturmaz. Bu nedenle, bir ya daha fazla parametre alan bir kurucu yazdysanz ve yine de bir varsaylan kurucu istiyorsanz, bunu kendiniz yazmak zorunda kalrsnz.

Ksmi Snflar
Bir snf, ok sayda yntem, alan ve kurucularn yan sra, sonraki blmlerde incelenecek olan dier eleri ierir. Yksek derecede ilevsel olan bir snf olduka geni olabilir. C# ile, kaynak kodu bir snf iin ayr ayr dosyalara ayrabilir, bylece geni bir snfn tanmn kk ve daha kolay ynetilebilir paralar halinde dzenleyebilirsiniz. Bu zellik, Microsoft Visual Studio 2008 tarafndan, program gelitiricinin dzenleyebilecei kaynak kodun form dzenlemesi deitiinde, Visual Studio tarafndan retilen koddan ayr bir dosyada sakland, Windows Presentation Foundation (WPF) uygulamalar iin kullanlr.

130

Ksm II

C# Dilini Anlamak

Bir snf birok dosyaya ayrdnzda, her bir dosyada partial anahtar szcn kullanarak snfn ksmlarn tanmlarsnz. rnein, Circle snf, circ1.cs (kurucular ieren) ve circ2.cs (yntemleri ve alanlar ieren) ad verilen iki dosyaya ayrlrsa, circ1.cs ierii aadaki gibi olur:
partial class Circle { public Circle() // varsaylan kurucu { radius = 0; } public Circle(int initialRadius) // ar yklenmi kurucu { radius = initialRadius; } }

circ2.cs ierii de u ekildedir:


partial class Circle { public double Area() { return Math.PI * radius * radius; } private int radius; }

Ayr ayr dosyalara ayrlm olan bir snf derlediinizde, derleyiciye tm dosyalar salamanz gerekir. Aadaki altrmada, iki boyutlu alanda nokta modelleyen bir snf bildireceksiniz. Snf, noktann x- ve y- koordinat deerlerini tutan iki private alan ierecek ve bu alanlara balang deeri vermek iin kurucular salayacak. new anahtar szcn kullanarak ve kurucular ararak snfn oluumlarn yaratacaksnz.

Kurucular yazn ve nesneler yaratn


1. Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 7\Classes klasrnde bulunan Classes projesini an. 3. Solution Explorerda, Program.cs dosyasn ift tklayarak, dosyay Code and Text Editor penceresinde grntleyin.

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

131

4. Program snfndaki Main (Ana) yntemini bulun. Main yntemi, bir try blounda bulunan ve bir catch ileyici tarafndan izlenen bir ar ile Entrance (Giri) yntemini arr. Bu try/catch blounun herhangi bir zel durumu yakalayacan ve ileyeceini bilerek, normalde Main iine yazlan kodu Entrance yntemi iine yazabilirsiniz. 5. Code and Text Editor penceresinde Point.cs dosyasn grntleyin. Bu dosya, Point (Nokta) adnda bir snf tanmlar. x- ve y-koordinat deerleri ile tanmlanan noktann konumunu gstermek iin bu snf kullanacaksnz. Point snf u anda botur. 6. Program.cs dosyasna dnn ve Program snfnn Entrance yntemini bulun. Entrance ynteminin gvdesindeki // to do yorum satr yerine aadaki kodu yazn:
Point origin = new Point();

7. Build mensnde Build Solution tklayn. Derleyici Point snf iin varsaylan kurucuyu yazdndan, kod sorunsuzca alr. Bununla birlikte, bu kurucu iin C# kodu gremezsiniz, nk derleyici herhangi bir kaynak dil ifadesi retmez. 8. Point.cs dosyasnda Point snfna dnn. // to do yorum satrn, x ve y adnda iki int bamsz deiken alan ve bu bamsz deikenlerin deerlerini konsolda grntlemek iin Console.WriteLine yntemini aran bir public kurucu ile deitirin. Point snf aadaki gibi grnmelidir:
class Point { public Point(int x, int y) { Console.WriteLine(x:{0}, y:{1}, x, y); } }

Not Console.WriteLine ynteminin yer tutucu olarak {0} ve {1} kullandn hatrlayn. Yukardaki ifadede, program altnda {0} yerine x deeri ve {1} yerine de y deeri gelecektir. 9. Build mensnde Build Solution tklayn. Derleyici u hatay verir:
Classes.Point does not contain a constructor that takes 0 arguments

132

Ksm II

C# Dilini Anlamak

Entranceda varsaylan kurucuya yaplan ar daha fazla almayacaktr, nk artk varsaylan kurucu yoktur. Point snf iin kendi kurucunuzu yazdnz, bu nedenle derleyici otomatik olarak bir kurucu oluturmamtr. imdi bu sorunu kendi varsaylan kurucunuzu yazarak zeceksiniz. 10. Point snfna, konsola default constructor called (varsaylan kurucu arld) yazmak iin Console.WriteLine yntemini aran bir public varsaylan kurucu ekleyin. Point snf imdi u ekilde grnmelidir:
class Point { public Point() { Console.WriteLine(default constructor called); } public Point(int x, int y) { Console.WriteLine(x:{0}, y:{1}, x, y); } }

11. Build mensnde Build Solution tklayn. Program imdi baarl olarak olumaldr. 12. Program.cs dosyasnda, Entrance ynteminin gvdesini, bottomRight (altSa) adnda Point trnde bir deiken bildiren ve iki bamsz deiken alan kurucu kullanarak, yeni Point nesnesine ilk atamay yapan bir ifade ierecek biimde deitirin. 1024 1280 znrlkteki bir ekrann sa alt kesinin koordinatlarn gsteren 1024 ve 1280 deerlerini uygulayn. Entrance yntemi imdi u ekilde grnmelidir:
static void Entrance() { Point origin = new Point(); Point bottomRight = new Point(1024, 1280); }

13. Debug mensnde Start Without Debuggingi tklayn. Konsolda aadaki iletiyi grntleyen program oluur ve alr:
default constructor called x:1024, y:1280

14. Program sonlandrmak ve Visual Studio 2008e dnmek iin Enter tuuna basn. imdi, noktann x- ve y-koordinatlarn gstermek iin Point snfna iki int alan ekleyecek ve bu alanlarn ilk atamalarn yapmak iin kurucular dzenleyeceksiniz.

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

133

15. Point.cs dosyasnda Point snfn dzenleyin ve x ve y adnda int trnde iki private rnek alan ekleyin. Point snf imdi u ekilde grnmelidir:
class Point { public Point() { Console.WriteLine(default constructor called); } public Point(int x, int y) { Console.WriteLine(x:{0}, y:{1}, x, y); } private int x, y; }

imdi, x ve y alanlarna balang deeri olarak x ve y parametrelerinin deerlerini atayan ikinci bir Point kurucu dzenleyeceksiniz. Bunu yaparken tuzak bir durum vardr. Dikkatli olmazsanz, kurucu u ekilde olacaktr:
public Point(int x, int y) // Dont type this! { x = x; y = y; }

Bu kod derlenecek olmakla birlikte, ifadeler belirsizdir. x = x; ifadesinde derleyici ilk xin alan ikincisinin parametre olduunu nasl bilecek? Alan ile ayn ada sahip yntem parametresi, alan yntemdeki tm ifadelerden gizler. Tm bu kurucularn gerekte yapt ey, kendilerine parametreler atamaktr; alanlar dzenlemek deil. Bu kesinlikle istediiniz ey deil. Bu problemin zm, hangi deikenlerin parametre olduunu ve hangilerinin alanlar olduunu belirlemek iin this anahtar szcn kullanmaktr. Bir deikene this n ekini eklemek, bu nesnedeki alan demek anlamna gelir. 16. Point kurucusunu, iki parametre alacak ve Console.WriteLine ifadesi yerine aadaki kod olacak ekilde deitirin:
public Point(int x, int y) { this.x = x; this.y = y; }

134

Ksm II

C# Dilini Anlamak

17. x ve y alanlarna balang deeri olarak -1 atamak iin Point kurucusunu aadaki gibi dzenleyin. Karkla neden olacak herhangi bir parametre olmasa da, alan bavurularn this ile belirtmek iyi bir uygulamadr:
public Point() { this.x = -1; this.y = -1; }

18. Build mensnde Build Solution tklayn. Kodun hatasz ve uyarsz derlendiinden emin olun. (Kodu altrabilirsiniz ancak henz bir sonu vermez.) Bir snfa ait olan ve bir snfn belirli bir rneine ait veri zerinde alan yntemler instance methods (rnek yntemler) olarak adlandrlr. (Bu blmde daha sonra greceiniz baka yntem trleri de vardr.) Aadaki altrmada, Point snf iin DistanceTo (Uzaklk) adnda iki nokta arasndaki uzakl hesaplayan bir rnek yntemi yazacaksnz.

rnek yntemlerini yazn ve arn


1. Visual Studio 2008de Classes projesinde, Point snfnda kurucular ve private deikenler arasna aada gsterilen DistanceTo adndaki public rnek yntemini ekleyin. Yntem, other adnda tek bir Point bamsz deikeni alr ve double deer dndrr. DistanceTo yntemi tam olarak aadaki gibi grnmelidir:
class Point { ... public double DistanceTo(Point other) { } ... }

Aadaki basamaklarda, DistanceTo rnek yntemi gvdesine ar yapmak iin kullanlan Point nesnesi ile parametre olarak geirilen Point nesnesi arasndaki uzakl hesaplayan ve sonucu dndren kodu ekleyeceksiniz. Bunun iin, x-koordinat ve y-koordinat arasndaki fark bulmanz gerekir. 2. DistanceTo ynteminde, xDiff adnda bir yerel int deikeni bildirin ve this.x ve other.x, arasndaki balang deeri olarak fark atayn. Aada koyu harflerle gsterilmitir:
public double DistanceTo(Point other) { int xDiff = this.x other.x; }

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

135

3. yDiff adnda baka bir int deikeni bildirin ve this.y ve other.y arasndaki fark balang deeri olarak atayn:
public double DistanceTo(Point other) { int xDiff = this.x other.x; int yDiff = this.y - other.y; }

Uzakl hesaplamak iin, Pitagor teoremini kullanabilirsiniz. xDiff ve yDiff deerlerinin karelerinin toplamnn karekkn bulun. System.Math snf, karekk hesaplamak iin kullanabileceiniz Sqrt yntemini salar. 4. DistanceTo ynteminin sonuna, aada gsterilen return ifadesini ekleyin:
public double DistanceTo(Point other) { int xDiff = this.x - other.x; int yDiff = this.y - other.y; return Math.Sqrt((xDiff * xDiff) + (yDiff * yDiff)); }

imdi DistanceTo yntemini test edeceksiniz. 5. Program snfnn Entrance yntemini bulun. origin ve bottomRight Point deikenlerinin bildirilip atamalarnn yapld ifadelerden hemen sonra distance adnda bir double deiken bildirin. Bu double deikene, origin nesnesi zerinde DistanceTo yntemini ardnzda ve bottomRight nesnesini bamsz deiken olarak geirdiinizde ulatnz sonucu atayn. Entrance yntemi imdi u ekilde grnmelidir:
static void Entrance() { Point origin = new Point(); Point bottomRight = new Point(1024, 1280); double distance = origin.DistanceTo(bottomRight); }

Not origin deikeninden sonra nokta karakteri yazdnzda, IntelliSense DistanceTo yntemini gstermelidir. 6. Entrance yntemine, Console.WriteLine yntemini kullanarak konsola distance deikeninin deerini yazan baka bir ifade ekleyin. Tamamlanm Entrance yntemi u ekilde grnmelidir:
static void Entrance() { Point origin = new Point(); Point bottomRight = new Point(1024, 1280);

136

Ksm II

C# Dilini Anlamak
double distance = origin.DistanceTo(bottomRight); Console.WriteLine(Distance is: {0}, distance);

7. Debug mensnde Start Without Debuggingi tklayn. 8. Konsol penceresine 1640.60537607311 deerinin yazldn dorulayn. 9. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn.

static Yntemleri ve Verileri Anlamak


nceki rnekte, Math snfnn Sqrt yntemini kullandnz; benzer ekilde Circle snfna bakarken Math snfnn PI alann okudunuz. Dndnzde, Sqrt yntemini armak ya da PI alann okumak yntemi biraz garipti. Math nesnesindeki deil, snfn kendisindeki ynteme bavurdunuz. Bu, bir nceki altrmada eklediiniz kodda origin.DistanceTo yerine Point.DistanceTo yazmaya almak gibidir. Neler meydana gelir ve nasl alr? Sk sk yntemlerin tmnn doal olarak bir snfn bir rneine ait olmadn greceksiniz. Bunlar, herhangi bir zel snf rneinden bamsz olan kullanl ilevler salayan yararl yntemlerdir. Sqrt yntemi sadece bir rnektir. Sqrt yntemi Math snfnn bir rnek yntemi olsayd, Sqrt yntemini armak iin bir Math nesnesi yaratmak zorunda olurdunuz:
Math m = new Math(); double d = m.Sqrt(42.24);

Bu ok hantal olurdu. Math nesnesinin karekk bulmakta hibir rol yoktur. Sqrt yntemi iin gerekli tm giri verileri parametre listesinde salanmtr ve yntemin dn deeri kullanlarak, sonu yntemi arana geirilir. Burada nesneler gerekten gerekli deildir, bu nedenle Sqrt yntemini nesne ynelimli yapya zorlamak iyi bir fikir deildir. Math snf Sqrt yntemi ve PI alan dnda, Sin, Cos, Tan ve Log gibi dier yararl matematiksel yntemler ierir. C#da, tm yntemler bir snf iinde bildirilmek zorundadr. Bununla birlikte, bir yntem ya da alan static olarak bildirirseniz, snfn adn kullanarak yntemi arabilir ya da alana eriebilirsiniz. Herhangi bir oluum gerekmez. Bu, gerek Math snfnn Sqrt yntemini bildiri eklidir:
class Math { public static double Sqrt(double d) { ... } ... }

Bir static (statik) yntem tanmladnzda, snf iin tanmlanm herhangi bir oluum alanna eriime sahip deildir. Sadece static olarak iaretlenmi alanlar kullanabilir. Bundan baka,

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

137

snf iinde static olarak iaretlenmi dier yntemlere dorudan bavurabilirsiniz, statik olmayan (rnek) yntemlerde ise ilk nce yntemi armak iin bir nesne yaratmanz gerekir.

Paylalan Bir Alan Yaratmak


Bir nceki blmde bahsedildii gibi, alan tanmlarken de static anahtar szcn kullanabilirsiniz. Bu zellik ile, tek bir snftan yaratlm olan tm nesneler tarafndan paylalan bir alan yaratabilirsiniz. (Statik olmayan alanlar her bir nesne oluumu iin yereldir.) Aadaki rnekte, Circle snfndaki NumCircles (DaireSays) adndaki static alan, her yeni Circle nesnesi yaratldnda Circle kurucu tarafndan 1 artrlr:
class Circle { public Circle() // varsaylan kurucu { radius = 0; NumCircles++; } public Circle(int initialRadius) // ar yklenmi kurucu { radius = initialRadius; NumCircles++; } ... private int radius; public static int NumCircles = 0; }

Tm Circle nesneleri ayn NumCircles alann paylar, bu nedenle NumCircles++; ifadesi, her yeni rnek yaratldnda ayn veriyi bir artrr. Circle nesnesi yerine Circle snfn belirterek NumCircles alanna eriirsiniz. rnein:
Console.WriteLine(Number of Circle objects: {0}, Circle.NumCircles);

pucu static yntemler ayn zamanda class yntemler olarak da adlandrlr. Bununla birlikte, static alanlar genellikle class alanlar olarak adlandrlmazlar; sadece static alanlar olarak adlandrlr. (ya da bazen static deikenler olarak adlandrlr).

const Anahtar Szcn Kullanarak bir static Alan Yaratmak


Bir alann static olduunu ve deerinin hibir zaman deimeyeceini bildiriminin nnde const anahtar szcn kullanarak belirtebilirsiniz. Bir const alan, bildiriminde static anahtar szcn kullanmaz ama yine de staticdir. Bununla birlikte, bu kitabn kapsam dndaki nedenlerden dolay, bir alan sadece, numaralandrma, int ya da double gibi saysal bir tr ya

138

Ksm II

C# Dilini Anlamak

da bir dize olduunda const olarak bildirebilirsiniz. (Numaralandrma ve Yaplarla Veri Trleri Yaratmak balkl Blm 9da numaralandrmay reneceksiniz.) rnein, aada gerek Math snfnn PIy nasl const alan olarak bildirdiini grebilirsiniz:
class Math { ... public const double PI = 3.14159265358979323846; }

static Snflar
C# dilinin bir baka zellii, bir snfn static olarak bildirilebilmesidir. Bir static snf sadece static yeler ierebilir (snf kullanarak yarattnz tm nesneler bu yelerin tek bir kopyasn paylar). Bir static snfn amac, yalnzca yararl yntemler ve alanlarn yer tutucusu olarak grev yapmaktr. Bir static snf, herhangi bir oluum verisi ya da yntemleri ieremez ve new ilecini kullanarak bir static snftan nesne yaratmaya almak anlamszdr. Aslnda, isteseniz de new ilecini kullanarak static snftan bir nesne oluumu yaratamazsnz. (Yaratmaya alrsanz derleyici hata verecektir.) Bir balang deeri atamanz gerekiyorsa, static snf varsaylan bir kurucuya sahip olabilir ancak kurucunun da static olarak bildirilmi olmas gerekir. Dier trde kurucular geerli deildir ve derleyici tarafndan geerli olmad bildirilir. Math snfnn sadece static yeleri ieren kendi srmnz tanmlayacaksanz, u ekilde grnebilir:
public static class Math { public static double Sin(double x) {...} public static double Cos(double x) {...} public static double Sqrt(double x) {...} ... }

Bununla birlikte, gerek Math snfnn bu ekilde tanmlanmadna dikkat edin. nk gerekten baz rnek yntemlerine sahiptir. Bu blmdeki son altrmada, Point snfna bir tane private static alan ekleyecek ve deerini 0 olarak atayacaksnz. Bu sayac her iki kurucu iinde de artracaksnz. Son olarak, bu private static yntemin deerini dndrmek iin bir public static yntem yazacaksnz. Bu alanla, ka tane Point nesnesi yaratldn bulabileceksiniz.

static yeler yazn ve static yntemler arn


1. Visual Studio 2008i kullanarak, Code and Text Editor penceresinde Point snfn grntleyin.

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

139

2. Point snfnn sonuna objectCount (nesneSayac) adnda int tr bir private static alan ekleyin. Aadaki gibi, bildirirken balang deerini olarak 0 atayn:
class Point { ...; private static int objectCount = 0; }

Not private ve static anahtar szcklerini istediiniz srada yazabilirsiniz. lk nce private, daha sonra static yazmak tercih edilen sradr. 3. objectCount alann artrmak iin her iki Point kurucusuna da aada gsterildii gibi bir ifade ekleyin. Her nesne yaratldnda kurucusu arlr. objectCount btn kurucularda (varsaylan kurucu da dahil) artrdnz srece, objectCount yaratlan btn nesnelerin saysn tutacaktr. Bu yalnzca objectCount paylalm bir static alan olduu iin alr. Bir oluum alan olsayd, her nesnenin bire ayarlanm kendi objectCount alan olacakt. Point snf aadaki gibi grnmelidir:
class Point { public Point() { this.x = -1; this.y = -1; objectCount++; } public Point(int x, int y) { this.x = x; this.y = y; objectCount++; } private int x, y; private static int objectCount = 0; }

Snfn geerli oluumuna ait olmadklarndan static alanlar ve yntemlerin nne this nekini ekleyemezsiniz. (Aslnda hibir oluuma ait deillerdir.) imdiki soru udur: Point snfnn kullanclar ka tane Point nesnesi yaratldn nasl bulacaklar? u anda, objectCount alan privatedr ve snf dndan eriilmez. Kt bir zm, objectCount alann her yerden eriilebilecek biime dntrmek olabilir. Bu,

140

Ksm II

C# Dilini Anlamak

snfn kapsllenmesini bozar; o zaman deerinin doru olduundan emin olamazsnz nk herkes onu azaltabilir ya da artrabilir. ok daha iyi bir fikir, objectCount alannn deerini dndren public static bir yntem oluturmaktr. imdi bunu yapacaksnz. 4. Point snfna, bir int dndren ve hibir parametre almayan ObjectCount adnda public static bir yntem ekleyin. Bu yntemi, objectCount alannn deerini dndrecek biimde oluturun. Point snf tam olarak aadaki gibi grnmelidir:
class Point { ... public static int ObjectCount() { return objectCount; } ... }

5. Code and Text Editor penceresinde Program snfn grntleyin ve Entrance yntemini bulun. 6. Entrance yntemine, Point snfnn ObjectCount ynteminden dnen deeri konsola yazmak iin bir ifade ekleyin. Entrance yntemi imdi aadaki gibi grnmelidir:
static void Entrance() { Point origin = new Point(); Point bottomRight = new Point(600, 800); double distance = origin.distanceTo(bottomRight); Console.WriteLine(Distance is: {0}, distance); Console.WriteLine(No of Point objects: {0}, Point.ObjectCount()); }

ObjectCount, (origin ya da bottomRight gibi) bir Point deikeni ile deil snfn ad olan Point kullanlarak arlr. ObjectCount arldnda iki Point nesnesi yaratldndan 2 deerini dndrmesi gerekir. 7. Debug mensnde Start Without Debuggingi tklayn. Konsola 2 deerinin yazldndan emin olun (distance deikeninin deerini grntleyen iletiden sonra) . 8. Program sonlandrmak ve Visual Studio 2008e dnmek iin Entera basn. Tebrikler. Baarl bir ekilde bir snf yarattnz ve snftaki alanlara balang deeri atamak iin kurucular kullandnz. rnek ve static yntemleri yarattnz ve her iki trdeki yntemleri ardnz. Ayrca, rnek ve static alanlarn da uyguladnz. public anahtar szcn

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

141

kullanarak alanlar ve yntemleri nasl eriilebilir yapacanz ve private anahtar szcn kullanarak bunlar nasl gizleyeceinizi grdnz.

Anonim Snflar
Anonim snf (anonymous class), ad olmayan bir snftr. Bu kulaa garip geliyor belki ama kitabn sonraki blmlerinde greceiniz baz durumlarda, zellikle de sorgu deyimleri kullandnzda gerekten olduka kullanldr. (Sorgu Deyimleri Kullanarak Bellek Verisinde Sorgulama Yapmak balkl Blm 20de sorgu deyimlerini reneceksiniz.) imdilik, sadece kullanl olduklarn bilin. new anahtar szcn kullanarak, snfn iinde olmasn istediiniz kme parantezi iinde tanmlanm alanlar ve deerlerle basite bir anonim snf yaratrsnz:
myAnonymousObject = new { Name = John, Age = 42 };

Bu snf, Name (Ad) adnda (Balang deeri olarak John atanmtr) ve Age (Ya) adnda (42 balang deeri atanmtr) iki public alan ierir. Derleyici, alana verdiiniz balang deeri trnden alanlarn trn ortaya karr. Bir anonim snf tanmladnzda, derleyici snf iin kendi adn retir fakat bunu siz bilmezsiniz. Bu nedenle anonim snflar ilgin bir muammaya neden olur: Snfn adn bilmiyorsanz, uygun trn bir nesnesini nasl yaratabilir ve snfn oluumunu nasl atayabilirsiniz? Daha nce gsterilen kod rneinde, myAnonymousObject (benimAnonimNesnem) deikeninin tr ne olmaldr? Yant siz bilmezsiniz; anonim snflarn nemi budur! Bununla birlikte, myAnonymousObject nesnesini var anahtar szcn kullanarak ak ekilde yazarak bildirebilirsiniz:
var myAnonymousObject = new { Name = John, Age = 42 };

var anahtar szcnn, derleyicinin balang deeri atamak iin kullanlan deyimdeki ile ayn trde deiken yaratmasna neden olduunu hatrlayn. Bu durumda, deyimin tr derleyicinin anonim snf iin rettii ad olur. Nesnedeki alanlara, aadaki gibi noktalama iaretleri kullanarak eriebilirsiniz:
Console.WriteLine(Name: {0} Age: {1}, myAnonymousObject.Name, myAnonymousObject.Age};

Farkl deerlerle ayn anonim snfnn dier rneklerini de yaratabilirsiniz:


var anotherAnonymousObject = new { Name = Diana, Age = 43 };

142

Ksm II

C# Dilini Anlamak

C# derleyicisi, iki anonim snf rneinin ayn trde olup olmadn bulmak iin adlar, trleri, saylar ve alanlarn srasn kullanr. Bu durumda, myAnonymousObject ve anotherAnonymousObject deikenleri ayn sayda, ayn adda ve ayn srada alanlara sahiptir, bu nedenle her iki deiken de ayn anonim snfn rnekleridir. Bu, aadaki gibi bir atama ifadesi uygulayabilirsiniz anlamna gelir:
anotherAnonymousObject = myAnonymousObject;

Not Bu atama ifadesi, beklediiniz eyi yapmayabilir. Deerler ve Bavurular Anlamak


balkl Blm 8de nesne deikenlerini atamak hakknda daha ok ey reneceksiniz.

Anonim snfn ieriinde olduka fazla kstlama vardr. Anonim snflar sadece public alanlar ierebilir, public alanlarn tmne balang deeri atanmak zorundadr, static olamazlar ve herhangi bir yntem belirleyemezsiniz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 7ye gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 7 Hzl Bavuru


Bunun in
Bir snf bildirmek

unu Yapn
class anahtar szcn yazn, ardndan snfn adn, sonra da alan ve kapanan parantezleri ekleyin. Snfn yntemleri ve alanlar bu parantezler iinde bildirilir. rnein:
class Point { ... }

Blm 7

Snflar ve Nesneleri Yaratmak ve Ynetmek

143

Bir kurucu bildirmek

Ad snfn ad ile ayn olan ve bir dn tr (void bile) olmayan bir yntem yazn. rnein:
class Point { public Point(int x, int y) { ... } }

Bir kurucu armak

new anahtar szcn kullann ve uygun parametrelerle kurucuyu belirtin. rnein:


Point origin = new Point(0, 0);

Bir static yntem bildirmek

Yntemin bildiriminden nce static anahtar szcn yazn. rnein:


class Point { public static int ObjectCount() { ... } }

Bir static yntemi armak Bir static alan bildirmek

Snfn adn yazn, ardndan bir nokta koyup yntemin adn yazn. rnein:
int pointsCreatedSoFar = Point.ObjectCount();

Alann bildiriminden nce static anahtar szcn yazn.rnein:


class Point { ... private static int objectCount; }

Bir const alan bildirmek

Alann bildiriminden nce const anahtar szcn yazn, static anahtar szcn yoksayn. rnein:
class Math { ... public const double PI = ...; }

Bir static alana erimek

Snfn adn yazn, ardndan bir nokta koyup static alann adn yazn. rnein:
double area = Math.PI * radius * radius;

Blm 8

Deerleri ve Bavurular Anlamak


Bu blm tamamladktan sonra renecekleriniz:
n n

Deer tr ve bavuru tr arasndaki farklar aklamak. Yntem parametrelerinin bamsz deikenlerine eriebilmek iin ref ve out anahtar szcklerini kullanmak. object trnde bir deiken atayarak deere kutulama uygulamak. Kutulanm deere bavuran nesne bavurusunu kaldrarak deerin kutulamasn kaldrmak.

n n

Snflar ve Nesneleri Yaratmak ve Ynetmek balkl Blm 7de, kendi snfnz bildirmeyi ve bir snf kurucusunu new anahtar szcyle ararak snfnzn rneklerini yaratmay (yani nesne yaratmay) rendiniz. Ayrca, bir kurucu kullanarak nesneye nasl balang deeri atayacanz grdnz. Bu blmde, int, double ve char gibi temel trlerin karakteristik zelliklerinin snf trlerinden farkn reneceksiniz.

Veri Tr Deikenleri ve Snflar Kopyalamak


Genel olarak, int, float, double ve char gibi trler deer trleri olarak adlandrlr. Bir deikeni deer tr olarak bildirdiinizde, derleyici uygun deeri tutmas iin yeterli bellek alan ayran kodu retir. rnein, int deikeninin bildirilmesi, derleyici tarafndan 4 bayt (32 bit) bellek alan ayrlmasna neden olur. int deikenine bir deer atanmas (rnein, 42), deerin bu bellek blouna kopyalanmasna neden olur. Blm 7de tanmlanm olan Circle gibi snf trleri farkl olarak ilenir. Bir Circle deikeni bildirdiinizde, derleyici Circle deerini tutmak iin gerekli bellek alann ayrmaz, sadece Circle deerini ieren baka bir bellek blounun adresini (enin bellekteki konumunu belirten adres) ya da bloa bavuru adresini tutabilecek kadar kk bir para bellek paras ayrr. Gerek Circle nesnesi iin sadece new anahtar szc kullanlarak yaratldnda adres ayrlr. Snf, bir bavuru tr rneidir. Bavuru trleri, bellek bloklarna bavurular tutar. Not Bavuru tr olan string dnda, C# dilinin birok temel tr deer trdr. Bu blmdeki snflar gibi bavuru trleri tanmlar, string trne sorunsuzca uygulanr. Aslnda, C#daki string anahtar szc sadece System.String snf iin bir takma addr.

145

146

Ksm II

C# Dilini Anlamak

Deer trleri ve bavuru trleri arasndaki fark tam olarak anlamanz gerekir. i adnda int tr deiken tanmladnz ve 42 deeri atadnz zamanki durumu dnn. copyi adnda bir baka int deikeni bildirirseniz, i deikeni ile ayn deeri (42) tutacaktr. Bununla birlikte, copyi ve i ayn deeri tayor olsa da, yine de 42 deerini ieren iki bellek blou vardr: biri i deikeni iin, dieri copyi deikeni iin. i deerini deitirirseniz, copyi deeri deimez. Buna kod iinde bakalm:
int i = 42; // iyi bildirin ve balatn int copyi = i; // ideki verinin kopyasn ierir i++; // iyi artrmann copyi zerinde etkisi olmaz

c deikenini Circle (snf ad) olarak bildirmek olduka farkldr. c deikenini Circle olarak bildirdiinizde, c deikeni Circle nesnesine bavurabilir. refc adnda baka bir Circle bildirirseniz, bu deiken de Circle nesnesine bavurabilir. c deikenini refcye atarsanz, refc deikeni c deikeni ile ayn Circle nesnesine bavuracaktr. Sadece bir Circle nesnesi vardr, refc ve c deikeninin her ikisi de ona bavurur. Peki derleyici, biri c deikeni iin dieri de refc deikeni iin olmak zere iki bellek blou ayrrsa, fakat her bloktaki adres gerek Circle nesnesini saklayan ayn bellek konumunu iaret ederse ne olur? Buna kod iinde bakalm:
Circle c = new Circle(42); Circle refc = c;

Aadaki grafik her iki rnei de gsterir. Circle nesnesindeki @ iareti bellekteki adrese bavuruyu gsterir:

Burada aklanan fark olduka nemlidir. zellikle, yntem parametrelerinin davrannn deer tr ya da bavuru tr olup olmamalarna bal olmas anlamna gelir. Aadaki altrmada bu fark inceleyeceksiniz.

Blm 8

Deerleri ve Bavurular Anlamak

147

Not Sadece bavuruyu kopyalamak yerine, c deikeninin ieriini refc deikenine gerekten kopyalamak isterseniz, refcnin Circle snfnn yeni bir oluumuna bavurmasn salamanz ve daha sonra da aadaki gibi veriyi alan alan cden refcye kopyalamanz gerekir:
Circle refc = new Circle(); refc.radius = c.radius; // Bunu denemeyin

Bununla birlikte, Circle snfnn herhangi bir yesi private ise (radius alan gibi), bu veriyi kopyalayamazsnz. Bunun yerine, private alanlar zellikler olarak duyurarak, private alanlardaki veriyi eriilebilir yapmalsnz. Bunu nasl yapacanz, Alanlara Erimek iin zellikleri Uygulamak balkl Blm 15te reneceksiniz.

Deer parametreleri ve bavuru parametrelerini kullann


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 8\ Parameters klasrndekiParameters projesini an. Proje, Pass.cs, Program.cs ve WrappedInt.cs olarak adlandrlm C# kod dosyas ierir. 3. Code and Text Editor penceresinde Pass.cs dosyasn grntleyin. Aadaki kod rneinde koyu harflerle gsterildii gibi, // to do yorum satrn kaldrn ve Pass snfna Value adnda bir public static yntem ekleyin. Bu yntem param adnda tek bir int parametre (bir deer tr) almal ve dn tr void olmaldr. Value ynteminin gvdesi, param deikenine 42 deeri atamaldr.
namespace Parameters { class Pass { public static void Value(int param) { param = 42; } } }

4. Code and Text Editor penceresinde Program.cs dosyasn grntleyin ve daha sonra Program snfnn Entrance yntemini bulun. Program almaya baladnda Main yntemi tarafndan Entrance yntemi arlr. Blm 7de akland gibi, yntem ars bir try blou iine alnmtr ve arkasndan da bir catch ileyici gelir. 5. Aadaki grevleri yapmak iin Entrance yntemine drt ifade ekleyin:
n n n n

i adnda yerel int deikeni bildirmek ve balang deerini 0a atamak. Console.Writeline yntemini kullanarak i deikeninin deerini konsola yazmak. i deikenini bamsz deiken olarak alan Pass.Value yntemini armak. i deikeninin deerini tekrar konsola yazmak.

148

Ksm II

C# Dilini Anlamak

Pass.Value yntemine ardan nce ve sonra Console.WriteLine yntemine ar ile, Pass.Value ynteminin arlmasnn gerekten i deikeni deerini deitirip deitirmediini grebilirsiniz. Tamamlanm Entrance yntemi u ekilde grnmelidir:
static void Entrance() { int i = 0; Console.WriteLine(i); Pass.Value(i); Console.WriteLine(i); }

6. Program oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 7. Konsola iki defa 0 yazldndan emin olun. Parametreleri gncelleyen Pass.Value yntemi iindeki atama ifadesi, geirilen bamsz deikenin kopyasn kullanr ve orijinal bamsz deiken hibir ekilde etkilenmez. 8. Uygulamay kapatmak iin Enter tuuna basn. imdi snf iine alnm int parametresi geirdiinizde neler olduunu greceksiniz. 9. Code and Text Editor penceresinde WrappedInt.cs dosyasn grntleyin. WrappedInt snfna Number adnda ve int trnde bir public oluum alan ekleyin:
namespace Parameters { class WrappedInt { public int Number; } }

10. Code and Text Editor penceresinde Pass.cs dosyasn grntleyin. Pass snfna Reference adnda bir public static yntem ekleyin. Bu yntem param adnda tek bir WrappedInt parametresi almal ve dn tr void olmaldr. Reference ynteminin gvdesi, param deikenine 42 deerini atamaldr:
public static void Reference(WrappedInt param) { param.Number = 42; }

11. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. Aadaki grevleri gerekletirmek iin Entrance yntemine drt ifade daha ekleyin:
n

wi adnda yerel bir WrappedInt deikeni bildirin ve balang deerine varsaylan kurucuyu ararak yeni bir WrappedInt nesnesi atayn. Konsola wi.Number deerini yazn. Pass.Reference yntemini arn, bamsz deiken olarak wi geirin.

n n

Blm 8
n

Deerleri ve Bavurular Anlamak

149

Konsola tekrar wi.Number deerini yazn.

Daha nceki gibi, Console.WriteLine yntemini ararak, Pass.Reference ynteminin arlmasnn wi.Number deerini deitirip deitirmediini grebilirsiniz. imdi Entrance yntemi tam olarak u ekilde grnmelidir (yeni ifadeler koyu harflerle gsterilmitir.):
static void Entrance() { int i = 0; Console.WriteLine(i); Pass.Value(i); Console.WriteLine(i); WrappedInt wi = new WrappedInt(); Console.WriteLine(wi.Number); Pass.Reference(wi); Console.WriteLine(wi.Number); }

12. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Daha nceki gibi, Pass.Value yntemi arlmadan nce ve sonra, konsol penceresine yazlan ilk iki deer 0 ve 0dr. Bununla birlikte, sonraki iki deer, Pass.Reference yntemi arlmadan nce ve sonraki wi.Number deerine uyar. Konsol penceresine 0 ve 42 deerlerinin yazldn grmelisiniz. 13. Uygulamay kapatmak ve Visual Studio 2008e geri dnmek iin Entera basn. nceki altrmada, wi.Numbern balang deeri derleyicinin rettii varsaylan kurucu tarafndan 0 olarak atanmt. wi deikeni, yeni yaratlm olan, int deer ieren WrappedInt nesnesine bir bavuru ierir. wi deikeni daha sonra Pass.Reference yntemine bamsz deiken olarak kopyalanr. WrappedInt bir snf (bavuru tr) olduundan, wi ve param deikenlerinin her ikisi de ayn WrappedInt nesnesine sahiptir. Nesne ieriine Pass.Reference yntemindeki param deikeni zerinden yaplan deiiklikler, yntem tamamlandnda wi deikeni tarafndan izlenebilir. Aadaki ekil, WrappedInt nesnesi Pass.Reference yntemine bamsz deiken olarak geirildiinde neler olduunu gsterir:

150

Ksm II

C# Dilini Anlamak

Null Deerleri ve Null Trlerini Anlamak


Bir deiken bildirdiinizde, her zaman balang deeri atamak iyi bir fikirdir. Kod genelde aadaki gibi grnr:
int i = 0; double d = 0.0;

Snf gibi bir bavuru deikenine balang deeri atamak iin, snfn yeni bir oluumunu yaratabileceinizi ve yeni nesneye bavuru deikeni atayabileceinizi hatrlayn:
Circle c = new Circle(42);

Bu ok iyidir fakat ya gerekten yeni bir nesne yaratmak istemezseniz? Belki deikenin amac, var olan bir nesneye bir bavuru salamaktr. Aadaki kod rneinde, Circle tr copy (kopya) deikenine balang deeri atanr fakat daha sonra Circle snfnn baka bir oluumuna bavuru atanr:
Circle c = new Circle(42); Circle copy = new Circle(99); ... copy = c; // Copyyi balatmak iin rastgele deer // copy ve c ayn nesneye bavurur

c deerini copy deikenine atadktan sonra, copy deikenine balang deeri atamak iin kullandnz 99 radius deerindeki orijinal Circle nesnesine ne olur? Artk ona bavuran yoktur. Bu durumda, alma zaman p toplama olarak bilinen ilemi gerekletirerek bellei geri kazanabilir. p Toplama ve Kaynak Ynetimini Kullanmak balkl Blm 14te p toplamay ayrntl olarak reneceksiniz. imdilik, p toplamann pahal bir ilem olduunu bilmeniz nemlidir. Bir deiken, programda bir noktada baka bir nesneye bavuru olarak atanacaksa, baka bir yerde deikene balang deeri de atanabilir. Fakat bu iyi bir programlama uygulamas deildir ve kodunuzda problemlere neden olabilir. rnein, deiken bir bavuruya sahip deilse, bir nesneye bavurmasn isteyeceiniz bir durumla mutlaka karlaacaksnz:
Circle c = new Circle(42); Circle copy; // Balatlmam !!! ... if (copy == // what goes here?) copy = c; // copy ve c ayn nesneye bavurur

Buradaki if ifadesinin amac, copy deikenine balang deeri atanp atanmadn grmektir fakat bu deikenle hangi deeri karlatrmalsnz? Bu sorunun cevab null ad verilen zel bir deerdir.

Blm 8

Deerleri ve Bavurular Anlamak

151

C#da, herhangi bir bavuru deikenine null deer atayabilirsiniz. null deeri, deikenin bellekte hibir nesneye bavurmad anlamna gelir. u ekilde kullanabilirsiniz:
Circle c = new Circle(42); Circle copy = null; ... if (copy == null) copy = c; // Balatlm

// copy ve c ayn nesneye bavurur

Bo Olabilen Trleri Kullanmak


null deeri, bavuru trlerine balang deeri vermek iin kullanldr fakat null deerinin kendisi bir bavurudur ve bir deer trne atayamazsnz. Bu nedenle aadaki ifade, C#da geerli bir ifade deildir:
int i = null; // geerli deil

Bununla birlikte, C# bir deikeni bo olabilen (nullable) deer tr olarak bildirmek iin kullanabileceiniz bir deitirici tanmlar. Bo olabilen deer tr, orijinal deer tr ile benzer ekilde davranr fakat null deeri atayabilirsiniz. Aadaki gibi, deer trnn bo olabileceini gstermek iin soru iareti (?) kullanrsnz:
int? i = null; // geerli

Bavuru trn test ettiiniz yntemle bo olabilen deikenin null deer ierip iermediini bulabilirsiniz:
if (i == null) ...

Uygun veri tr ifadesini dorudan bo olabilen deikene atayabilirsiniz. Aadaki rnekler geerli ifadelerdir:
int? i = null; int j = 99; i = 100; // Deer tr sabitini bo olabilen tre kopyalar i = j; // Deer tr deikenini bo olabilen tre kopyalar

Bunun tersinin geerli olmadna dikkat etmelisiniz. Bo olabilen bir deeri, sradan deer tr deikenine atayamazsnz. Bu nedenle, bir nceki rnekteki i ve j deikenlerine gre aadaki ifade geerli deildir:
j = i; // Geerli deil

Ayn zamanda bu, sradan deer tr bekleyen ynteme parametre olarak bo olabilen deiken kullanamayacanz anlamna gelir. nceki altrmadaki sradan int parametresi alan Pass.Value yntemini yeniden arrsanz, aadaki ifade derlenmeyecektir:
int? i = 99; Pass.Value(i); // Derleme hatas

152

Ksm II

C# Dilini Anlamak

Bo Olabilen Trlerin zelliklerini Anlamak


Bo olabilen trler, Blm 6da grdnz zelliklere sahiptir. HasValue (DeereSahipOl) zellii bo olabilen bir trn bir deere mi sahip olduunu yoksa null mu olduunu gsterir. Aadaki gibi, Value (Deer) zelliini okuyarak bir deer ieren bo olabilen trn deerini elde edebilirsiniz:
int? i = null; ... if (!i.HasValue) i = 99; else Console.WriteLine(i.Value);

Blm 4ten NOT ilecinin (!) bir Boolean deer kabul etmediini hatrlayn. Bu kod paras, bo olabilen i deikenini test eder ve bir deere sahip deilse (null-bo ise), 99 deeri atar; aksi takdirde, deikenin deerini grntler. Bu rnekte, HasValue zellii bir null deeri test etmek asndan bir yarar salamaz. Ek olarak, Value zelliini okumak, deikenin ieriini okumann uzun bir yoludur. Bununla birlikte, bu grnen eksiklikler int? deikeninin basit bo olabilen tr olmasndan kaynaklanr. Daha karmak deer trleri yaratabilir ve HasValue ve Value zelliklerinin avantajlarn kullanmak gerektiinde bo olabilen deikenler bildirmek iin bu deer trlerini kullanabilirsiniz. Numaralandrma ve Yaplarla Deer Trleri Yaratmak balkl Blm 9da baz rnekler greceksiniz. Not Bo olabilen bir trn Value zellii salt okunurdur. Bir deikenin deerini okumak iin bu zellii kullanabilirsiniz. Fakat deiken deerinde deiiklik yapamazsnz. Bo olabilen deikeni gncellemek iin sradan atama ifadesini kullann.

ref ve out Parametrelerini Kullanmak


Her zaman olduu gibi, bir ynteme bir bamsz deiken geirdiinizde, parametrenin bamsz deikenin kopyas olarak atandn grdnz. Parametre, deer tr (int gibi), bo olabilen tr (int? gibi) ya da bavuru tr (WrappedInt gibi) olsa da bu dorudur. Bu dzenleme, parametredeki herhangi bir deiikliin, geirilen bamsz deikenin deerini etkilemeyecei anlamna gelir. rnein, aadaki kodda, konsola yazlan sonu 43 deil 42dir. DoWork yntemi, orijinal bamsz deikenin (arg) deil bamsz deikenin kopyas olan copy deikeninin deerini artrr:
static void DoWork(int param) { param++; }

Blm 8
static void Main() { int arg = 42; DoWork(arg); Console.WriteLine(arg); // writes 42, not 43 }

Deerleri ve Bavurular Anlamak

153

Bir nceki altrmada, bir yntemin parametresi bavuru tr ise, o parametre kullanlarak yaplan herhangi bir deiikliin, ynteme geen bamsz deikenin bavurduu veriyi deitirdiini grdnz. Buradaki nemli nokta, bavurulan veri deise bile, parametrenin kendisinin deimemesidir (hala ayn nesneye bavurur). Dier bir deyile, bamsz deikenin bavurduu nesneyi parametre zerinden deitirmek mmkndr, bamsz deikenin kendisini deitirmek mmkn deildir (rnein, tmyle farkl bir nesneye bavuracak ekilde ayarlamak). ou zaman, bu garanti olduka yararldr ve programdaki hatalar azaltmanza yardmc olabilir. Bununla birlikte, bazen bir bamsz deikeni deitirmek iin gerekten yntem yazmanz gerekebilir. Bunu yapmanz iin C#, ref ve out anahtar szcklerini salar.

ref Parametreleri Yaratmak


Bir parametrenin adnn nne ref yazarsanz, parametre, bamsz deikenin kopyas olmak yerine onun dier ad olur. Bu, parametreye ne yaparsanz ayn eyi otomatik olarak bamsz deikene de yapm olacanz anlamna gelir; nk parametre bamsz deikenin dier addr. Bir bamsz deikeni bir ref parametresine geirdiinizde, bamsz deikenin nne de ref yazmalsnz. Bu szdizimi, bamsz deikenin deiebileceine dair grsel bir ipucu verir. Aada, nceki rnein ref anahtar szc kullanlarak yazlm biimini grebilirsiniz:
static void DoWork(ref int param) // ref kullanr { param++; } static void Main() { int arg = 42; DoWork(ref arg); Console.WriteLine(arg); }

// ref kullanr // 43 yazar

Bu defa, DoWork yntemine orijinal bamsz deikenin kopyas yerine orijinal deikene bir bavuru geirirsiniz. Bylece yntemin bu bavuruyu kullanarak yapt her deiiklik orijinal bamsz deikeni de deitirir. Bu nedenle konsolda 43 grnmektedir. Standart kesin atama kural (kullanmadan nce bir deikene bir deer atamalsnz), ref bamsz deikenleri iin de geerlidir. rnein, aadaki rnekte, arg deikenine

154

Ksm II

C# Dilini Anlamak

balang deeri verilmediinden kod derlenmeyecektir. Bunun nedeni, DoWork iindeki param++ gerekte arg++dr ve arg++ yalnzca arg tanmlanm deere sahip olduunda kullanlabilir:
static void DoWork(ref int param) { param++; } static void Main() { int arg; // balatlmam DoWork(ref arg); Console.WriteLine(arg); }

out Parametreleri Yaratmak


Derleyici, yntemi armadan nce bir ref parametresine deer atanp atanmadn kontrol eder. Bununla birlikte, yntemin parametreye balang deeri atamasn istediiniz zamanlar olabilir. Bunu out anahtar szc ile yapabilirsiniz. out anahtar szc, ref anahtar szcne benzer. Bir parametrenin nne out anahtar szcn ekleyebilirsiniz, bylece parametre, bamsz deikenin dier ad olur. ref anahtar szcn kullandnzda olduu gibi, parametreye yaptnz herhangi bir deiiklik, orijinal bamsz deikene de yaplr. Bir out parametresine bir bamsz deiken geirdiinizde, ayn zamanda bamsz deikenin nne de out anahtar szcn yazmak zorundasnz. out anahtar szc output (kt) kelimesinin ksaltmasdr. Bir ynteme out parametresi geirdiinizde, yntem bu parametreye bir deer atamak zorundadr. Aadaki rnek derlenmeyecektir, nk DoWork yntemi param deikenine bir deer atamaz:
static void DoWork(out int param) { // Bir ey olmaz }

Fakat aadaki rnek derlenir, nk DoWork yntemi param deikenine bir deer atar.
static void DoWork(out int param) { param = 42; }

out parametresine yntem tarafndan bir deer atanmas gerektiinden, bamsz deikenine balang deeri atanmadan yntemi armanza izin verilir. rnein, daha sonra konsolda grntlenen arg deikenine balang deeri atamak iin DoWork yntemini arr:
static void DoWork(out int param) { param = 42;

Blm 8
} static void Main() { int arg; // balatlmam DoWork(out arg); Console.WriteLine(arg); // 42 yazar }

Deerleri ve Bavurular Anlamak

155

Bir sonraki altrmada ref parametrelerini inceleyeceksiniz.

ref parametrelerini kullann


1. Visual Studio 2008de Parameters projesini an. 2. Code and Text Editor penceresinde Pass.cs dosyasn grntleyin. 3. Value yntemini, int parametresi bir ref parametresini kabul edecek biimde dzenleyin. Value yntemi aadaki gibi grnmelidir:
class Pass { public static void Value(ref int param) { param = 42; } ... }

4. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 5. Entrance ynteminin nc ifadesini, Pass.Value yntem ars bamsz deikenini ref olarak geirecek biimde dzenleyin. Entrance yntemi imdi u ekilde grnmelidir:
class Application { static void Entrance() { int i = 0; Console.WriteLine(i); Pass.Value(ref i); Console.WriteLine(i); ... } }

6. Program oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Bu kez, konsol penceresine yazlan ilk iki deer 0 ve 42dir. Bu Pass.Value yntemine yaplan arnn i bamsz deikenini deitirdiini gsterir. 7. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn.

156

Ksm II

C# Dilini Anlamak

Not ref ve out deitiricilerini deer trlerinde olduu gibi bavuru trlerinde de kullanabilirsiniz. kisinde de ayn etkiyi gsterir. Parametre, bamsz deikenin dier adna dnr. Parametreyi yeni oluturulmu bir nesneye yeniden atarsanz, bamsz deikeni de yeni oluturulmu nesneye atam olursunuz.

Bilgisayar Bellei Nasl Dzenlenir?


Bilgisayarlar, uygulanan programlar ve bu programlarn kulland veriyi tutar. Deer ve bavuru trleri arasndaki farklar anlamak iin, bellekte verinin nasl dzenlendiini anlamak yararl olacaktr. letim sistemleri ve alma zamanlar sk sk veriyi tutmak iin kullanlan bellei her biri ayr olarak ynetilen iki byk paraya ayrr. Bellein iki byk parasna yn (stack) ve bek (heap) ad verilir. Yn ve bek ok farkl amalara hizmet eder:
n

Bir yntemi ardnzda, o yntemin parametreleri ve yerel deikenleri iin gerekli bellek her zaman yndan alnr. Yntem bittiinde (deerini dndrdnde ya da bir zel durum oluturduunda), parametreler ve yerel deikenler iin alnan bellek otomatik olarak yna geri verilir. new anahtar szcn kullanarak bir nesne (snfn oluumu) yarattnzda, nesneyi oluturmak iin gerekli bellek her zaman bekten alnr. Bavuru deikenlerini kullanarak birka yerden ayn nesneye bavurulduunu grdnz. Bir nesneye son bavuru yok olduunda, nesne tarafndan kullanlan bellek, yeniden kullanma uygun hale gelir (hemen yeniden kullanlabilir). Blm 14te bek belleinin nasl yeniden kullanld ayrntl olarak incelenmitir.

Not Tm deer trleri yn zerinde yaratlr. Tm bavuru trleri (nesneler) ise bek zerinde yaratlr (bavurunun kendisi de yn zerinde olduu halde). Bo olabilen trler aslnda bavuru trleridir ve bek zerinde yaratlrlar. Yn ve bek adlar, alma zamannn bellei ynetme biiminden gelir:
n

Yn bellei, st ste ylan kutular gibi dzenlenir. Bir yntem arldnda, her parametre ynn en stnde bulunan kutuya yerletirilir. Her yerel deiken, bir kutu atamak gibidir ve yn zerindeki kutularn en stne yerletirilirler. Bir yntem bittiinde, yntemin tm kutular yndan kaldrlr.

Blm 8
n

Deerleri ve Bavurular Anlamak

157

bek bellei, st ste ylm kutulardan ok bir odaya salm kutulara benzer. Her kutunun zerinde kullanmda olup olmadn gsteren bir etiket vardr. Yeni bir nesne yaratldnda, alma zaman bo kutu arar ve bulduu bo kutuyu nesneye tahsis eder. Nesneye bavuru yn zerindeki bir yerel deikende saklanr. alma zaman her kutuya bavuru numarasn izler (iki deikenin ayn nesneye bavurabileceini hatrlayn). Son bavuru yok olduunda, alma zaman kutuyu kullanmda deil olarak iaretler ve daha sonraki bir zamanda kutuyu bo olarak iaretleyerek yeniden kullanma hazr hale getirir.

Yn ve bek Kullanmak
imdi, aadaki Method yntemi arldnda ne olduunu inceleyelim:
void Method(int param) { Circle c; c = new Circle(param); ... }

param deikenine geirilecek deerin 42 olduunu varsayn. Yntem arldnda, yndan kk bir para (bir int iin yetecek kadar) bellek ayrlr ve 42 balang deeri atanr. Yntemin iine girilince, bavuruyu tutmak iin yetecek kadar baka bir bellek blou (bellek adresi) ayrlr fakat balang deeri atanmaz (Circle deikeni c iin). Daha sonra, bekten bir Circle nesnesi iin yetecek kadar baka bir para bellek ayrlr. Bu, new anahtar szcnn yapt itir. Circle kurucusu, bu ham bek bellei bir Circle nesnesine dntrmek iin alr. Bu Circle nesnesine bavuru, c deikeninde saklanr. Aadaki ekil bu durumu gstermektedir:

Bu noktada, iki eye dikkat etmelisiniz:


n

Nesne, bek zerinde depolanyor olmakla birlikte, nesneye bavuru (c deikeni), yn zerinde depolanr. bek bellei sonsuz deildir. bek bellei tkenirse, new ileci OutOfMemoryException zel durumu oluturur ve nesne yaratlmaz.

158

Ksm II

C# Dilini Anlamak

Not Circle kurucusu da bir zel durum oluturabilir. Oluturursa, Circle nesnesi iin ayrlm bellek yeniden kullanlabilir hale getirilir ve kurucudan dnen deer null olur . Yntem sona erdiinde, parametreler ve yerel deikenler kapsam dna kar. c iin ve param iin ayrlm olan bellek otomatik olarak yna geri verilir. alma zaman, Circle nesnesine artk bavurulmayacan dikkate alr ve gelecek bir zamanda bek tarafndan ayrlan bellein serbest braklmas iin bir dzenleme yapar (Blm 14te bakn).

System.Object Snf
Microsoft .NET Frameworkdeki en nemli bavuru trlerinden biri, System ad alanndaki Object snfdr. System.Object snfnn nemini tam olarak anlamak iin, Kaltm ile almak balkl Blm 12de tanmlanan kaltm kavramn anlamanz gerekir. imdilik, tm snflar System.Object snfnn zel bir tr olarak ve herhangi bir bavuru trne bavurabileceiniz bir deiken yaratmak iin System.Object snfn kullanabileceinizi kabul edin. System.Object nemli bir snftr. C#, System.Object snfnn takma ad olarak object anahtar szcn salar. Kodunuzda, object anahtar szcn kullanabilir ya da System.Object yazabilirsiniz, ikisi de ayn eydir. pucu System.Object yerine object anahtar szcn kullanmay tercih edin. Daha kestirmedir

ve snflar iin eanlaml dier anahtar szcklerle (System.String snf iin string ya da Blm 9da greceiniz dier anahtar szckler gibi) kullanmak iin tutarldr.

Aadaki rnekte, c ve o deikeninin her ikisi de ayn Circle nesnesine bavurur. c deikeninin trnn Circle olmas ve o deikeninin trnn object (System.Object iin takma ad) olmas aslnda ayn enin bellekteki iki farkl grnn salar:
Circle c; c = new Circle(42); object o; o = c;

Blm 8

Deerleri ve Bavurular Anlamak

159

Kutulamak
Az nce de grdnz gibi, object trndeki deikenler her bavuru trndeki her nesneye bavurabilir. Ancak, object trndeki deikenler bir deer trne de bavurabilirler. rnein, aadaki iki ifade, i deikenine 42 balang deerini atar ve daha sonra o deikenine (object trnn, bavuru tr) balang deeri olarak i atar:
int i = 42; object o = i;

kinci ifadede tam olarak neler olduunu anlamak iin biraz aklama gerekir. i deikeninin deer trnde olduunu ve ynda bulunduunu hatrlayn. o deikeni iindeki bavuru, dorudan i deikenine bavuruyorsa, bavuru yna olacaktr. Bununla birlikte, tm bavurular bek zerindeki nesnelere bavurmaldr; yn zerindeki elere bavurular yaratmak, programn salamlln ok ciddi biimde tehlikeye atacandan ve bir gvenlik a yaratacandan, buna izin verilmez. Bu nedenle, i iindeki deerin bir kopyas bek zerinde oluturulur ve o iindeki bavuru bu kopyaya olur. enin yndan bee otomatik kopyalanmasna kutulama (boxing) ad verilir. Aadaki ekil sonucu gsterir:

nemli Bir deikenin orijinal deerini deitirirseniz, bek zerindeki deer deimez. Benzer ekilde, bek zerindeki deeri deitirirseniz, deikenin orijinal deeri deimez.

Kutulamay Kaldrmak
object trndeki bir deiken bir deerin kutulanm kopyasna bavurabildii iin, bu deere yalnzca deiken iinden ulamanz salamak uygundur. o deikeninin aadaki ifadeyi kullanarak bavurduu kutulanm int deerine erimeyi bekliyor olabilirsiniz:
int i = o;

160

Ksm II

C# Dilini Anlamak

Bununla birlikte, bu szdizimini denerseniz, derleme zaman hatas alrsnz. Bu konuda dnrseniz, int i = o; szdizimini kullanmanz gerekten mantkldr. Sonuta, o deikeni sadece int trne deil herhangi bir eye bavurabilir. Aadaki kodda neler olacan dnn:
Circle c = new Circle(); int i = 42; object o; o = c; i = o; // o circlea bavurur // ide ne tutulur?

Kutulanm kopyann deerini elde etmek iin, cast olarak bilinen ve bir tr dierine dntren ilemi kullanrsnz. object deikeninin nne parantez iinde trn adn yazarsnz. rnein:
int i = 42; object o = i; i = (int)o; // kutulama // derlenir

Bu dntrme ilemi g anlalr bir ilemdir. Derleyici, cast iinde int trn belirttiinizi fark eder. Daha sonra, derleyici onun alma zamannda tam olarak neye bavurduunu denetler. Herhangi bir ey olabilir. Cast ileminiz onun bir inte bavurduunu syledi diye bu gerekten bavurduu anlamna gelmez. o gerekten kutulanm inte bavuruyorsa ve herey uygunsa cast ilemi baaryla tamamlanr ve derleyicinin rettii kod kutulanm intden deeri karp alr. (Bu rnekte, kutulanm deer daha sonra i deikeninde depolanr.) Bu ilem kutulamay kaldrma (unboxing) olarak adlandrlr. Aadaki ekil neler olduunu gsterir:

Bununla birlikte, o kutulanm bir inte bavurmuyorsa, dntrmenin baarsz olmasna neden olan bir tr uyumazl vardr. Derleyici tarafndan retilen kod, alma zamannda bir InvalidCastException (GeersizDntrmezelDurumu) zel durumu oluturur. te baarsz olan bir kutulama kaldrma dntrme ilemi:
Circle c = new Circle(42); object o = c; // circle bavuru deikeni olduundan kutulanmaz int i = (int)o; // derlenir ancak alma zamannda bir zel durum oluturur

Blm 8

Deerleri ve Bavurular Anlamak

161

Daha sonraki rneklerde kutulama ve kutulamay kaldrmay kullanacaksnz. Denetleme iin gereken miktar nedeniyle ekstra bek bellei ayrmak gerektiinden, kutulama ve kutulamay kaldrma ilemlerinin pahal ilemler olduunu unutmayn. Kutulama kullanldr fakat bilinsiz kullanm programn performansn ciddi olarak bozabilir. Genericse Giri balkl Blm 18de kutulamaya alternatif ilemleri greceksiniz.

Verileri Gvenli Olarak Dntrmek


Dntrme ilemini kullanarak, sizin fikrinize gre, bir nesne tarafndan bavurulan verinin zel bir tre sahip olduunu ve bu tr kullanarak nesneye bavurmann gvenli olduunu belirtebilirsiniz. Buradaki kilit nokta, sizin fikrinize gre tmcesidir. C# derleyici, uygulamanz olutururken size gvenir fakat alma zaman daha phecidir ve uygulamanzn alma koulu olup olmadn denetler. Bellekteki nesne tr, dntrme ile elemiyorsa, alma zaman bir nceki blmde tanmland gibi InvalidCastException zel durumunu oluturur. Bu zel durumu yakalamal ve ilemelisiniz. Bununla birlikte, zel bir durumu yakalamak ve nesne trnn istediiniz trde olmadn bilerek bu zel durumu ilemek daha ziyade elverisiz bir yaklamdr. C# dntrme ilemini gerekletirmenize yardmc olabilecek olduka kullanl iki ile daha sunar: is ve as ileleri.

is leci
Nesne trnn istediiniz trde olduunu dorulamak iin is ilecini kullanabilirsiniz:
WrappedInt wi = new WrappedInt(); ... object o = wi; if (o is WrappedInt)

162

Ksm II
{

C# Dilini Anlamak
// Gvenli; o WrappedInttir

WrappedInt temp = (WrappedInt)o; ... }

is ileci iki ilenen alr: sol tarafta nesneye bavuru ve sa tarafta da tr ad. bek zerindeki bavurulan nesne tr zel bir tre sahipse, is ileci true sonucu verir, aksi takdirde, false verir. nceki kod, sadece dntrmenin baarl olacan biliyorsa, object trndeki o deikeninine bavuruyu dntrme ilemini yapar.

as leci
as ileci is ile ayn grevi yerine getirir fakat biraz ksaltlm olarak. as ilecini aadaki gibi kullanrsnz:
WrappedInt wi = new WrappedInt(); ... object o = wi; WrappedInt temp = o as WrappedInt; if (temp != null) ... // Dntrme baarl

is ileci gibi, as ileci de ilenen olarak bir nesne ve bir tr alr. alma zaman nesneyi belirtilen tre dntrmeye alr. Dntrme baarl olursa, sonu dndrlr. Bu rnekte, WrappedInt deikeni tempe (geici) atanmtr. Dntrme baarl deilse, as ileci temp deikenine null deeri atar. is ve as ilelerini Kaltmla almak balkl Blm 12de tekrar ele alacaksnz.

aretiler ve Gvensiz Kod


Bu blm yalnzca bilgilendirme amal olup C ya da C++ dillerini bilen yazlm gelitiricilere yneliktir. Programlamaya yeniyseniz, bu blm atlayabilirsiniz! Daha nce C ya da C++ gibi programlama dillerinde programlar yazdysanz, nceki blmde nesne bavurusuyla ilgili anlatlanlarn ou tandk gelmitir. Ne C, ne de C++ dillerinin ak trleri olmasa da her iki dil de benzer ilerlik sunan bir yapya sahiptir: iaretiler. Bir iareti (pointer) bellekteki (bek ya da yn zerinde) bir enin adresini ya da bu eye bir bavuruyu tutan bir deikendir. Bir deikeni iareti olarak tanmlamak iin zel bir szdizimi kullanlr. rnein, aadaki ifade pi deikenini bir tamsayya iareti olarak bildirir:
int *pi;

Blm 8

Deerleri ve Bavurular Anlamak

163

pi deikeni bir iareti olarak bildirilse de siz ona bir balang deeri atayana kadar hibir yere iaret etmez. rnein, pi iaretisini kullanarak i tamsay deikenini iaret etmek iin, aadaki ifadeleri ve & ilecini kullanabilirsiniz:
int *pi; int i = 99; ... pi = &i;

pi iareti deikeninden i deikeninde tutulan deere eriebilir ve bu deeri deitirebilirsiniz:


*pi = 100;

Bu kod i deikeninin deerini 100 olarak gncelletirir nk pi, i deikeni ile ayn bellek konumuna iaret etmektedir. C ve C++ dillerini renen programclarn karlatklar nemli sorunlardan biri iaretilerin kulland szdizimini anlamakla ilgilidir. * ilecinin aritmetikteki arpma ileminin yan sra en az iki anlam vardr ve ne zaman *, ne zaman & kullanlaca olduka kafa kartrmaktadr. aretilerle ilgili dier bir konu, geersiz bir yere iaret etmenin ya da iaret etmeyi tamamen unutmann ve ardndan iaret edilen veriye bavurmann ok kolay olmasdr. Sonu ya p olumas ya da programn hata verip baarsz olmasdr nk iletim sistemi bunu bellekteki yasak bir adrese eriim denemesi olarak alglar. Ayrca, birok var olan sistemlerde, iaretilerin kt ynetimiyle sonulanan gvenlik atlaklar da vardr. Baz ortamlar (Microsoft Windows olmayan), iaretinin baka bir ileme ait olan bellee bavurup bavurmadn denetlemekte baarszdr, gizli kalmas gereken veriyi tehlikeye atabilme riski meydana getirir. Tm bu problemlerden kanmak iin C#a bavuru deikenleri eklenmitir. Gerekten istiyorsanz, C#da iaretileri kullanmaya devam edebilirsiniz, ancak kodu gvensiz (unsafe) olarak iaretlemeniz gerekir. Aada gsterildii gibi, unsafe anahtar szc bir kod blounu ya da tm bir yntemi iaretlemek iin kullanlabilir:
public static void Main(string [] args) { int x = 99, y = 100; unsafe { swap (&x, &y); } Console.WriteLine(x is now {0}, y is now {1}, x, y); }

164

Ksm II

C# Dilini Anlamak

public static unsafe void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }

Gvensiz kod ieren programlar derlerken /unsafe seeneini belirtmeniz gerekir. Gvensiz kod ayrca bellein ynetimini etkiler ve gvensiz kod kullanarak oluturulan nesnelerin ynetilmedii olduu sylenir. Bu konu Blm 14te ayrntl olarak anlatlmaktadr. Bu blmde, deerlerini dorudan yn zerinde tutan deer trleriyle bek zerindeki nesnelerine dolayl olarak bavuran bavuru trleri arasndaki baz nemli farklar rendiniz. Ayrca, bamsz deikenlerine erimek iin bir yntem zerinde ref ve out anahtar szcklerini nasl kullanacanz da rendiniz. System.Object snfnn bir deikeninin deere (42 gibi) atanmasnn, deikenin deerinin bek zerinde oluturulan kutulanm bir kopyasna bavurmasna nasl neden olduunu grdnz.
n

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 9a gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 8 Hzl Bavuru


Bunun in
Bir deer tr deikeni kopyalamak

unu Yapn
Yalnzca kopyay oluturun. Deiken deer tr olduundan, ayn deerin iki kopyasn elde edersiniz. rnein:
int i = 42; int copyi = i;

Bir bavuru tr deikeni kopyalamak

Yalnzca kopyay oluturun. Deiken bavuru tr olduundan ayn nesneye bavuran iki bavuru elde edersiniz. rnein:
Circle c = new Circle(42); Circle refc = c;

Blm 8

Deerleri ve Bavurular Anlamak

165

Bir deer tr ya da null deer tutabilen bir deiken bildirmek Bir ref parametresine bir deiken geirmek

? dzenleyiciyi kullanarak deiken bildirin. rnein:


int? i = null;

Bamsz deikenin nne ref anahtar szcn yazn. Bu, parametreyi bamsz deikenin kopyas deil dier ad yapar. rnein:
static void Main() { int arg = 42; DoWork(ref arg); Console.WriteLine(arg); }

Bir out parametresine bir bamsz deiken geirmek

Bamsz deikenin nne out anahtar szcn yazn. Bu, parametreyi bamsz deikenin kopyas deil dier ad yapar. rnein:
static void Main() { int arg = 42; DoWork(out arg); Console.WriteLine(arg); }

Bir deeri kutulamak Bir deerin kutulamasn kaldrmak

Object trnde bir deikeni deere atayn. rnein:


Object o = 42;

Kutulanm deere bavuran nesne bavurusunu deerin trne dntrn. rnein:


int i = (int)o;

Bir nesneyi gvenli bir ekilde dntrmek

Dnmn geerli olup olmadn test etmek iin is ileci kullann. rnein:
WrappedInt wi = new WrappedInt(); ... object o = wi; if (o is WrappedInt) { WrappedInt temp = (WrappedInt)o; ... }

Alternatif olarak, dnm ilemini gerekletirmek iin as ileci kullann ve sonucun null olup olmadn test edin. rnein:
WrappedInt wi = new WrappedInt(); ... object o = wi; WrappedInt temp = o as WrappedInt; if (temp != null) ...

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak


Bu blm tamamladktan sonra renecekleriniz:
n n n n

Bir numaralandrma tr bildirmek. Bir numaralandrma tr yaratmak ve kullanmak. Bir yap tr bildirmek Bir yap tr yaratmak ve kullanmak

Blm 8de, Microsoft Visual C#da bulunan iki temel tr rendiniz: deer trleri ve bavuru trleri. Bir deer tr deiken, deerini dorudan yn zerinde tutarken bir bavuru tr deiken bek zerindeki bir nesneye bavuruyu tutar. Blm 7de, snflar tanmlayarak kendi bavuru trlerinizi nasl yaratacanz rendiniz. Bu blmde, kendi deer trlerinizi nasl yaratacanz reneceksiniz. C#, iki deer trn destekler: numaralandrma (enumeration) ve yap (structure). Her ikisine de srayla bakacaz.

Numaralandrmalarla almak
Programnzda yln mevsimlerini sunmak istediinizi varsayalm. lkbahar, yaz, sonbahar ve k sunmak iin 0, 1, 2 ve 3 tamsay deerlerini kullanabilirsiniz. Bu sistem alacaktr fakat fazla sezgisel deildir. Kodda 0 tamsay deerini kullandysanz, bu 0 deerinin ilkbahar gsterdii ok ak olmayacaktr. Ayrca ok salam bir zm de deildir. rnein, season (mevsim) adnda bir int deiken bildirirseniz, 0, 1, 2 ve 3 dnda tamsaylar atayabilirsiniz. C# daha iyi bir zm sunar. Deerlerin bir grup sembolik adla snrlandrld bir numaralandrma tr (enum tr olarak da adlandrlr) yaratmak iin enum anahtar szcn kullanabilirsiniz.

Bir Numaralandrma Tr Bildirmek


Bir enum anahtar szc ve arkasndan kme parantezleri iinde trn sahip olabilecei geerli deerleri tanmlayan semboller kullanarak numaralandrma trn bildirirsiniz. Aada, kalp deerleri Spring (lkbahar), Summer (Yaz), Fall (Sonbahar) ve Winter (K)

167

168

Ksm II

C# Dilini Anlamak

sembolik adlaryla snrlandrlm olan, Season (Mevsim) adl bir numaralandrma trnn nasl tanmlandn grebilirsiniz:
enum Season { Spring, Summer, Fall, Winter }

Numaralandrma Kullanmak
Bir numaralandrma bildirdikten sonra, numaralandrmann adn dier btn trler gibi bir tr ad olarak kullanabilirsiniz. Numaralandrma trnzn ad Season ise, aada gsterildii gibi, Season trnde deikenler, alanlar ve parametreler yaratabilirsiniz:
enum Season { Spring, Summer, Fall, Winter } class Example { public void Method(Season parameter) { Season localVariable; ... } private Season currentSeason; }

Bir numaralandrma deikeninin deerini kullanmadan nce, deikene ak olarak bir deer atanm olmaldr. Bir numaralandrma deikenine sadece numaralandrma tarafndan tanmlanm bir deer atayabilirsiniz. rnein:
Season colorful = Season.Fall; Console.WriteLine(colorful); // Fall yazar

Not Tm deer trleri gibi, ? dzenleyici kullanarak numaralandrma deikeninin bo olabilir bir srmn yaratabilirsiniz. Daha sonra, deikene, numaralandrma tarafndan tanmlanm deerleri atayabileceiniz gibi, null deer de atayabilirsiniz:
Season? colorful = null;

Fall yerine Season.Fall yazmanz gerektiine dikkat edin. Tm geerli numaralandrma adlar, kendi numaralandrma trlerinin etkinlik alanndadrlar. Numaralandrma trlerinin tesadfen ayn ad tayan hazr bilgileri ierebilmesine olanak tand iin bu durum yararldr. Ayrca, Console.WriteLine yntemini kullanarak numaralandrma deikenini grntlediinizde, derleyici deikenin deerine karlk gelen geerli deerin adn yazan kodu retir. Gerekirse, bir numaralandrma deikenini kendi geerli deerini yanstan bir dizeye dntrebilirsiniz. Bunu yapmak numaralandrmalar otomatik olarak ieren yerleik ToString yntemini kullanrsnz. rnein:

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

169

string name = colorful.ToString(); Console.WriteLine(name); // Fall da yazar

Tamsay deikenler zerinde kullanabileceiniz standart ilelerin birou, numaralandrma deikenleri zerinde de kullanlabilir (Dizinleyicileri Kullanmak balkl Blm 16da ele alnan bitwise ve shift ileleri dnda). rnein, eitlik ilecini (==) kullanarak, iki numaralandrma deikeninin eit olup olmadn karlatrabilir ve bir numaralandrma deikeni zerinde aritmetik ilem bile yapabilirsiniz (sonu her zaman mantkl olmasa bile!).

Numaralandrma Kalp Deerlerini Semek


Bir numaralandrma, her bir eleman ile bir tamsay deerini ilikilendirir. Varsaylan ayar olarak, numaralandrma ilk eleman iin 0 ile balar ve 1 basamak artarak ykselir. Numaralandrma deikeninin altnda yatan tamsay deerini elde etmek mmkndr. Blm 8deki kutulamay kaldrmak konusundan hatrlarsanz, bir veri trnden dierine dntrme ancak tersi geerli ve anlaml olduu srece yaplabilir. rnein, aadaki kod rnei Fall kelimesini deil, 2 deerini yazacaktr (Spring 0, Summer 1, Fall 2 ve Winter 3):
enum Season { Spring, Summer, Fall, Winter } ... Season colorful = Season.Fall; Console.WriteLine((int)colorful); // 2 yazar

sterseniz, aadaki rnekte olduu gibi, belirli bir tamsay sabitini (1 gibi), bir numaralandrma kelimesi (Spring gibi) ile ilikilendirebilirsiniz:
enum Season { Spring = 1, Summer, Fall, Winter }

nemli Bir numaralandrma kalbna atadnz tamsay deer derleme annda sabit olan bir deer (1 gibi) olmaldr. Bir numaralandrma kalbna ak bir ekilde bir tamsay deer vermediyseniz, derleyici, sfr deerini verecei ilk e hari, bir nceki deerinin karlndan bir fazlasn verecektir. Bir nceki rnekte, Spring, Summer, Fall ve Wintern deerleri 0, 1, 2 ve 3tr. Birden ok numaralandrma kalbna ayn deeri verebilirsiniz. rnein, ngilterede sonbahar iin Fall yerine Autumn kullanlr ve bunu koda aadaki gibi yanstabilirsiniz:
enum Season { Spring, Summer, Fall, Autumn = Fall, Winter }

170

Ksm II

C# Dilini Anlamak

Bir Numaralandrmann Arka Plandaki Trn Belirlemek


Bir numaralandrma tr bildirdiinizde, numaralandrma hazr bilgilerine int trnde deerler verilir. sterseniz, numaralandrmanz farkl bir tamsay trde tanmlayabilirsiniz. rnein, Seasonun arka plan trn int yerine short olarak tanmlamak isterseniz aadaki gibi yazabilirsiniz:
enum Season : short { Spring, Summer, Fall, Winter }

Bunu yapmann balca nedeni bellekten tasarruf etmektir; int tr short trnden daha fazla bellek alan tutar ve int tr aralnn tmne ihtiyacnz yoksa daha kk veri tr kullanmak daha mantkldr. Numaralandrmanz sekiz tamsay trnden birine dayandrabilirsiniz: byte, sbyte, short, ushort, int, uint, long ya da ulong. Numaralandrma hazr bilgilerinin tm deerleri seilen trn aralna uygun olmaldr. rnein, numaralandrma trn, byte veri tr olarak seerseniz, maksimum (0dan balayarak) 256 adet hazr bilgiye sahip olabilirsiniz. Artk bir numaralandrma trn nasl yaratacanz rendiinize gre, sra onu kullanmaya geldi. Aadaki altrmada, yln aylarn gsteren numaralandrma bildiren ve kullanan bir Console uygulamas ile alacaksnz.

Bir numaralandrma yaratn ve kullann


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 9\ StructsAndEnums klasrnde yer alan StructsAndEnums projesini an. 3. Code and Text Editor penceresinde, Month.cs dosyasn grntleyin. Kaynak dosya, StructsAndEnums adnda bo bir ad alan ierir. 4. Aada gsterildii gibi, yln aylarn gstermek iin StructsAndEnums ad alanna Month adl bir numaralandrma tr ekleyin. Month iin 12 adet numaralandrma hazr bilgisi Ocaktan (January) Aralka (December) kadardr.
namespace StructsAndEnums { enum Month { January, February, March, April, May, June, July, August, September, October, November, December } }

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

171

5. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. nceki blmlerdeki altrmalarda olduu gibi, Main yntemi Entrance yntemini arr ve oluan zel durumlar yakalar. 6. Code and Text Editor penceresinde, Entrance yntemine, first adl Month trnde bir deiken bildiren ve Month.Januarya eitleyen bir ifade ekleyin. lk deikenin adn konsola yazan baka bir ifade daha ekleyin. Entrance yntemi tam olarak u ekilde grnmelidir:
static void Entrance() { Month first = Month.January; Console.WriteLine(first); }

Not Monthdan sonra nokta yazdnzda (Month.), IntelliSense otomatik olarak Month
numaralandrmasndaki tm deerleri grntler.

7. Debug mensnde Start Without Debuggingi tklayn. Visual Studio 2008, program oluturur ve altrr. Konsola January yazldndan emin olun. 8. Program kapatmak ve Visual Studio 2008 programlama ortamna dnmek iin Entera basn. 9. Entrance yntemine, first deikenini artrmak ve yeni deeri konsolda grntlemek iin iki ifade daha ekleyin:
static void Entrance() { Month first = Month.January; Console.WriteLine(first); first++; Console.WriteLine(first); }

10. Debug mensnde Start Without Debuggingi tklayn. Visual Studio 2008, program oluturur ve altrr. Konsolda January ve February yazdn dorulayn. Bir numaralandrma deikeni zerinde matematiksel ilem (artrma ilemi gibi) gerekletirdiinizde deikenin iindeki tamsay deerin deitiine dikkat edin. Deiken konsola yazldnda, uygun numaralandrma deeri grntlenir. 11. Program kapatmak ve Visual Studio 2008 programlama ortamna dnmek iin Entera basn.

172

Ksm II

C# Dilini Anlamak

12. first deikenine Month.December deerini atamak iin Entrance yntemindeki ilk ifadeyi aadaki gibi deitirin:
static void Entrance() { Month first = Month.December; Console.WriteLine(first); first++; Console.WriteLine(first); }

13. Debug mensnde, Start Without Debuggingi tklayn. Visual Studio 2008, program oluturur ve altrr. Bu defa, konsola December (Aralk) kelimesi arkasndan da 12 says yazlr. Bir numaralandrma zerinde aritmetik ilem gerekletirilebilmekle birlikte, ilemin sonucu numaralandrma iin tanmlanm deer aralnn dnda olursa, alma zamannn yapabilecei tm ey, deikene uygun tamsay deerindeymi gibi davranmaktr. 14. Program kapatmak ve Visual Studio 2008 programlama ortamna dnmek iin Entera basn.

Yaplarla almak
Blm 8de, bavuru trlerini tanmlayan snflarn her zaman bek zerinde yaratldn grmtnz. Baz durumlarda, bir snfta, bek ynetimini ar yk haline getirecek kadar az veri bulunabilir. Bu durumlarda, en iyisi tr yap olarak tanmlamaktr. Yap, bir deer trdr. Yaplar yn zerinde depolandndan, yap kk olduu srece bellek ynetimi yk de azalm olacaktr. Bir yapnn, bir snfn olduu gibi (ve numaralandrmadan farkl olarak) kendi alanlar, yntemleri ve kurucular olabilir.

Sk Kullanlan Yap Trleri


Belki farknda deilsiniz ama, nceki altrmalarda zaten yaplar kullandnz. C#da, int, long ve float temel saysal trleri, srasyla System.Int32, System.Int64 ve System.Single yaplarnn takma adlardr. Bu yaplar, alanlar ve yntemlere sahiptir ve bu trlerin deikenleri ve hazr bilgileri zerinde yntemler arabilirsiniz. rnein, bu yaplarn tm, saysal deeri, dizesel gsterimine eviren ToString yntemini salar. Aadaki ifadelerin tm C#da geerli ifadelerdir:
int i = 99; Console.WriteLine(i.ToString()); Console.WriteLine(55.ToString()); float f = 98.765F;

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

173

Console.WriteLine(f.ToString()); Console.WriteLine(98.765F.ToString());

ToString ynteminin kullanmn ok sk gremezsiniz, nk Console.WriteLine yntemi gerektiinde otomatik olarak arr. Bu yaplar tarafndan ortaya karlm statik yntemlerin kullanm daha yaygndr. rnein, daha nceki blmlerde bir dizeyi uygun tamsay deerine dntrmek iin statik int.Parse yntemini kullandnz. Gerekte yaptnz ey, Int32 yapsnn Parse yntemini armaktr:
string s = 42; int i = int.Parse(s); // Int32.Parse ile tamamen ayn

Bu yaplar ayrca baz kullanl statik alanlar da ierir. rnein, Int32.MaxValue, int trnn tutabildii maksimum deer, Int32.MinValue de minimum deerdir. Aadaki tablo, C#daki temel trleri ve Microsoft .NET Frameworkdeki edeer trlerini gsterir. string ve object trlerinin yaplar deil, snflar (bavuru trleri) olduuna dikkat edin.
Anahtar Szck
bool byte decimal double float int long object sbyte short string uint ulong ushort

Edeer Tr
System.Boolean System.Byte System.Decimal System.Double System.Single System.Int32 System.Int64 System.Object System.SByte System.Int16 System.String System.UInt32 System.UInt64 System.UInt16

Snf ya da Yap
Yap Yap Yap Yap Yap Yap Yap Snf Yap Yap Snf Yap Yap Yap

174

Ksm II

C# Dilini Anlamak

Bir Yap Bildirmek


Kendi yap deer trnz bildirmek iin, struct anahtar szc, arkasndan tr ad, onun arkasndan da alan ve kapanan kme parantezleri arasnda yapnn gvdesini yazarsnz. rnein, aada ad Time (zaman) olan ve hours (saatler), minutes (dakikalar) ve seconds (saniyeler) adl public int alan ieren bir yap grebilirsiniz:
struct Time { public int hours, minutes, seconds; }

Snflardaki gibi, bir yapnn alanlarn public yapmak birok durumda nerilmez; public alanlarn geerli deerler ierdiinden emin olmann bir yolu yoktur. rnein, herhangi biri minutes ya da secondsn deerini 60dan byk bir deere atayabilir. Alanlar private tanmlamak ve yapnza kurucular ve yntemler eklemek daha iyi bir fikirdir. rnein:
struct Time { public Time(int hh, int mm, int ss) { hours = hh % 24; minutes = mm % 60; seconds = ss % 60; } public int Hours() { return hours; } ... private int hours, minutes, seconds; }

Not Varsaylan ayar olarak, yaygn ilelerin birounu kendi yap trlerinizde kullanamazsnz. rnein, eitlik ileci (==) ve eitsizlik ileci (!=) gibi ileleri kendi yap tr deikenleriniz zerinde kullanamazsnz. Bununla birlikte, kendi yap trlerinizi ak bir ekilde bildirebilir ve ileleri uygulayabilirsiniz. Bunun iin szdizimi, le Ar Yklenmesi balkl Blm 21de ele alnmtr. Basit kavramlar uygulamak iin balca zellii deerleri olan yaplar kullann. rnein, int bir deer trdr nk balca zellii deeridir. Ayn deere sahip (42 gibi) iki int deikenine sahipseniz, biri dieri kadar iyidir. Bir deer tr deikenini kopyaladnzda, deerin iki kopyasn elde edersiniz. Bunun aksine, bir bavuru tr deikeni kopyaladnzda, ayn nesneye iki bavuru elde edersiniz. zetle, bir adres kopyalamak gibi

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

175

deeri kopyalamaya yeterli olacak kadar kk deerler iin yaplar kullann. Daha karmak veriler iin snflar kullann, bylece kodunuzun verimliliini artrmak istediinizde sadece gerek deerin adresini kopyalama seeneine sahip olursunuz.

Yap ve Snf Farklarn Anlamak


Bir yap ve bir snf, szdizimi asndan benzerdir fakat birka nemli farkllk vardr. Bu farkllklarn bazlarna bakalm:
n

Bir yap iin varsaylan bir kurucu (parametreleri olmayan bir kurucu) bildiremezsiniz. rnein, aada Time snf olsayd derlenecekti ama bir yap olduundan derlenmeyecektir:
struct Time { public Time() { ... } // derleme zaman hatas ... }

Bir yap iin kendi varsaylan kurucunuzu bildirememenizin nedeni, derleyicinin her zaman bir tane retmesidir. Bir snfta, derleyici ancak siz kendi kurucunuzu yazmazsanz varsaylan bir kurucu yazar. Bir yap iin derleyici tarafndan retilmi varsaylan kurucu her zaman alanlara 0, false ya da null atar tpk snflarda olduu gibi. Bu nedenle, varsaylan kurucu tarafndan yaratlm bir yap deerinin mantkl davrandndan ve bu varsaylan deerlerle bir anlam ifade ettiinden emin olun. Bu varsaylan deerleri kullanmak istemiyorsanz, varsaylan olmayan bir kurucu salayarak alanlara farkl deerler atayabilirsiniz. Bununla birlikte, varsaylan olmayan yap kurucunuzda alana balang deeri atamazsanz, derleyici sizin iin deer atamaz. Yani, varsaylan olmayan tm yap kurucularnzdaki tm alanlara ak bir ekilde deer atamalsnz, aksi takdirde derleme hatas alrsnz. rnein, Time bir snf olsayd aadaki rnek derlenecek ve seconds sessizce 0 olarak balatacakt ama Time bir yap olduundan derlenmeyecektir:
struct Time { public Time(int hh, int mm) { hours = hh; minutes = mm; } // derleme zaman hatas: seconds balatlmam ... private int hours, minutes, seconds; }

176

Ksm II
n

C# Dilini Anlamak

Bir snfta, oluum alanlarn bildirildikleri noktada balatabilirsiniz. Bir yapda, bunu yapamazsnz. rnein, Time bir snf olsayd aadaki rnek derlenecekti ama Time bir yap olduundan, bir derleme hatasna neden olur:
struct Time { ... private int hours = 0; // derleme zaman hatas private int minutes; private int seconds; }

Aadaki tablo, bir yap ve bir snf arasndaki balca farkllklar zetler.
Soru
Bir bavuru tr m, yoksa deer tr mdr? rnekleri ynda m bekte mi bulunur?

Yap
Yaplar deer trdr. Yap rnekleri deerler olarak adlandrlr ve ynda bulunurlar. Hayr Evet

Snf
Snflar bavuru trdr. Snf rnekleri nesneler olarak adlandrlr ve bekte bulunurlar. Evet Hayr

Bir varsaylan kurucu bildirebilir misiniz? Kendi kurucunuzu bildirirseniz, derleyici varsaylan bir kurucu retir mi? Kendi kurucunuzdaki bir alan balatmazsanz, derleyici sizin iin otomatik olarak balatr m? rnek alanlarn bildirildikleri noktada balatmanza izin verilir mi?

Hayr

Evet

Hayr

Evet

Snflarla yaplar arasnda kaltmla ilgili baka farkllklar da vardr. Bu farkllklar, Kaltmla almak balkl Blm 12de ele alnmtr. Artk yaplarn nasl bildirildiini bildiinize gre bir sonraki adm deerler yaratmak iin onlar kullanmak olacaktr.

Yap Deikenleri Bildirmek


Bir yap tr bildirdikten sonra, yapnn adn dier trler gibi bir trn ad olarak kullanabilirsiniz. rnein, Time yap trnzn adysa, aadaki gibi, Time trnde deikenler, alanlar ve parametreler yaratabilirsiniz:
struct Time { ... private int hours, minutes, seconds; }

Blm 9
class Example { public void Method(Time parameter) { Time localVariable; ... } private Time currentTime; }

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

177

Not ? dzenleyicisini kullanarak bir yap deikeninin bo olabilen srmn yaratabilirsiniz. Daha sonra, deikene null deeri atayabilirsiniz:
Time? currentTime = null;

Yap Balatmay Anlamak


Bu blmde daha nce, bir kurucu kullanlarak bir yapdaki alanlarn nasl balatldn grdnz. Bununla birlikte, yaplar deer trleri olduundan, aadaki rnekte gsterildii gibi, bir kurucu armadan yap deikenleri yaratabilirsiniz:
Time now;

Bu rnekte, deiken yaratlm fakat alanlarna deer atanmamtr. Bu alanlardaki deerlere erimeye allmas derleme hatas verecektir. Aadaki ekil now (imdi) deikenindeki alanlarn durumunu gstermektedir:

Bir kurucu arrsanz, daha nce tanmlanm eitli yap kurucular kurallar, yapdaki tm alanlarn balatlacan garanti eder:
Time now = new Time();

178

Ksm II

C# Dilini Anlamak

Bu defa, aadaki ekilde gsterildii gibi, varsaylan kurucu yapdaki alanlar balatr:

Her iki durumda da, Time deikeninin yn zerinde yaratldna dikkat edin. Kendi yap kurucunuzu yazdysanz, yap deikenine balang deeri atamak iin onu da kullanabilirsiniz. Bu blmde daha nce akland gibi, bir yap kurucusu her zaman ak bir ekilde tm alanlarna balang deeri atamak zorundadr. rnein:
struct Time { public Time(int hh, int mm) { hours = hh; minutes = mm; seconds = 0; } ... private int hours, minutes, seconds; }

Aadaki rnek, kullanc tarafndan tanmlanm kurucuyu ararak now deikenine balang deeri atar:
Time now = new Time(12, 30);

Aadaki ekil, bu rnein etkisini gsterir:

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

179

Yap Deikenlerini Kopyalamak


Bir yap deikenini dier bir yap deikenine eitleyebilir ya da atayabilirsiniz, fakat bunu yalnzca sadaki yap deikeni tam olarak balatlmsa (yani, tm alanlarna balang deeri atanmsa) yapabilirsiniz. rnein, aadaki rnek derlenecektir nk now tmyle balatlmtr. (ekilde atama ileminin sonular grnmektedir.)
Time now = new Time(12, 30); Time copy = now;

Aadaki rnek derlenmeyecektir, nk now tam olarak balatlmamtr:


Time now; Time copy = now; // derleme zaman hatas: now atanmam

Bir yap deikenini kopyaladnzda, sol taraftaki btn alanlar dorudan sa taraftaki uygun alandan kopyalanr. Bu kopyalama, tm yapnn ieriini kopyalayan hzl, tek bir ilemdir ve zel bir durum oluturmaz. Bu kopyalama ilemiyle, Time bir snf olduunda gerekleen kopyalama ilemini karlatrn. Time bir snf olsayd, her iki deiken de (now ve copy ), bek zerinde ayn nesneye bavururdu. Not C++ programclar, bu kopyalama davrann deitiremeyeceklerine dikkat etmelidir. imdi, bu bilgiyi uygulamaya koymann zaman geldi. Aadaki altrmada, bir tarihi yanstmas iin bir yap tr yaratacak ve kullanacaksnz.

180

Ksm II

C# Dilini Anlamak

Bir yap tr yaratn ve kullann


1. StructsAndEnums projesinde, Code and Text Editor penceresinde Date.cs dosyasn grntleyin. 2. StructsAndEnums ad alan iine Date adnda bir yap ekleyin. Bu yap, private alan iermelidir: Biri int trnde year adl, biri Month (bir nceki altrmada numaralandrma kullanarak yarattnz) trnde month adl ve dieri de int trnde day adl alan. Date yaps tam olarak u ekilde grnmelidir:
struct Date { private int year; private Month month; private int day; }

Derleyicinin Date iin retecei varsaylan kurucuyu dnn. Bu kurucu year 0a, monthu 0a (January deeri) ve dayi de 0a eitleyecektir. Yl iin 0 deeri geersizdir (0 yl yoktur) ve ayn zamanda gn iin de 0 deeri geersizdir (her ay 1. gnden balar). Bu sorunu dzeltmenin bir yolu, year ve day deerlerini evirmektir. Bylece, Date yaps, year alan Y deeri aldnda Y+1900 deerini (isterseniz baka bir yzyl da alabilirsiniz) ve day alan D deerini aldnda, D+1 deerini gsterecektir. Varsaylan kurucu, alana 1 January 1900 deerini gsteren deerler atar. 3. Date yapsna, bir public kurucu ekleyin. Bu kurucu parametre almaldr: year iin ccyy adl bir int, month iin mm adl bir Month ve day iin dd adl bir int. Bu parametreyi uygun alanlar balatmak iin kullann. Y olan bir year alan Y+1900 ifade ettiinden, year alann ccyy-1900 olarak balatmalsnz. D olan bir day alan D+1i ifade ettiinden, day alann dd-1 olarak balatmalsnz. Date yaps imdi yle grnmelidir (kurucu koyu harflerle gsterilmitir):
struct Date { public Date(int ccyy, Month mm, int dd) { this.year = ccyy - 1900; this.month = mm; this.day = dd - 1; } private int year; private Month month; private int day; }

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

181

4. Date yapsna, kurucudan sonra ToString adnda bir public yntem ekleyin. Bu yntem herhangi bir bamsz deiken almaz, tarihin dize gsterimini dndrr. year alannn deerinin year + 1900 gsterdiini ve day alannn day + 1 gsterdiini hatrlayn. Not ToString yntemi, imdiye kadar grdnz yntemlerden biraz farkldr. Tanmladnz yaplar ve snflar da dahil olmak zere, her tr, siz isteseniz de istemeseniz de otomatik olarak bir ToString yntemine sahiptir. Varsaylan davran, bir deikendeki deeri dize gsterimine evirmektir. Bazen, varsaylan davran anlamldr; bazen de yetersizdir. rnein, Date snf iin retilmi olan ToString ynteminin varsaylan davran, basite StructsAndEnums.Date dizesini oluturacaktr. override anahtar szcn kullanarak, bu yntemin varsaylan davrann geersiz klan yeni bir srmn tanmlamanz gerekir. Yntemleri geersiz klmak Blm 12de ayrntlaryla incelenmitir. ToString yntemi yle grnmelidir:
public override string ToString() { return this.month + + (this.day + 1) + + (this.year + 1900); }

Not Parentezler iindeki + iaretleri aritmetik toplama ilecidir. Dierleri dize birletirme ilecidir. Parantezler olmadan, tm + iaretleri dize birletirme ileci olarak ele alnr. Tek bir ifadede farkl ileler iin ayn semboller olduunda, bu biraz kafa kartrc olabilir! 5. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 6. Entrance ynteminin sonuna, defaultDate adnda bir yerel deiken bildiren ve onu varsaylan Date kurucusu kullanlarak yaplan bir Date deerine atayan bir ifade ekleyin. Entrance yntemine, Console.WriteLine yntemini ararak konsola defaultDate deikenini yazan bir baka ifade ekleyin. Not Console.WriteLine yntemi otomatik olarak, bamsz deikenini dize biimine evirmek iin ToString yntemini arr.

182

Ksm II

C# Dilini Anlamak

Entrance yntemi yle grnmelidir:


static void Entrance() { ... Date defaultDate = new Date(); Console.WriteLine(defaultDate); }

7. Program oluturmak ve altrmak iin Debug mensnde, Start Without Debuggingi tklayn. Konsola January 1 1900 yazldn dorulayn. (lk olarak, Entrance ynteminin orijinal sonucu grntlenir.) 8. Visual Studio 2008 programlama ortamna dnmek iin Entera basn. 9. Code and Text Editor penceresinde, Entrance yntemine dnn ve iki ifade daha ekleyin. lk ifade, halloween adnda yerel bir deiken bildirip deerini October 31 2008e atamaldr. kinci ifade de halloween deerini konsola yazmaldr. Entrance yntemi imdi yle grnmelidir:
static void Entrance() { ... Date halloween = new Date(2008, Month.October, 31); Console.WriteLine(halloween); }

Not new anahtar szcn yazdnzda, IntelliSense otomatik olarak, Date tr iin iki kurucunun var olduunu bulacaktr. 10. Debug mensnde, Start Without Debuggingi tklayn. Konsolda nceki bilginin altna October 31 2008 yazldn dorulayn. 11. Program kapatmak iin Entera basn. Baarl bir ekilde, enum ve struct anahtar szcklerini kullanarak kendi deer trlerinizi tanmladnz ve sonra da bu trleri kod iinde kullandnz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 10a gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 9

Numaralandrma ve Yaplar ile Deer Trleri Yaratmak

183

Blm 9 Hzl Bavuru


Bunun in
Bir numaralandrma tr bildirmek

unu Yapn
enum anahtar szcn yazn, ardndan trn adn ve sonra da iki kuak imi arasnda numaralandrma hazr bilgilerini virglle ayrlm olarak listeleyin. rnein:
enum Season { Spring, Summer, Fall, Winter }

Bir numaralandrma deikeni bildirmek Bir numaralandrma deikenini bir deere atamak

Numaralandrma trnn adn sola yazn ardndan deikenin adn ve noktal virgl ekleyin. rnein:
Season currentSeason;

Numaralandrma hazr bilgisinin adn ait olduu numaralandrma tr ile birlikte yazn. rnein:
currentSeason = Spring; // hata currentSeason = Season.Spring; // doru

Bir yap tr bildirmek

struct anahtar szcn yazn, ardndan yap trnn adn ve sonra da yapnn gvdesini (kurucular, yntemler ve alanlar) ekleyin. rnein:
struct Time { public Time(int hh, int mm, int ss) { ... } ... private int hours, minutes, seconds; }

Bir yap deikeni bildirmek

Yap trnn adn yazn, ardndan deikenin adn ve noktal virgl ekleyin. rnein:
Time now;

Bir yap deikenini bir deere atamak

Bir yap kurucusu arlarak yaratlm bir yap deerini deikene balang deeri olarak atayn. rnein:
Time lunch = new Time(12, 30, 0);

Blm 10

Dizileri ve Koleksiyonlar Kullanmak


Bu blm tamamladktan sonra renecekleriniz:
n n

Dizi deikenlerini bildirmek, balatmak, kopyalamak ve kullanmak. eitli koleksiyon trlerini bildirmek, balatmak, kopyalamak ve kullanmak.

Birok farkl trlerin deikenlerini nasl yaratacanz ve kullanacanz grdnz. Bununla birlikte, imdiye kadar grdnz deiken rneklerinin tmnde ortak olan bir ey vardr; tek bir e ile ilgili bilgiyi tutarlar (bir int, bir float, bir Circle, bir Time ve bunun gibi). Peki, bir eler kmesini ilemeniz gerektiinde ne olacak? Bir zm, kmedeki her e iin bir deiken yaratmak olabilir, fakat bu zm ok sayda soru getirir: Ka adet deiken gerekir? Bu deikenlerin adlar ne olmaldr? Kmedeki her bir e zerinde ayn ilemi gerekletirmeniz gerekiyorsa (tamsaylar kmesindeki her bir deikeni artrmak gibi), ok sayda kod tekrarndan nasl kanlabilir? Bu zm, program yazarken ka eye ihtiyacnz olacan bildiinizi varsayar, fakat bu ne kadar sklkla olan bir durumdur? rnein, bir veritabanndaki kaytlar okuyan ve ileyen bir uygulama yazyorsanz, veritabannda ka adet kayt vardr ve bu saynn deime ihtimali nedir? Diziler ve koleksiyonlar, bu sorularla ifade edilen problemleri zen teknikler salar.

Dizi Nedir?
Bir dizi (array), sralanmam eler serisidir. Bir dizideki tm eler ayn trdedir (bir yapdaki ya da snftaki farkl trlerde olabilen alanlarn aksine). Bir dizinin eleri, bir bellek blounda bitiik olarak tutulur ve (adlaryla eriilen, bir yapdaki ya da snftaki alanlarn aksine) tamsay dizinler kullanlarak eriilirler.

Dizi Deikenleri Bildirmek


Bir dizi deikenini, e trnn adn, ardndan da bir ift keli parantez ve deiken adn yazarak bildirirsiniz. Keli parantezler deikenin bir dizi olduunu belirtir. rnein, pins (Kimlik Numaralar) adnda bir int deikenler dizisi bildirmek iin, aadaki kodu yazarsnz:
int[] pins; // Kiisel Kimlik Numaralar

Microsoft Visual Basic ile program gelitirenler, parantez deil de keli parantez kullanldna dikkat etmelidir. C ve C++ ile program gelitirenler, dizinin boyutunun bildirim

185

186

Ksm II

C# Dilini Anlamak

iinde belirtilmediine dikkat etmelidir. Java ile program gelitirenler ise, keli parantezleri deiken adndan nce yazmak gerektiine dikkat etmelidir. Not Dizi eleri olarak, temel trlerle snrl deilsiniz. Ayrca, yaplar, numaralandrmalar
ve snflarn dizisini yaratabilirsiniz. rnein, aadaki gibi Time yaplarnn bir dizisini yaratabilirsiniz:
Time[] times;

pucu Dizi deikenlerine, (her e bir Place(yer) olduunda) places (yerler), (her e bir

Person(kii) olduunda) people (insanlar) ya da (her e bir Time(zaman) olduunda) times (zamanlar) gibi, oul adlar vermek ou zaman kullanldr.

Bir Dizi Oluumu Yaratmak


Diziler, elerin tr ne olursa olsun, bavuru trdr. Yani, dizi deikeni bek zerinde dizi elerini tutan bitiik bellek blouna bavurur (bir snf deikeninin bek zerindeki bir nesneye bavurduu gibi), dizi elerini dorudan yn zerinde tutmaz (bir yapnn yapt gibi). (Deerleri, bavurular ve yn ile bek arasndaki farklar yeniden gzden geirmek iin, Deerler ve Bavurular Anlamak balkl Blm 8e bakn.) Bir snf deikeni bildirdiinizde, siz new anahtar szcn kullanarak bir oluum yaratana kadar nesne iin bellek ayrlmaz. Diziler de ayn kurallar izler; bir dizi deiken bildirdiinizde, boyutunu bildirmezsiniz. Dizi boyutunu, gerekten bir dizi oluumu yarattnzda belirtirsiniz. Bir dizi oluumu yaratmak iin, new anahtar szcn ardndan da e trnn adn ve keli parantez iinde yarattnz dizinin boyutunu yazarsnz. Bir dizi yaratmak, ayn zamanda elerine varsaylan deerleri de (enin trnn saysal, bavuru ya da Boolean olmasna bal olarak srasyla 0, null ya da false) atar. rnein, nceden bildirilmi pins deikeni iin yeni bir drt tamsaydan oluan dizi yaratmak ve pins deikenine atamak iin unu yazarsnz:
pins = new int[4];

Aadaki ekil bu ifadenin etkilerini gsterir:

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

187

Bir dizi oluumunun boyutu sabit olmak zorunda deildir, aadaki rnekte gsterildii gibi alma zamannda hesaplanabilir:
int size = int.Parse(Console.ReadLine()); int[] pins = new int[size];

Boyutu 0 olan bir dizi yaratabilirsiniz. Bu biraz tuhaf gelebilir, fakat bir dizinin boyutu dinamik olarak belirlenebiliyorsa ve 0 olabiliyorsa, bu durum yararldr. 0 boyutundaki bir dizi null deildir. Ayrca ok boyutlu diziler oluturmak da mmkndr. rnein, iki boyutlu bir dizi oluturmak iin, iki tamsay dizini olmas gereken bir dizi yaratrsnz. ok boyutlu dizilerin incelemesi bu kitabn kapsam dndadr fakat aada bir rneini grebilirsiniz:
int[,] table = new int[4,6];

Dizi Deikenlerini Balatmak


Bir dizi oluumu yarattnzda, dizi oluumunun tm eleri, trlerine bal olarak varsaylan bir deerle balatlrlar. Bu davran deitirebilir ve isterseniz bir dizinin elerini belirli deerlerle balatabilirsiniz. Bu belirli deerleri, kme parantezi iinde virglle ayrarak yazarsnz. rnein, pinsi, deerleri 9, 3, 7 ve 2 olan drt int deiken dizisi olarak balatmak iin unu yazabilirsiniz:
int[] pins = new int[4]{ 9, 3, 7, 2 };

Kme parantezi arasndaki deerler sabit olmak zorunda deildir. Aadaki rnekte gsterildii gibi, alma zamannda hesaplanan deerler olabilirler:
Random r = new Random(); int[] pins = new int[4]{ r.Next() % 10, r.Next() % 10, r.Next() % 10, r.Next() % 10 };

Not System.Random snf, bir rastgele say reticisidir. Next yntemi, varsaylan ayar olarak, 0 ile Int32.MaxValue arasnda rastgele bir negatif olmayan say dndrr. Next yntemi ar yklenmitir ve dier srmler say aralnn minimum ve maksimum deerlerini belirlemenize olanak tanr. Random snf iin varsaylan kurucu, zamana baml tohum deer ile rastgele say reticisini tohumlar. Bylece rastgele saylar birden fazla kullanma olasln azaltr. Kurucunun ar yklenmi srm, kendi tohum deerinizi salamanza imkan tanr. Bu yolla, test amacnz iin tekrarlanabilir rastgele saylarn srasn retebilirsiniz.

188

Ksm II

C# Dilini Anlamak

Kme parantezi arasndaki deerlerin says, tam olarak yaratlan dizi oluumunun boyutuna eit olmaldr:
int[] pins = new int[3]{ 9, 3, 7, 2 }; // derleme zaman hatas int[] pins = new int[4]{ 9, 3, 7 }; // derleme zaman hatas int[] pins = new int[4]{ 9, 3, 7, 2 }; // tamam

Bir dizi deikenini balatrken, new deyimini ve dizinin boyutunu yazmayabilirsiniz. Derleyici, dizi boyutunu, balatcdan itibaren hesaplar ve diziyi yaratmak iin kodu retir. rnein:
int[] pins = { 9, 3, 7, 2 };

Bir yap dizisi yaratyorsanz, dizideki her yapy yap kurucusunu ararak balatabilirsiniz. rnein:
Time[] schedule = { new Time(12,30), new Time(5,30) };

rtl Yazlm Dizi Yaratmak


Bir dizi bildirirken e tr, dizi iinde saklayacanz e tr ile elemek zorundadr. rnein, nceki rnekte gsterildii gibi, pins dizisini int trnde bildirirseniz, bu dizide double, string, struct ya da int dnda herhangi bir tr saklayamazsnz. Bir dizi bildirirken bir balatc listesi belirtirseniz, C# derleyicisinin sizin iin dizideki elerin gerek trn anlamasn salayabilirsiniz. rnein:
var names = new[]{John, Diana, James, Francesca};

Bu rnekte, C# derleyicisi names deikeninin bir dize dizisi olup olmadn hesaplar. Bu bildirimde szdizimi ile ilgili birka nokta nemlidir. lk olarak, tr kme parantezleri arasnda yazlmamtr; bu rnekte names deikeni basite var olarak ya da var[] olmayan olarak bildirilmitir. kincisi, balang deerleri listesinden nce keli parantez ve new anahtar szc kullanmanz gerekir. Bu szdizimini kullanrsanz, tm balang deerlerinin ayn trde olduundan emin olmanz gerekir. Aadaki rnek, No best type found for implicitly typed array (rtl dizi iin en iyi tr bulunamad) derleme hatasna neden olur.
var bad = new[]{John, Diana, 99, 100};

Bununla birlikte, baz durumlarda, mantklysa, derleyici eleri baka bir tre evirir. Aadaki kodda, 3.5 ve 99.999 deerlerinin her ikisi de double olduundan numbers (saylar), bir double dizidir ve C# derleyicisi, 1 ve 2 tamsay deerlerini double deerlere evirebilir:
var numbers = new[]{1, 2, 3.5, 99.999};

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

189

Genel olarak, kark trlerden kanmak ve derleyicinin trleri sizin iin evirmesini beklemek en iyisidir. rtl olarak yazlm diziler, Snflar ve Nesneleri Yaratmak ve Ynetmek balkl Blm 7de tanmlanan anonim trlerle altnzda ok kullanldr. Aadaki kod, anonim nesnelerin bir dizisini yaratr.
var names = new[] { new new new new { { { { Name Name Name Name = = = = John, Age = 42 }, Diana, Age = 43 }, James, Age = 15 }, Francesca, Age = 13 } };

Anonim trlerdeki alanlar, dizinin tm elerinde ayn olmaldr.

Dizi elerine Tek Tek Erimek


Tek tek dizi esine erimek iin, istediiniz enin hangisi olduunu gsteren dizini yazmanz gerekir. rnein, aadaki kodu kullanarak, pins dizisinin 2 esinin ieriini bir int deikene atayabilirsiniz:
int myPin; myPin = pins[2];

Benzer ekilde, dizinli bir eye bir deer atayarak bir dizinin ieriini deitirebilirsiniz:
myPin = 1645; pins[2] = myPin;

Dizi dizinleri sfr tabanldr. Bir dizinin ilk esi 1 dizininde deil, 0 dizininde bulunur. 1 dizini kullanlarak ikinci eye eriilir. Btn dizi esi eriimleri, snr denetimlidir. 0dan kk ya da dizinin boyutuna eit ya da byk bir dizin belirtirseniz, derleyici aadaki rnekte olduu gibi IndexOutOfRangeException (DizinAralkDndazelDurumu) zel durumunu oluturur:
try { int[] pins = { 9, 3, 7, 2 }; Console.WriteLine(pins[4]); // hata, 4. ve son e dizin 3te } catch (IndexOutOfRangeException ex) { ... }

190

Ksm II

C# Dilini Anlamak

Bir Dizi Boyunca Yineleme Yapmak


Diziler ok sayda kullanl yerleik zellikler ve yntemlere sahiptir. (Tm diziler, Microsoft .NET Frameworkdeki System.Array snfndan yntemleri ve zellikleri miras alr.) Bir dizinin ka adet e ierdiini bulmak iin Length (Uzunluk) zelliini sorgulayabilir ve bir for ifadesi kullanarak dizinin tm eleri boyunca yineleme yapabilirsiniz. Aadaki rnek kod, pins dizisinin dizi esi deerlerini konsola yazar:
int[] pins = { 9, 3, 7, 2 }; for (int index = 0; index < pins.Length; index++) { int pin = pins[index]; Console.WriteLine(pin); }

Not Length, yntem deil bir zelliktir, bu nedenle parantez yazlmadan arlr. Alanlara Erimek iin zellikleri Kullanmak balkl Blm 15de zellikler hakknda daha fazlasn reneceksiniz. Dizilerin 0 esinde balad ve son enin de Length 1 olarak numaralandrld, programlamaya yeni balayanlar tarafndan genellikle unutulur. C#, bu konuyu dnmeden dizinin eleri zerinde yineleme yapabilmenize imkan tanyan foreach ifadesini salar. rnein, nceki for ifadesi, foreach ifadesi olarak u ekilde yazlr:
int[] pins = { 9, 3, 7, 2 }; foreach (int pin in pins) { Console.WriteLine(pin); }

foreach ifadesi, dizinin iindeki elerin deerlerini otomatik olarak srayla alan bir yineleme deikeni (bu rnekte, int pin) tanmlar. Bu deikenin tr, dizideki elerin tr ile ayn olmaldr. foreach ifadesi bir dizinin eleri boyunca yineleme yapmak zere kullanlmak iin tercih edilen yntemdir; kodun ifade etmeye alt eyi daha dorudan belirtir ve tm for dngs yapsn kaldrr. Bununla birlikte, baz durumlarda, for ifadesine dnmek zorunda kalabilirsiniz. Bu durumlar unlardr:
n

Bir foreach ifadesi her zaman, bir dizinin btn elerini sonuna kadar yineler. Bir dizinin belirli bir blm boyunca yineleme yapmak istiyorsanz (rnein ilk yarsnda) ya da belirli eleri atlamak istiyorsanz (rnein, her eden birini), for ifadesi kullanmak daha kolaydr. Bir foreach ifadesi her zaman, sfr dizininden Length 1 dizinine kadar yineleme yapar. Geriye doru yineleme yapmak istiyorsanz, bir for ifadesi kullanmak daha kolay olur. Dngnn gvdesinin, enin deerindense enin dizinini bilmesi gerekiyorsa, for ifadesi kullanmalsnz.

Blm 10
n

Dizileri ve Koleksiyonlar Kullanmak

191

Dizinin elerini deitirmeniz gerekiyorsa, for ifadesi kullanmanz gerekir. nk foreach ifadesinin deikeni, dizinin her esinin salt okunur bir kopyasdr.

Yineleme deikenini bir var olarak bildirebilir ve C# derleyicisinin, deikenin trn dizinin elerinin trnden bulmasna izin verebilirsiniz. Bu, zellikle dizi anonim nesneler ierdii zaman olduu gibi, dizideki elerin trn bilmiyorsanz kullanldr. Aadaki rnek, daha nce gsterilmi anonim elere sahip bir dizi boyunca nasl yineleme yapabileceinizi gsterir:
var names = new[] { new { Name = John, Age = 42 }, new { Name = Diana, Age = 43 }, new { Name = James, Age = 15 }, new { Name = Francesca, Age = 13 } }; foreach (var familyMember in names) { Console.WriteLine(Name: {0}, Age: {1}, familyMember.Name, familyMember.Age); }

Dizileri Kopyalamak
Diziler bavuru trleridir. (Bir dizinin System.Array snfnn bir oluumu olduunu hatrlayn.) Bir dizi deikeni, bir dizi oluumuna yaplan bavuruyu ierir. Bunun anlam, bir dizi deikenini kopyaladnzda ayn dizi oluumuna bavuru yapan iki bavuru elde edeceinizdir. rnein:
int[] pins = { 9, 3, 7, 2 }; int[] alias = pins; // alias ve pins ayn dizi oluumuna bavurur

Bu rnekte, pins[1] deerini deitiriyorsanz, deiiklik ayn zamanda alias[1] deerinde de grnr. Bir dizi deikeninin bavurduu dizi oluumunun bir kopyasn oluturmak isterseniz, iki ey yapmanz gerekir. lk olarak, kopyalayacanz dizi ile ayn trde ve ayn uzunlukta yeni bir dizi oluumu yaratmalsnz. rnein:
int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[4];

Bu alr, ama orijinal dizinin uzunluunu deitirmek iin kodu daha sonra dzenlerseniz, kopyann da uzunluunu deitirmeyi unutmamalsnz. Bir dizinin uzunluunu onun Length zelliiyle belirtmek daha iyi olur. rnein:
int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length];

copy deikeni iindeki deerler imdi, varsaylan deerleri olan 0 (sfr) ile (sfrla) balatlmtr.

192

Ksm II

C# Dilini Anlamak

Yapmanz gereken ikinci ey ise, yeni dizinin iindeki deerleri orijinal dizinin iindekilere eitlemektir. Aadaki rnekte gsterildii gibi, bunu bir for ifadesi kullanarak yapabilirsiniz:
int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; for (int i = 0; i < copy.Length; i++) { copy[i] = pins[i]; }

Bir diziyi kopyalamak, birok uygulama iin yaygn bir gereksinimdir; o kadar ki, System.Array snf, kendi kodunuzu yazmak yerine, kullanabileceiniz baz kullanl yntemler salar. rnein, CopyTo yntemi, verilen bir balang dizininden balayarak bir dizinin ieriini dier bir diziye kopyalar.
int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; pins.CopyTo(copy, 0);

Deerleri kopyalamann bir dier yolu, Copy adl System.Array statik yntemini kullanmaktr. CopyTo ynteminde olduu gibi, Copy yntemini armadan nce hedef diziyi balatmanz gerekir.
int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; Array.Copy(pins, copy, copy.Length);

Dier bir yol ise Clone adl System.Array oluum yntemini kullanmaktr. Tmyle bir dizi yaratmak ve bir hareketle kopyalamak iin bu yntemi arabilirsiniz:
int[] pins = { 9, 3, 7, 2 }; int[] copy = (int[])pins.Clone();

Not Clone yntemi gerekte bir object dndrr. Bu nedenle kullandnzda uygun trn dizisine dntrmeniz gerekir. stelik, daha nce kopyalama iin gsterilen tm yntemler, dizinin bir shallow (s) kopyasn yaratr; kopyalanan dizinin eleri bavurular ieriyorsa, for dngs ve nceki yntem, bavurulan nesne yerine bavurular kopyalar. Kopyalamadan sonra, her iki dizi de ayn nesneler kmesine bavurur. Bir dizi gibi, derin kopyalama gerekirse, bir for dngsnde uygun kodu kullanmanz gerekir.

Koleksiyon Snflar Nedir?


Diziler, ayn trdeki eleri bir araya getirmek iin iyi bir yntemdir ama tek yntem deildir. Microsoft .NET Framework, eleri zel yollardan bir araya toplayan birka snf salar. Bunlar koleksiyon snflardr ve System.Collections ad alan ve alt ad alanlarnda bulunurlar.

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

193

Temel koleksiyon snflar, elerini nesne olarak tutar, alr ve dndrrler; yani, koleksiyon snfnn e tr objecttir. Bunun altnda yatanlar anlamak iin, int elerden oluan bir diziyle (int bir deer trdr), nesnelerden oluan bir diziyi (nesne bir bavuru trdr) karlatrmak yararl olur. int bir deer tr olduundan, int deikenlerden oluan bir dizi, aada gsterildii gibi, dorudan int deerler tutar:

imdi, dizi, nesnelerden oluan bir dizi olsayd neler olacan dnn. Bu diziye de int deerler ekleyebilirsiniz (aslnda, ona istediiniz trde deerler ekleyebilirsiniz). Bir tamsay deer eklediinizde, otomatik olarak kutulanr ve dizi esi (bir nesne bavurusu) tamsay deerin kutulanm kopyasna bavurur (kutulama hakknda bilgileri hatrlamak iin Blm 8e bakn.) Bu durum, aadaki resimde gsterilmitir:

Bu blmde gsterilen tm koleksiyon snflarnn e tr nesnedir (object). Bunun anlam, bir koleksiyona bir deer eklediinizde, deer her zaman kutulanr. Koleksiyondan bir deer karrsanz bir dntrme kullanarak onun kutusunu amalsnz. Aadaki blmler en nemli drt koleksiyon snf hakknda genel bir bak sunmaktadr. Her bir snf hakknda daha ayrntl bilgi iin, Microsoft .NET Framework Snf Ktphanesi belgelerine bavurun. Not e tr, her zaman object (nesne) olmayan ve bavurular kadar deer trlerini de

tutabilen koleksiyon snflar vardr, fakat bunlar hakknda konumadan nce C#da daha fazla bilgiye sahip olmalsnz. Bu koleksiyon snflar ile Genellemelere Giri balkl Blm 18de tanacaksnz.

194

Ksm II

C# Dilini Anlamak

ArrayList Koleksiyon Snf


ArrayList bir dizideki elerin sralarn kaydrmak iin yararl bir snftr. Sradan bir dizinin olduka snrlayc olabildii belirli olaylar vardr:
n

Bir diziyi yeniden boyutlandrmak isterseniz, yeni bir dizi yaratmanz, eleri kopyalamanz (yeni dizi daha kkse baz eleri atlayarak) ve daha sonra dizi bavurularn gncelletirmeniz gerekir. Bir diziden bir eyi karmak isterseniz, o eden sonraki tm eleri bir adm kaydrmalsnz. Bu tam olarak almaz, nk son enin iki kopyasyla kar karya kalrsnz. Bir diziye bir e eklemek isterseniz, bo bir yer yaratmak iin btn eleri bir adm kaydrmanz gerekir. Fakat son eyi kaybedersiniz!

ArrayList snfnn kstlamalarnn stesinden gelmek iin aadakileri yapabilirsiniz:


n

Bir ArrayListden bir eyi Remove yntemini kullanarak kaldrabilirsiniz. ArrayList eleri kaydrma iini otomatik olarak halleder. Bir ArrayListin sonuna Add yntemini kullanarak bir e ekleyebilirsiniz. Yalnzca eklenecek eyi salamanz yeterlidir. ArrayList kendi uzunluunu bilir ve gerekirse kendini yeniden boyutlandrr. Bir ArrayListin ortasna Insert yntemini kullanarak bir e ekleyebilirsiniz. Yine, gerekirse kendini yeniden boyutlandrr. Keli parantez iinde dizi esinin dizinini yazarak, bir ArrayList nesnesindeki bir eye bavurabilirsiniz.

Not Dizilerde olduu gibi, bir ArrayListte yineleme yapmak iin foreach ifadesini kullanrsanz, ArrayList ieriini deitirmek iin yineleme deikeni kullanamazsnz. Ayrca, bir ArrayList boyunca yinelenen bir foreach dngsnde Remove, Add ya da Insert yntemini aramazsnz. te ArrayListi kullanarak konsola 10dan 1e kadar olan saylar nasl yazdracanza bir rnek:
using System; using System.Collections; ... ArrayList numbers = new ArrayList(); ... // ArrayListi doldur foreach (int number in new int[12]{10, 9, 8, 7, 7, 6, 5, 10, 4, 3, 2, 1}) { numbers.Add(number); } ...

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

195

// listede sondan bir nceki sraya bir e gir ve sondaki eyi yukar ta // (ilk parametre konum; // ikinci parametre eklenen e) numbers.Insert(numbers.Count-1, 99); // deeri 7 olan ilk eyi kaldr (4. e, dizin 3) numbers.Remove(7); // imdi 7. e olan eyi kaldr, dizin 6 (10) numbers.RemoveAt(6); ... // bir for ifadesi kullanarak geri kalan 10 ede yineleme yap for (int i = 0; i < numbers.Count; i++) { int number = (int)numbers[i]; // deerin kutulamasn kaldran dntrmeyi gr Console.WriteLine(number); } ... // iterate remaining 10 using a foreach statement foreach (int number in numbers) // dntrme gerekmez { Console.WriteLine(number); }

Bu kodun kts yledir:


10 9 8 7 6 5 4 3 2 99 1 10 9 8 7 6 5 4 3 2 99 1

Not Bir ArrayListdeki e saysn hesaplama yolu, bir dizideki elerin saysn sorgulamaktan farkldr. Bir ArrayList kullandnzda Count zelliini, bir dizi kullandnzda ise Length zelliini sorgularsnz.

196

Ksm II

C# Dilini Anlamak

Queue Koleksiyon Snf


Queue (Kuyruk) snf, klasik ilk giren ilk kar (first-in first-out, FIFO) mekanizmasn gerekletirir. Bir e sraya arkadan katlr (enqueue ilemi) ve sray nden terk eder (dequeue ilemi). te kuyruk ve ilemlerinin bir rnei:
using System; using System.Collections; ... Queue numbers = new Queue(); ... // kuyruu doldur foreach (int number in new int[4]{9, 3, 7, 2}) { numbers.Enqueue(number); Console.WriteLine(number + has joined the queue); } ... // kuyruk boyunca yinele foreach (int number in numbers) { Console.WriteLine(number); } ... // kuyruu boalt while (numbers.Count > 0) { int number = (int)numbers.Dequeue(); // deerin kutulamasn kaldrmak iin gerekli dntrme Console.WriteLine(number + has left the queue); }

Bu kodun kts yledir:


9 3 7 2 9 3 7 2 9 3 7 2 has has has has joined joined joined joined the the the the queue queue queue queue

has has has has

left left left left

the the the the

queue queue queue queue

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

197

Stack Koleksiyon Snf


Stack (yn) snf, klasik son giren ilk kar (last-in first-out, LIFO) mekanizmasn gerekletirir. Bir e yna stten katlr (push ilemi) ve yn yine stten terk eder (pop ilemi). Bunu gznzde canlandrabilmek iin tabak ynn dnn: Yeni tabaklar ste konulur ve tabaklar yine stten alnr. (Alttaki tabaklar ok nadir kullanldndan tozlanr ve bu nedenle tabaa bir yemek koymadan nce ykamanz gerekir!) te bir rnek:
using System; using System.Collections; ... Stack numbers = new Stack(); ... // yn doldur foreach (int number in new int[4]{9, 3, 7, 2}) { numbers.Push(number); Console.WriteLine(number + has been pushed on the stack); } ... // yn boyunca yinele foreach (int number in numbers) { Console.WriteLine(number); } ... // yn boalt while (numbers.Count > 0) { int number = (int)numbers.Pop(); Console.WriteLine(number + has been popped off the stack); }

Program kts u ekildedir:


9 3 7 2 2 7 3 9 2 7 3 9 has has has has been been been been pushed pushed pushed pushed on on on on the the the the stack stack stack stack

has has has has

been been been been

popped popped popped popped

off off off off

the the the the

stack stack stack stack

198

Ksm II

C# Dilini Anlamak

Hashtable Koleksiyon Snf


Dizi ve ArrayList trleri, bir eye bir tamsay dizini balamay etkili bir biimde baarrlar. Tamsay bir dizini keli parantez iinde salarsnz (rnein, [4]) ve dizin 4teki eyi elde edersiniz (aslnda beinci edir). Bununla birlikte, bazen int tr dnda string, double ya da Time trlerine balama yapmak istersiniz. Dier programlama dillerinde, buna ou kez associative array (birleim dizisi) ad verilir. Hashtable (Kark masa) snf, biri baladnz anahtarlar dieri de balamakta olduunuz deerleri ieren iki nesne dizisi sunarak bu ilevsellii salar. Bir Hashtablea bir anahtar/deer ifti eklediinizde, hangi anahtarn hangi deere ait olduunu takip eder ve belirlenen anahtar ile ilikilendirilmi deeri hzlca ve kolayca elde edebilmenizi salar. Hashtable snf tasarmnn baz nemli sonular vardr:
n

Hashtable, ayn anahtardan iki tane ieremez. Anahtarlar dizisinde mevcut olan bir anahtar eklemek iin Add yntemini arrsanz, bir zel durum elde edersiniz. Bununla birlikte, bir anahtar/deer iftini eklemek iin keli parantez kullanrsanz (aadaki rnekte gsterilmitir), zel durum ile karlamazsnz. ContainsKey (Anahtarerir) yntemini kullanarak Hashtablen belirli bir anahtar ierip iermediini test edebilirsiniz. Bir Hashtable, almak iin bol miktarda bellee sahip olduunda en iyi ekilde alan seyrek veri yapsdr. Bellekteki Hashtable boyutu, siz yeni eler ekledike, olduka hzl byyebilir. Bir Hashtable boyunca yineleme yapmak iin bir foreach ifadesi kullandnzda, bir DictionaryEntry (SzlkGiri) elde edersiniz. DictionaryEntry snf, Key zellii ve Value zellikleri ile her iki diziye de eriim salar.

Kii adlar ve yalarn ilikilendiren ve daha sonra bilgiyi yazdran bir rnek aadadr:
using System; using System.Collections; ... Hashtable ages = new Hashtable(); ... // Hashtable doldur ages[John] = 42; ages[Diana] = 43; ages[James] = 15; ages[Francesca] = 13; ... // foreach ifadesi boyunca yinele // Yineleyici key/value iftini ieren DictionaryEntry nesnesini oluturur foreach (DictionaryEntry element in ages) { string name = (string)element.Key; int age = (int)element.Value; Console.WriteLine(Name: {0}, Age: {1}, name, age); }

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

199

Bu programn kts yledir:


Name: Name: Name: Name: James, Age: 15 John, Age: 42 Francesca, Age: 13 Diana, Age: 43

SortedList Koleksiyon Snf


SortedList (SralListe) snf, Hashtable snfna olduka benzerdir. SortedList snfn kullanarak da anahtarlar, deerlerle ilikilendirebilirsiniz. Balca farkllk anahtarlar dizisinin her zaman sralanm olmasdr. Bir SortedList snfna bir anahtar/deer ifti eklediinizde, anahtar, anahtarlar dizisinin sralamasn bozmamak iin doru dizine eklenir. Daha sonra, deer de ayn dizinli deerler dizisine eklenir. SortedList snf, bir e eklediinizde ya da bir eyi kaldrdnzda, otomatik olarak anahtarlar ve deerleri e zamanl hale getirir. Bu da, anahtar/deer iftlerini SortedListe istediiniz srada ekleyebileceiniz anlamna gelir; her zaman anahtarlara gre sralanrlar. Hashtable snfnda olduu gibi, bir SortedList, ayn anahtardan iki tane ieremez. Bir SortedList boyunca yineleme yapmak iin bir foreach ifadesi kullandnzda, bir DictionaryEntry (SzlkGiri) elde edersiniz. Bununla birlikte, DictionaryEntry nesneleri Key zellii tarafndan sralanm olarak dner. Kii adlar ve yalarn ilikilendiren ve daha sonra bilgiyi yazdran rnek aadadr; bu defa bir SortedList kullanlmtr:
using System; using System.Collections; ... SortedList ages = new SortedList(); ... // SortedListi doldur ages[John] = 42; ages[Diana] = 43; ages[James] = 15; ages[Francesca] = 13; ... // foreach ifadesi boyunca yinele // yineleyici key/value iftini ieren DictionaryEntry nesnesini oluturur foreach (DictionaryEntry element in ages) { string name = (string)element.Key; int age = (int)element.Value; Console.WriteLine(Name: {0}, Age: {1}, name, age); }

200

Ksm II

C# Dilini Anlamak

Bu programn ktsnda adlar alfabetik olarak sralanmtr:


Name: Name: Name: Name: Diana, Age: 43 Francesca, Age: 13 James, Age: 15 John, Age: 42

Koleksiyon Balatclarn Kullanmak


nceki alt blmlerdeki rnekler, bir koleksiyona, o koleksiyon iin en uygun yntemi (ArrayList iin Add, Queue iin Enqueue, Stack iin Push ve bunun gibi) kullanarak tek tek eleri nasl ekleyeceinizi gsterir. Ayrca, diziler tarafndan desteklenen szdizimine olduka benzer bir szdizimi kullanarak, baz koleksiyon trlerini bildirirken ayn zamanda balatabilirsiniz. rnein, aadaki ifade, daha nce gsterilen numbers ArrayList dizisini yaratr ve balatr. Srekli olarak Add yntemi armaya bir alternatiftir:
ArrayList numbers = new ArrayList(){10, 9, 8, 7, 7, 6, 5, 10, 4, 3, 2, 1};

C# derleyicisi, aslnda bu balatmay seri olarak Add ynteminin arlmasna dntrr. Sonu olarak, bu szdizimini sadece Add yntemini destekleyen koleksiyonlar iin kullanabilirsiniz. (Stack ve Queue snflar desteklemez.) Hashtable gibi, anahtar/deer ifti alan daha karmak koleksiyonlar iin, aadaki gibi, her anahtar/deer iftini balatc listesinde anonim tr olarak belirleyebilirsiniz:
Hashtable ages = new Hashtable(){{John, 42}, {Diana, 43}, {James, 15}, {Francesca, 13}};

Her iftteki ilk e anahtar, ikincisi ise deerdir.

Dizileri ve Koleksiyonlar Karlatrmak


Diziler ve koleksiyonlar arasndaki nemli farklar unlardr:
n

Bir dizi, tuttuu enin trn tanmlarken bir koleksiyon bunu yapmaz. Bunun nedeni, koleksiyonlarn elerini nesne olarak tutmalardr. Bir dizi oluumunun boyutu sabittir ve ne byyebilir ne de klebilir. Bir koleksiyon gerektiinde kendini dinamik olarak yeniden boyutlandrabilir. Bir dizi ok boyutlu olabilir. Bir koleksiyon ise dorusaldr.

Not Bir koleksiyondaki eler, dier koleksiyonlarda olabilir. Baka koleksiyonlar ieren bir koleksiyon biraz kafa kartrmakla birlikte, ok boyutlu bir diziyi taklit etmenize olanak tanr.

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

201

Kart Oyunu Oynamak in Koleksiyon Snflarn Kullanmak


Aadaki altrma, bir deste oyun kadn drt oyuncuya datmay gerekletiren bir Microsoft Windows Presentation Foundation (WPF) uygulamasn gstermektedir. Kartlar destede olabilir ya da oyunculara datlm olabilir. Kart destesi ve oyuncularn ellerindeki kartlar ArrayList nesneleri olarak oluturulur. Bunlarn bir dizi olarak oluturulmas gerektiini dnebilirsiniz; sonuta, her zaman bir destede 52 kart ve oyuncunun elinde 13 kart vardr. Bu doru, ama genelde gzden kaan, kartlar oyunculara dattnzda, destede kart kalmayacaktr. Kart destesi iin bir dizi kullanrsanz, dizideki ka araln bir PlayingCard (OyunKart) tuttuunu ve ka tanesinin oyunculara datldn kaydetmek zorunda kalrsnz. Benzer ekilde, oyuncularn elindeki kartlar desteye geri aldnzda, oyuncunun elini gsteren dizideki hangi aralklarda PlayingCard olmadn da kaydetmeniz gerekir. nce kodu inceleyecek ve alacak, daha sonra iki yntem yazacaksnz: Biri bir deste kart kartracak, dieri ise eldeki kartlar desteye geri dndrecek.

Kartlar datn
1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 10\Cards klasrndeki Cards projesini an. 3. Debug mensnde, Start Without Debuggingi tklayn. Visual Studio 2008 program oluturur ve altrr. Form, drt oyuncunun elindeki kartlar (Kuzey, Gney, Bat ve Dou) grntler. Ayrca iki dme vardr: biri kartlar datmak ve dieri de kartlar desteye dndrmek iin. 4. Formdaki Deal dmesini tklayn. Destedeki 52 kart, aada gsterildii gibi, her oyuncuya 13 adet olacak biimde datlr:

Grdnz gibi, kartlar karmam. Bir sonraki altrmada Shuffle yntemini uygulayacaksnz.

202

Ksm II

C# Dilini Anlamak

5. Return to Pack dmesini tklayn. Hibir deiiklik olmaz. nk henz kartlar desteye dndrecek yntem yazlmad. 6. Tekrar Deal dmesini tklayn. Bu defa, eldeki kartlar yok olur. nk kartlar datlmadan nce, her el sfrlanr. Destede hi kart olmadndan (kartlar desteye dndren yntem henz yazlmad), datlacak kart yoktur. 7. Visual Studio 2008 programlama ortamna dnmek iin formu kapatn. imdi bu uygulamada nelerin eksik olduunu bildiinize gre, bu ksmlar ekleyeceksiniz.

Desteyi kartrn
1. Code and Text Editor penceresinde Pack.cs dosyasn grntleyin. 2. Kodu inceleyin. Pack snf, kartlarn destesini gsterir. cards adnda bir zel ArrayList alan ierir. Ayrca, Pack snfnn, bir ArrayList yaratan ve bu snf tarafndan tanmlanm Accept yntemini kullanarak ArrayListe 52 oyun kartn ekleyen bir kurucuya sahip olduuna dikkat edin. Bu snftaki yntemler (Shuffle, Deal), bir deste kart zerinde gerekletirmek isteyebileceiniz tipik ilemleri oluturur. 3. Code and Text Editor penceresinde, PlayingCard.cs dosyasn grntleyin. Oyun kartlar, PlayingCard snf ile gsterilir. Oyun kart iki alana yaylmtr: suit (grup) (numaralandrlm trdr ve Clubs (Sinek), Diamonds (Karo), Hearts (Kupa) ya da Spades (Maa) grubundan biridir) ve pips (say) (kartn deerini gsterir). 4. Pack.cs dosyasnda, Pack snfnn Shuffle yntemini bulun. Yntem henz gelitirilmemitir. Bir deste kart kartrma ilemini gerekletirecek birok yntem vardr. Belki de en kolay sradan bir kart seip onu rastgele bir kartla deitirmektir. .NET Framework imdi rastgele tamsaylar retmek iin kullanacanz Random (Rastgele) adl bir snf ierir. 5. random adl Random trnde bir yerel deiken tanmlayp varsaylan Random kurucusunu kullanarak onu yeni yaratlm bir Random nesnesine balatn. Shuffle yntemi imdi tam olarak aadaki gibi grnmelidir:
public void Shuffle() { Random random = new Random(); }

6. Bir int tr i deikeninin deerini 0dan kartlarn ArrayListinin e saysna kadar ilerleten bir for ifadesi ekleyin:

Blm 10
public void Shuffle() { Random random = new Random(); for (int i = 0; i < cards.Count; i++) { } }

Dizileri ve Koleksiyonlar Kullanmak

203

Bir sonraki adm 0 ile cards.Count 1 arasnda rastgele bir dizin semektir. Daha sonra i dizinindeki kartla bu rastgele dizindeki kart deitireceksiniz. Random.Next oluum yntemini ararak rastgele bir tamsay retebilirsiniz. Parametre olarak Random.Next yntemine bir st snr belirleyebilirsiniz. Burada for ifadesi kullanmak zorunda olduunuza dikkat edin. foreach ifadesi almayacaktr; nk ArrayListdeki elerin her birini deitirmeniz gerekir ve foreach dngs sadece salt okunur eriim salar. 7. for ifadesinin iinde, cardToSwap adnda bir yerel deiken bildirin ve aada koyu harflerle gsterildii gibi, deikene balang deeri olarak 0 ile cards.Count 1 arasnda rastgele bir say atayn:
public void Shuffle() { Random random = new Random(); for (int i = 0; i < cards.Count; i++) { int cardToSwap = random.Next(cards.Count - 1); } }

Son adm, i dizinindeki kartla cardToSwap dizinindeki kart deitirmektir. Bunun iin, geici yerel bir deiken kullanmanz gerekir. 8. i dizinindeki kartla cardToSwap dizinindeki kart deitirmek iin ifade ekleyin. Bir koleksiyon snf (ArrayList gibi) iindeki elerin object trnde olduunu hatrlayn. Ayrca, bir ArrayListde var olan elere erimek iin kurall dizi gsterimini (keli parantez ve bir dizin) kullanabileceinize de dikkat edin. Shuffle yntemi imdi tam olarak aadaki gibi grnmelidir (yeni ifadeler koyu harflerle gsterilmitir):
public void Shuffle() { Random random = new Random(); for (int i = 0; i < cards.Count; i++) { int cardToSwap = random.Next(cards.Count - 1); object temp = cards[i]; cards[i] = cards[cardToSwap]; cards[cardToSwap] = temp; } }

204

Ksm II

C# Dilini Anlamak

9. Debug mensnde, Start Without Debuggingi tklayn. 10. Form zerinde Deal tklayn. Bu defa deste, datlmadan nce kartrlr. (Ekrannz her seferinde biraz farkl grnebilir, nk kart sras rasgeledir.)

11. Formu kapatn. Son adm, kartlar desteye geri dndrecek kodu yazmaktr.

Kartlar desteye geri tayn


1. Code and Text Editor penceresinde, Hand.cs dosyasn grntleyin. Hand snfnda da, oyuncunun elindeki kartlar gsteren, cards adnda bir ArrayList vardr. Buradaki temel dnce, her kartn herhangi bir anda, ya destede ya da oyuncunun elinde olmasdr. 2. Hand snfndaki ReturnCardsTo yntemini bulun. Pack snfnn Accept adnda, PlayingCard trnde tek bir parametre alan bir yntemi vardr. Oyuncularn ellerindeki kartlar tek tek elden geiren ve kartlar desteye dndren bir dng yaratmanz gerekir. 3. Aada koyu harflerle gsterildii gibi, ReturnCardsTo yntemini tamamlayn:
public void ReturnCardsTo(Pack pack) { foreach (PlayingCard card in cards) { pack.Accept(card); } cards.Clear(); }

Blm 10

Dizileri ve Koleksiyonlar Kullanmak

205

Burada foreach ifadesini kullanmak uygundur, nk elere yazma hakk ve elerin dizinini bilmeniz gerekmiyor. Clear (Temizle) yntemi, bir koleksiyondan tm eleri kaldrr. Kartlar desteye tadktan sonra cards.Clear yntemini armak nemlidir, bylece kartlar hem destede hem de oyuncunun elinde olmazlar. ArrayList snfnn Clear yntemi, ArrayList ieriini boaltr. 4. Debug mensnde, Start Without Debuggingi tklayn. 5. Form zerinde Deal tklayn. Kartrlm kartlar daha nce olduu gibi drt oyuncuya datlr. 6. Return to Packi tklayn. Oyuncularn elleri temizlenir. Kartlar imdi yeniden destelenir. 7. Tekrar Deal tklayn. Kartrlm kartlar yeniden drt oyuncuya datlr. 8. Formu kapatn. Not Return to Packi tklamadan, iki defa Deal dmesini tklarsanz, tm kartlar kaybedersiniz. Gerek dnyada, Return to Pack dmesi tklanana kadar Deal dmesini etkisiz hale getirmelisiniz. Windows Uygulamalar ile almak balkl Ksm IVde, C# kullanarak, kullanc arayzn deitiren bir kod yazacaz. Bu blmde, veri kmesini ilemek iin dizileri nasl yaratacanz ve kullanacanz rendiniz. Ayrca, farkl yntemlerde bellekte veriyi saklamak ve bellekteki veriye erimek iin baz yaygn koleksiyon snflarnn nasl kullanldn grdnz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i alr durumda brakn ve Blm 11e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

206

Ksm II

C# Dilini Anlamak

Blm 10 Hzl Bavuru


Bunun in
Bir dizi deikeni bildirmek

unu Yapn
e trnn adn yazn, ardndan keli parantez ve deikenin adn yazp noktal virgl ekleyin. rnein:
bool[] flags;

Bir dizinin oluumunu yaratmak

new anahtar szcn yazn, ardndan e trnn adn ekleyip dizinin boyutunu keli parantez iinde yazn. rnein:
bool[] flags = new bool[10];

Bir dizinin (ya da Add yntemini destekleyen bir koleksiyonun) elerine balang deeri olarak zel deerler atamak.

Dizi iin, zel deerleri virglle ayrlm biimde parantez iinde yazn. rnein:
bool[] flags = { true, false, true, false };

Bir koleksiyon iin, new ilecini kullann ve virglle ayrlm biimde zel deerle koleksiyon trn yazn. rnein:
ArrayList numbers = new ArrayList(){10, 9, 8, 7, 6, 5};

Bir dizideki e saysn bulmak

Length zelliini kullann. rnein:


int [] flags = ...; ... int noOfElements = flags.Length;

Bir koleksiyondaki e saysn bulmak.

Count zelliini kullann. rnein:


ArrayList flags = new ArrayList(); ... int noOfElements = flags.Count;

Tek bir dizi esine erimek

Dizi deikeninin adn yazn, ardndan keli parantez iinde dizin tamsaysn yazn. Unutmayn, dizi dizinleri 0dan balar, 1den deil. rnein:
bool initialElement = flags[0];

Bir dizi/koleksiyon eleri boyunca yineleme yapmak.

Bir for ifadesi ya da bir foreach ifadesi kullann. rnein:


bool[] flags = { true, false, true, false }; for (int i = 0; i < flags.Length; i++) { Console.WriteLine(flags[i]); } foreach (bool flag in flags) { Console.WriteLine(flag); }

Blm 11

Parametre Dizilerini Anlamak


Bu blm tamamladktan sonra renecekleriniz:
n

params anahtar szcn kullanarak herhangi bir sayda bamsz deiken alabilen bir yntem yazmak. params anahtar szcn object tr ile birlikte kullanarak herhangi bir trdeki herhangi bir sayda bamsz deiken alabilen bir yntem yazmak

Parametre olarak herhangi bir sayda, mmkn olduunda farkl trlerde bamsz deikenler alabilen yntemler yazmak isterseniz, parametre dizileri kullanldr. Nesneynelimli kavramlarna aina iseniz, bu cmle sizde hayal krkl yaratm olabilir. Neticede, bu problemi zmek iin nesne-ynelimli yaklam, ar yklenmi yntemleri tanmlamaktr. Ar Ykleme (Overloading), ayn kapsamda ayn adla iki ya da daha ok sayda yntem bildirmenin teknik terimidir. Bir ynteme ar ykleme yapmak, farkl trlerde bamsz deikenler zerinde ayn eylemi gerekletirmek istediiniz baz durumlarda ok yararldr. Microsoft Visual C#daki klasik ar ykleme rnei, Console.WriteLinedr. WriteLine yntemine ok sayda ar ykleme yaplmtr bylece bu ynteme herhangi bir temel tr geirebilirsiniz:
class Console { public static void WriteLine(int parameter) ... public static void WriteLine(double parameter) ... public static void WriteLine(decimal parameter) ... }

Ar ykleme ilemi ne kadar yararl olursa olsun, btn durumlar kapsamaz. zellikle, ar ykleme, deienin parametrelerin trleri deil saylar olduu durumlar ok kolay ileyemez. rnein, ya birok deeri konsola yazmak isterseniz? Her deer iin, bir ncekinden bir fazla parametre alan Console.WriteLine srmn armanz m gerekir? Bu, ksa srede can skc bir hal alr. Ve bu kadar ok yinelenen tm bu ar yklenmi yntemler sizi endielendirmiyor mu? Endielendirmeli. Neyse ki, deien saylarda bamsz deiken alan bir yntem yazmann bir yolu var (variadic yntem): Bir parametre dizisi kullanabilirsiniz (params anahtar szc ile bildirilmi bir parametre). params dizilerinin bu sorunu nasl zdklerini grmeden nce basit dizilerin yararlarn ve eksik ynlerini grmek daha yararl olacaktr.
207

208

Ksm II

C# Dilini Anlamak

Dizi Bamsz Deikenlerini Kullanmak


Parametre olarak geirilmi bir deer kmesindeki minimum deeri hesaplamak iin bir yntem yazmak istediinizi varsayn. Bunun bir yolu bir dizi kullanmak olacaktr. rnein, belirli bir sayda int deerin en kn bulmak iin, Min adl int deerlerden oluan bir dizi biiminde tek bir parametresi olan bir statik yntem yazabilirsiniz:
class Util { public static int Min(int[] paramList) { if (paramList == null || paramList.Length == 0) { throw new ArgumentException(Util.Min: not enough arguments); } int currentMin = paramList [0]; foreach (int i in paramList) { if (i < currentMin) { currentMin = i; } } return currentMin; } }

Not ArgumentException snf, bamsz deikenler yntemin gereksinimlerini karlamazsa, yntem tarafndan atanmas iin zel olarak tasarlanmtr. ki int deerden en kn bulmak iin Min yntemini kullanmak zere aadakileri yazarsnz:
int[] array = new int[2]; array[0] = first; array[1] = second; int min = Util.Min(array);

Ve int deerden en kn bulmak iin Min yntemini kullanmak zere ise aadakileri yazarsnz:
int[] array = new int[3]; array[0] = first; array[1] = second; array[2] = third; int min = Util.Min(array);

Bu zmn ok sayda ar ykleme kullanmn engellediini grebilirsiniz, ama bunu ok pahalya yapar: ynteme geen diziyi yerletirmek iin ek kod yazmanz gerekir. Bununla birlikte, bir params dizisi bildirmek iin params anahtar szcn kullanarak kodun bir ksmn derleyicinin sizin iin yazmasn salayabilirsiniz.

Blm 11

Parametre Dizilerini Anlamak

209

Bir params Dizisi Bildirmek


Bir dizi parametresi dzenleyicisi olarak, params anahtar szcn kullanrsnz. rnein, aada, dizi parametresi bir params dizisi olarak bildirilmi biimde yine Min yntemini grebilirsiniz:
class Util { public static int Min(params int[] paramList) { // kod tam olarak nceki gibi } }

Min yntemindeki params anahtar szcnn etkisi udur; onu istediiniz sayda tamsay bamsz deiken kullanarak arabilirsiniz. rnein, iki tamsay deerin en kn bulmak iin unu yazabilirsiniz:
int min = Util.Min(first, second);

Derleyici bu kodu aadaki koda evirir:


int[] array = new int[2]; array[0] = first; array[1] = second; int min = Util.Min(array);

tamsay deerin en kn bulmak iinse, aadaki kodu yazarsnz. Bu kod da derleyici tarafndan bir diziyi kullanan uygun koda evrilir:
int min = Util.Min(first, second, third);

Min yntemine yaplan her iki ar da (biri iki bamsz deiken, dieri de bamsz deiken ile), params anahtar szc ile ayn Min yntemine ayrtrlr. Ve tahmin edebileceiniz gibi, bu Min yntemini herhangi bir sayda int bamsz deikeniyle arabilirsiniz. Derleyici, int bamsz deikenlerini sayar ve o boyutta bir int dizisi yaratr, diziyi bamsz deikenlerle doldurur ve daha sonra da tek dizi parametresini geirerek yntemi arr. Not C ve C++ ile program gelitirenler, params st bilgi dosyas olan stdarg.hdeki varargs
makrosunun yazm hatasndan arndrlm denklii gibi alglayabilirler.

Params dizileri hakknda belirtilmesi gereken birka nokta vardr:


n

params anahtar szcn ok boyutlu dizilerde kullanamazsnz. Aadaki kod derlenmez:


// derleme zaman hatas public static int Min(params int[,] table) ...

210

Ksm II
n

C# Dilini Anlamak

Yalnzca params anahtar szcn temel alarak ar ykleme yapamazsnz. params anahtar szc, yntemin imzasnn bir parasn oluturmaz. rnein:
// derleme zaman hatas: ift bildirim public static int Min(int[] paramList) ... public static int Min(params int[] paramList) ...

Aadaki rnekte gsterildii gibi, params dizileri ile ref ya da out dzenleyicisini belirleyemezsiniz:
// derleme zaman hatas public static int Min(ref params int[] paramList) ... public static int Min(out params int[] paramList) ...

Bir params dizisi son parametre olmaldr. (Bu, her yntemde yalnzca bir params dizisi bulunabilecei anlamna gelir). Aadaki rnei dnn:
// derleme zaman hatas public static int Min(params int[] paramList, int i) ...

params iermeyen bir yntem her zaman bir params yntemine gre nceliklidir. Bunun anlam, isterseniz, yaygn durumlar iin yntemin ar yklenmi srmn de yaratabilirsiniz. rnein:
public static int Min(int leftHandSide, int rightHandSide) ... public static int Min(params int[] paramList) ...

Min ynteminin ilk srm, iki int bamsz deikeni kullanarak ardnz zamanki yntemdir. Baka sayda int bamsz deikenleri uygulanrsa ikinci srm kullanlmtr. Bu, yntemin hibir bamsz deiken almadan arld zaman da kapsar. params iermeyen dizi yntemini eklemek yararl bir iyiletirme teknii olabilir nk derleyicinin onca diziyi oluturup doldurmas gerekmez.
n

Derleyici her trl potansiyel pheli ar yklemeyi fark edip reddeder. rnein, aadaki iki Min yntemi phelidir: iki int bamsz deikeni geirdiinizde hangisinin arld ok ak olmaz:
// derleme zaman hatas public static int Min(params int[] paramList) ... public static int Min(int, params int[] paramList) ...

Blm 11

Parametre Dizilerini Anlamak

211

params object[ ] Kullanmak


int tr bir parametre dizisi olduka yararldr nk bir yntem arsnda herhangi bir sayda int bamsz deikeni kullanmna izin verir. Bununla birlikte, yalnzca bamsz deikenlerin says deil trleri de deiirse ne olacak? C#da bu sorunu zmenin bir yolu vardr. Teknik, nesnenin tm snflarn kk olmas ve derleyicinin, Blm 8de anlatld gibi kutulamay kullanarak, deer trlerini (snf olmayan eyler) nesnelere dntren kodu retebilmesine dayanr. Herhangi bir trde bamsz deiken gemesine olanak salayan, herhangi bir sayda object bamsz deikeni kabul eden bir yntem bildirmek iin object tr bir parametreler dizisi kullanabilirsiniz. u rnee bakn:
class Black { public static void Hole(params object [] paramList) ... }

Bu kodu, yalnzca her bamsz deikeni yuttuu iin deil ayn zamanda hibir bamsz deiken ondan kamad iin Black.Hole (Kara.Delik) olarak adlandrdk:
n

Bu ynteme hibir bamsz deiken geirmeyebilirsiniz; bu durumda derleyici, uzunluu 0 olan bir nesne dizisi geirir:
Black.Hole(); // Black.Hole(new object[0])e dntrld;

pucu Uzunluu 0 olan bir dizide foreach dngs ile ilerlemek gvenlidir.
n

Bu yntemi, bamsz deiken olarak null geirerek arabilirsiniz. Bir dizi bavuru trndedir; bu yzden bir diziyi null olarak balatabilirsiniz:
Black.Hole(null);

Bu ynteme, gerek bir dizi geirebilirsiniz. Dier bir deyile, normalde derleyicinin oluturaca diziyi kendiniz oluturabilirsiniz:
object[] array = new object[2]; array[0] = "forty two"; array[1] = 42; Black.Hole(array);

Bu ynteme herhangi baka bir bamsz deikeni geirebilirsiniz ve geirdiiniz bu bamsz deikenler otomatik olarak bir object dizisinin iine atlr:
Black.Hole("forty two", 42); //Black.Hole(new object[]{"forty two", 42})e dntrld;

212

Ksm II

C# Dilini Anlamak

Console.WriteLine Yntemi
Console snfnda WriteLine yntemi iin ok sayda ar ykleme vardr. Bu ar yklemelerden biri aadaki gibi grnr:
public static void WriteLine(string format, params object[] arg);

Bu ar ykleme, WriteLine ynteminin, her biri alma zamannda herhangi bir tr deer ile deitirilebilen yer tutucular ieren, bir biim dize bamsz deikenini desteklemesini salar. nceki blmlerde birka defa grdnz, bu ynteme yaplabilecek arlara bir rnek aadadr:
Console.WriteLine(Name:{0}, Age:{1}, name, age);

Derleyici bu kodu aadaki koda evirir:


Console.WriteLine(Name:{0}, Age:{1}, new object[2]{name, age});

Bir params Dizisi Kullanmak


Aadaki altrmada, Util.Sum adnda bir static yntem yazacak ve test edeceksiniz. Bu yntemin amac, kendisine geirilen int tr deikenlerin toplam saysn hesaplamak, sonucu int olarak dndrmektir. Bunu, Util.Sum yntemini params int[ ] parametresi alacak ekilde yazarak yapacaksnz. Util.Sum ynteminin salamlndan emin olmak iin params parametresi zerinde iki denetim gerekletireceksiniz. Daha sonra, test etmek iin deiik sayda bamsz deiken kullanarak Util.Sum yntemini arn.

Bir params dizisi yntemi yazn


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 11\ ParamArrays klasrnde yer alan ParamsArray projesini an. 3. Code and Text Editor penceresinde Util.cs dosyasn an. Util.cs dosyas, ParamsArray ad alannda Util adnda bo bir snf ierir. 4. Util snfna, Sum (Toplam) adl bir public statik yntem ekleyin. Sum yntemi, bir int dndrr ve int deerlerden oluan bir params dizisi alr. Sum yntemi u ekilde grnmelidir:
public static int Sum(params int[] paramList) { }

Sum yntemini gelitirmenin ilk adm paramList parametresini denetlemektir. Geerli bir tamsay kmesi iermesinin dnda, null da olabilir, sfr uzunluunda da olabilir. Her iki durumda da, toplam hesaplamak zordur, bu nedenle en iyi seenek ArgumentException zel durumunu oluturmaktr. (Sfr uzunluundaki bir dizideki tamsaylarn toplam sfr olacaktr fakat bu rnekte bu durumu zel bir durum olarak ele alacaz.)

Blm 11

Parametre Dizilerini Anlamak

213

5. Sum yntemine paramList, null ise bir ArgumentException zel durumu oluturan kodu ekleyin. Sum yntemi imdi u ekilde grnmelidir:
public static int Sum(params int[] paramList) { if (paramList == null) { throw new ArgumentException(Util.Sum: null parameter list); } }

6. Aada koyu harflerle gsterildii gibi, Sum yntemine array uzunluu 0 ise bir ArgumentException zel durumu oluturan kodu ekleyin:
public static int Sum(params int[] paramList) { if (paramList == null) { throw new ArgumentException(Util.Sum: null parameter list); } if (paramList.Length == 0) { throw new ArgumentException(Util.Sum: empty parameter list); } }

Dizi bu iki testi geerse, bir sonraki aama dizinin iindeki elerin tmn birlikte toplamaktr. 7. Tm eleri toplamak iin bir foreach ifadesi kullanabilirsiniz. Her aamadaki toplam deeri tutmak iin bir yerel deiken gerekli olacaktr. sumTotal adnda bir tamsay bildirin ve deikene balang deeri olarak 0 atayn. paramList dizisi zerinden yineleme yapmak iin Sum yntemine bir foreach ifadesi ekleyin. Bu foreach dngsnn gvdesi dizideki her eyi sumTotala ekler. Yntemin sonunda, bir return ifadesi ile sumTotal deerini dndrr.
class Util { public static int Sum(params int[] paramList) { ... int sumTotal = 0; foreach (int i in paramList) { sumTotal += i; } return sumTotal; } }

8. Build mensnde, Build Solution tklayn. zmnzn hatasz olarak oluturulduunu dorulayn.

214

Ksm II

C# Dilini Anlamak

Util.Sum yntemini test edin .


1. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 2. Code and Text Editor penceresinde, Program snfndaki Entrance yntemini bulun. 3. Entrance yntemine aadaki ifadeyi ekleyin:
Console.WriteLine(Util.Sum(null));

4. Debug mensnde, Start Without Debuggingi tklayn. Program oluur ve alr, konsola aadaki iletiyi yazar:
Exception: Util.Min: null parameter list

Bu ileti, yntemdeki ilk denetimin altn gsterir. 5. Program kapatmak ve Visual Studio 2008e dnmek iin Entera basn. 6. Code and Text Editor penceresinde, Entrance yntemindeki Console.WriteLine arsn aadaki gibi deitirin:
Console.WriteLine(Util.Sum());

Bu defa, yntem herhangi bir bamsz deiken olmadan arlr. Derleyici, bo bamsz deiken listesini bo bir diziye evirir. 7. Debug mensnde, Start Without Debuggingi tklayn. Program oluturulur ve alr, konsola aadaki iletiyi yazar:
Exception: Util.Min: empty parameter list

Bu, yntemdeki ikinci denetimin altn dorular. 8. Program kapatmak ve Visual Studio 2008e dnmek iin Entera basn. 9. Entrance yntemindeki Console.WriteLine arsn aadaki gibi deitirin:
Console.WriteLine(Util.Sum(10, 9, 8, 7, 6, 5, 4, 3, 2, 1));

10. Debug mensnde, Start Without Debugging i tklayn. Program oluturulur, alr ve konsola 55 yazar. 11. Uygulamay kapatmak iin Entera basn. Bu blmde, herhangi bir sayda bamsz deiken alan bir yntemi tanmlamak iin bir params dizisini nasl kullanacanz rendiniz. Ayrca, herhangi bir trde, herhangi bir sayda bamsz deiken alan bir yntem yaratmak iin object trlerinde bir params dizisinin kullanmn rendiniz.

Blm 11
n

Parametre Dizilerini Anlamak

215

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i alr durumda brakn ve Blm 12ye gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 11 Hzl Bavuru


Bunun in
Belirli bir trde herhangi bir sayda bamsz deiken alan bir yntem yazmak

unu Yapn
Parametresi belirli bir trde bir params dizisi olan bir yntem yazn. rnein, herhangi bir sayda bool bamsz deikeni alan bir yntem yle olacaktr:
someType Method(params bool[] flags) { ... }

Herhangi bir trde, herhangi bir sayda bamsz deiken alan bir yntem yazmak

Parametresi object tr eler ieren bir params dizisi olan bir yntem yazn. rnein:
someType Method(params object[] paramList) { ... }

Blm 12

Kaltm ile almak


Bu blm tamamladktan sonra renecekleriniz:
n n

Temel snftan zellikleri miras alan bir tretilmi snf yaratmak. new, virtual ve override anahtar szcklerini kullanarak yntemi gizlemeyi ve geersiz klmay denetlemek. protected anahtar szcn kullanarak bir kaltm hiyerarisi dahilinde eriilebilirlii snrlamak. Kaltm kullanmaya alternatif olarak uzant yntemler tanmlamak.

Kaltm, nesne ynelim dnyasnda kilit bir kavramdr. Ortak olan ve birbiri ile yakndan ilikili olan ok sayda zellie sahip farkl snflar tanmladnzda tekrarlamadan kanmak iin bir ara olarak kaltm kullanabilirsiniz. Bu farkl snflar, her biri kendi ayrt edici zelliine sahip, ayn trn farkl snflar olabilir: rnein, bir fabrikann yneticileri, fiziksel gle alanlar ve tm iileri. Bir fabrikay gstermek iin bir uygulama yazacaksanz, yneticiler ve fiziksel gle alanlarn sahip olduklar ortak zellikleri ve farkl zellikleri nasl belirleyeceksiniz? rnein, tm alanlar bir alan numarasna sahiptir, fakat yneticiler farkl sorumluluklara sahiptir ve fiziksel gle alanlardan farkl grevleri vardr. Bu noktada kaltm ok yararldr.

Kaltm Nedir?
Birka uzman programcya, kaltm (inheritance) teriminden ne anladn sorarsanz, ok farkl ve elikili cevaplar alrsnz. Bu kark cevaplarn kk, kaltm kelimesinin kendisinin farkl anlamlar tamasndan kaynaklanr. Birisi bir eyleri size kendi istei ile brakrsa, onu kaltmla (miras) aldnz sylenir. Benzer ekilde, genlerinizin yarsn annenizden, yarsn da babanzdan kaltmla aldnz sylenir. Kaltm szcnn bu her iki kullanmnn, programclktaki kaltmla ok az ilgisi vardr. Programclktaki kaltm, tamamen snflandrma ile ilgilidir (snflar arasndaki bir ilikidir). rnein, okuldayken, byk olaslkla memeliler hakknda birok eyle birlikte, atn ve balinalarn memeli hayvanlar olduunu rendiniz. Her biri, bir memelinin sahip olduu ortak zelliklere sahiptir (nefes alr, yavrusunu besler, scakkanldr ve bunun gibi), fakat her biri kendi zelliklerine sahiptir (atn toynaklar vardr, balinalarn yoktur). Bir programda bir at ve bir balinay nasl modelleyebilirsiniz? Bunun bir yolu, At ve Balina adnda iki farkl snf yaratmaktr. Her snf, Yrmek ya da Yzmek gibi, memelinin o trne
217

218

Ksm II

C# Dilini Anlamak

zg olan yntemleri gerekletirebilir. Nefes Almak ya da Yavrusunu Beslemek gibi at ve balinada ortak olan yntemleri nasl gerekletireceksiniz? Her iki snfa da ayn yntemleri ekleyebilirsiniz fakat bu ekilde programn bakm zor olacaktr, zellikle de nsan ya da Karncayiyen gibi dier trleri de modellemeye baladnzda. C#da bunun iin snf kaltmn kullanabilirsiniz. At, balina, insan ve karncayiyen memeli trndedir, bu nedenle bu trler tarafndan sergilenen ortak ilevsellii salayan Memeli adnda bir snf yaratn. Daha sonra, At, Balina, nsan ve Karncayiyen snflarnn tmn Memeli snfndan kaltmla alabilirsiniz. Bu snflar otomatik olarak Memeli snfnn yntemlerini salar (Nefes Almak, Yavrusunu Beslemek ve bunun gibi), ayrca bir memeli trnn kendisine zg yntemlerini de uygun snfa ekleyebilirsiniz; At snf iin Yrmek yntemi ve Balina snf iin Yzmek yntemi gibi. Nefes Almak gibi ortak bir yntemin alma eklini deitirmeniz gerekirse, bu deiiklii sadece tek bir yerde, Memeli snfnda yapmanz gerekir.

Kaltm Kullanmak
Bu blm, C#da bir snftan miras alnan baka bir snf yaratmak iin, bilmeniz gereken kaltmla ilikili temel szdizimini ele alr.

Temel Snflar ve Tretilmi Snflar


Bir snfn baka bir snftan kaltmla aldn bildiren szdizimi u ekildedir:
class DerivedClass : BaseClass { ... }

Tretilmi snf temel snftan miras alr ve temel snftaki yntemler ayn zamanda tretilmi snfn da yntemleri olur. C#da, bir snf en fazla baka bir snftan tretilebilir; bir snf birden fazla snftan tretilemez. Bununla birlikte, DerivedClass (TretilmiSnf), mhrl (sealed) olarak bildirilmedii srece, ayn szdizimini kullanarak DerivedClassdan miras alan baka tretilmi snflar yaratabilirsiniz. (Arayzler Yaratmak ve Soyut Snflar Tanmlamak balkl Blm 13te mhrlenmi snflar hakknda daha fazla bilgi bulacaksnz.)
class DerivedSubClass : DerivedClass { ... }

alnamaz.

nemli Yaplarda kaltm kullanamazsnz. Bir yap, bir snftan ya da baka bir yapdan miras

Blm 12

Kaltm ile almak

219

Daha nce aklanan rnekte, Mammal snfn aada gsterildii gibi bildirebilirsiniz. Breathe ve SuckleYoung yntemleri tm memelilerde ortaktr.
class Mammal { public void Breathe() { ... } public void SuckleYoung() { ... } ... }

Daha sonra, farkl memeli trlerinin her biri iin snflar tanmlayabilir, gerekirse ek yntemler ekleyebilirsiniz. rnein:
class Horse : Mammal { ... public void Trot() { ... } } class Horse : Whale { ... public void Swim() { ... } }

Not C++ ile program gelitiriciler kaltmn genel, zel ya da korumal olup olmadnn ak bir ekilde belirtilmediine ve belirtilemeyeceine dikkat etmelidir. C#da kaltm, her zaman dolayl olarak geneldir. Java programclar, extends anahtar szcnn olmadna ve iki nokta st ste kullanldna dikkat etmelidir. System.Object snf, tm snflar iin kk snftr. Tm snflar dolayl olarak System.Object snfndan trerler. Bundan dolay, C# derleyicisi Mammal snfn aadaki gibi yeniden yazar (gerekten isterseniz ak bir ekilde yazabilirsiniz):
class Mammal : System.Object { ... }

220

Ksm II

C# Dilini Anlamak

System.Object snfndaki her yntem otomatik olarak, Horse ve Whale gibi Mammal snfndan tretilmi snflara geer. Pratikte bunun anlam, tanmladnz tm snflarn otomatik olarak System.Object snfnn tm zelliklerini miras almasdr. Bu, bir nesneyi dize gsterimine eviren ToString yntemi (ilk olarak Blm 2de incelenmiti) gibi yntemleri de kapsar.

Temel Snf Kurucularn armak


Bir tretilmi snf, otomatik olarak temel snfn tm alanlarn ierir. Bu alanlar genellikle, nesne yaratldnda balatlmasn gerektirir. Bu tr bir balatmay genellikle bir yapda gerekletirirsiniz. Tm snflarn en az bir kurucuya sahip olduunu hatrlayn. (Siz bir kurucu salamamsanz, derleyici sizin iin bir tane retir.) Tretilmi bir snftaki kurucunun, balatma ksm olarak kendi temel snfnn kurucusunu armas iyi bir uygulamadr. Miras alan bir snf iin bir kurucu tanmladnzda, temel snf kurucusunu armak iin, base anahtar szcn kullanabilirsiniz. rnein:
class Mammal // temel snf { public Mammal(string name) { ... } ... }

// temel snf iin kurucu

class Horse : Mammal // tretilmi snf { public Horse(string name) : base(name) // Mammal(name) yntemini arr { ... } ... }

Tretilmi snf kurucusu iinde, temel snf kurucusunu aka armyorsanz, derleyici tretilmi snf kurucusundaki kodu uygulamadan nce temel snfn varsaylan kurucusuna bir ar yerletirmeye alr. nceki rnei ele alrsak, derleyici aadaki u kodu:
class Horse : Mammal { public Horse(string name) { ... } ... }

Blm 12

Kaltm ile almak

221

Bu biimde yeniden yazar:


class Horse : Mammal { public Horse(string name) : base() { ... } ... }

Mammal snf public bir varsaylan kurucuya sahipse, bu ilem alr. Bununla birlikte, tm snflar public bir varsaylan kurucuya sahip deildir (Mammal sahip deildir!). Temel snf kurucusunu armann unutulduu durumlar derleme zaman hatas ile sonulanr.

Snflar Atamak
Bu kitaptaki nceki rneklerde, bir snf trn kullanarak bir deikeni nasl bildireceinizi ve daha sonra bir nesne yaratmak iin new anahtar szcnn kullanmn grdnz. Ayrca, C#daki tr denetim kurallarnn bir trdeki nesneyi, farkl bir trde bildirilmi bir deikene atamanz engellediini grdnz. rnein, Mammal, Horse ve Whale snflarnn burada gsterilen tanmlarna gre aadaki kod geerlidir:
class Mammal { ... } class Horse : Mammal { ... } class Whale : Mammal { ... } ... Horse myHorse = new Horse(Neddy); Whale myWhale = myHorse;

// nceki gsterilen kurucu bir ad bekler! // hata farkl trler

Bununla birlikte, tr olarak kaltm hiyerarisinde st srada yer alan snf kullanld srece, farkl trdeki bir deikenindeki nesneye bavurmak mmkndr. Buna gre, aadaki ifadeler geerli ifadelerdir:
Horse myHorse = new Horse(Neddy); Mammal myMammal = myHorse; // doru, Mammal Horseun temel snfdr

Mantksal terimler olarak dnrseniz, tm Horse snf, Mammal snfndadr, bu nedenle Horse tr bir nesneyi Mammal tr bir deikene gvenle atayabilirsiniz. Kaltm hiyerarisi,

222

Ksm II

C# Dilini Anlamak

Horse snfn birka ekstra bit ile (Horse snfna eklediiniz yntemler ve alanlar tarafndan tanmlanan), zel bir Mammal tr (Mammal trnn sahip olduu hereye sahiptir) olarak dnebileceiniz anlamna gelir. Ayrca, bir Mammal deikeninin bir Whale nesnesine bavurmasn salayabilirsiniz. Bununla birlikte, nemli bir kstlama vardr; bir Mammal deikeni kullanarak bir Horse ya da Whale nesnesine bavurduunuzda, sadece Mammal snf tarafndan tanmlanm yntemler ve alanlara eriebilirsiniz. Horse ya da Whale snf tarafndan tanmlanm ekstra yntemlere, Mammal snf zerinden eriilemez.
Horse myHorse = new Horse(Neddy); Mammal myMammal = myHorse; myMammal.Breathe(); // Tamam - Breathe Mammal snfnn parasdr myMammal.Trot(); // hata - Trot Mammal snfnn paras deildir

Not Bu, bir object deikenine neredeyse her eyi atayabileceinizi aklar. objectin System. Object iin takma ad olduunu ve tm snflarn System.Objectdan dorudan ya da dolayl olarak miras alndn hatrlayn. Bunun tersinin doru olmad konusunda uyarmalyz. Bir Horse deikenine koulsuzca bir Mammal nesnesi atayamazsnz:
Mammal myMammal = myMammal(Mammalia); Horse myHorse = myMammal; // hata

Bu garip bir kstlama gibi grnyor fakat tm Mammal nesnelerinin Horse olmadn, bazlarnn Whale olduunu unutmayn. Bir Horse deikenine bir Mammal nesnesi atayabilirsiniz fakat ilk olarak as ya da is ileci kullanarak ya da bir atama (cast) kullanarak Mammal nesnesinin gerekten bir Horse olup olmadn kontrol etmeniz gerekir. Aadaki kodda, myMammal deikeninin bir Horsea bavurup bavurmadn denetlemek iin as ileci kullanlmtr ve eer bavuruyorsa, myHorseAgain atamas, ayn Horse nesnesine bavuran myHorseAgain olarak sonulanr. myMammal deikeni baka bir Mammal trne bavuruyorsa, as ileci null sonucu verir.
Horse myHorse = new Horse(Neddy); Mammal myMammal = myHorse; ... Horse myHorseAgain = myMammal as Horse; ... Whale myWhale = new Whale(Moby Dick); myMammal = myWhale; ... myHorseAgain = myMammal as Horse; // myMammal Horsea bavurur // Tamam - myMammal Horsetu

// null dndrr - myMammal Whale idi

new Yntemleri Bildirmek


Bilgisayar programlama dnyasnda en zor problemlerden biri, tanmlayclar iin benzersiz ve anlaml adlar bulmaktr. Bir snf iin bir yntem tanmlarsanz ve o snf bir kaltm

Blm 12

Kaltm ile almak

223

hiyerarisinin paras ise, er ya da ge hiyerarinin tepesindeki snflardan biri tarafndan kullanlmakta olan bir ad yeniden kullanmaya kalkabilirsiniz. Temel bir snf ve tretilmi bir snf ayn imzal (yntem imzas, yntemin ad ve parametrelerin tipi ve saysdr) iki yntemi bildirirse, uygulamay derlerken hata alrsnz. Tretilmi snftaki yntem, temel snftaki ayn imzaya sahip yntemi maskeler (ya da gizler). rnein, aadaki kodu derlerseniz, derleyici Horse.Talkn miras alnm Mammal.Talk gizlediini syleyen bir uyar iletisi oluturacaktr:
class Mammal { ... public void Talk() // tm memeliler konuur { ... } } class Horse : Mammal { ... public void Talk() { ... } }

// atlar dier memelilerden farkl yolla konuur!

Kodunuz derlense ve alsa bile, bu uyary ciddiye almalsnz. Baka bir snf, Horse snfndan trerse ve Talk yntemini arrsa, Mammal snfndaki Talk ynteminin arld dnlebilir. Ama, Horse snfndaki Talk yntemi Mammal snfndaki Talk yntemini gizler ve bu nedenle Horse.Talk yntemi arlr. ou zaman, byle bir rastlant bir kargaaya neden olur ve karmakl nlemek iin bu yntemleri yeniden adlandrmay dnebilirsiniz. Bununla birlikte, iki yntemin ayn imzaya sahip olmasn istediinizden, bu nedenle de Mammal.Talk yntemini gizlemek istediinizden eminseniz, aadaki gibi new anahtar szcn kullanarak uyary engelleyebilirsiniz:
class Mammal { ... public void Talk() { ... } } class Horse : Mammal { ... new public void Talk() { ... } }

224

Ksm II

C# Dilini Anlamak

new anahtar szcn bu biimde kullanmak, iki yntemin halen tamamen ilikisiz olduu ve gizlemenin halen var olduu olgusunu deitirmez. Yalnzca uyary engeller. Sonuta, new anahtar szc, Ben ne yaptm biliyorum, bu uyarlar artk gsterme. demektir.

Virtual (Sanal) Yntemler Bildirmek


Bazen, bir yntemin temel snftaki uygulanma yolunu gizlemek istersiniz. rnein, System. Objectdeki ToString yntemini dnn. ToString ynteminin amac, bir nesneyi dize gsterimine evirmektir. Bu yntem kullanl olduundan, bir System.Object yesidir, dolaysyla tm snflar otomatik olarak ToString yntemine sahiptir. Bununla birlikte, System. Object tarafndan uygulanan ToString srm, bir tretilmi snf oluumunu bir dizeye nasl evireceini nereden bilebilir? Tretilmi bir snf, dize paras olmas gereken ilgin deerlerle ok sayda alan ierebilir. System.Objectde ToString uygulanr yant gerekten basit bir yant olur. Yapabileceinizin tm, nesneyi Mammal ya da Horse gibi, tr adn ieren bir dizeye evirmektir. Ancak, bu da ok kullanl deildir. yleyse, ok kullanl olmayan bir yntemi neden sunuyoruz? Bu sorunun yant biraz daha detayl dnmeyi gerektiriyor. ToString ynteminin kavramsal olarak iyi bir fikir olduu aktr ve tm snflar nesneleri grntlemek ya da hatalar bulmak amacyla, nesneleri dize gsterimine evirmek iin kullanlabilecek bir yntem salamaldr. Problemli olan sadece uygulamasdr. Aslnda, System.Object tarafndan tanmlanan ToString yntemini armanz beklenmez (bu sadece bir yer tutucudur). Bunun yerine, tanmladnz her snfta, ToString ynteminin System. Objectdaki varsaylan uygulamas yerine kendi ToString srmnz salamalsnz. System. Objectdeki srm sadece, snf kendi ToString yntemini salamad durumda, gvenlik a olarak mevcuttur. Bylece, herhangi bir nesne zerinde ToString yntemini arabileceinize ve yntemin bir dize dndreceine emin olabilirsiniz. ToString yntemini geersiz klmak iin tasarlanan yntem, sanal yntem olarak adlandrlr. Bir yntemi gizlemek ve bir yntemi geersiz klmak arasndaki fark net olarak anlamalsnz. Bir yntemi geersiz klmak, o yntemin farkl bir uygulamasn salamak iin kullanlan bir tekniktir (her iki yntem tamamen birbiri ile ilikilidir nk ayn grevi snfa zel bir uygulama ile gerekletirirler). Bir yntemi gizlemek, yntemi baka bir yntemle deitirmektir (yntemler genellikle birbiri ile ilikili deildir ve tmyle farkl grevleri gerekletirebilirler). Bir yntemi geersiz klmak yararl bir programlama kavramdr; bir yntemi gizlemek genellikle bir hatadr. virtual anahtar szcn kullanarak bir yntemi sanal yntem olarak belirtebilirsiniz. rnein, System.Object snfndaki ToString yntemi u ekilde tanmlanr:
namespace System { class Object { public virtual string ToString() { ...

Blm 12
} ... } ... }

Kaltm ile almak

225

Not Java yazlm gelitiricileri, C# yntemlerinin varsaylan ayar olarak sanal olmadklarna dikkat etmeliler.

override Yntemler Bildirmek


Temel bir snf, bir yntemin virtual (sanal) olduunu bildirirse, tretilmi bir snf o yntemin baka bir uygulamasn bildirmek iin override anahtar szcn kullanabilir. rnein:
class Horse : Mammal { ... public override string ToString() { ... } }

Yntemin tretilmi snftaki yeni uygulamas, base anahtar szcn kullanarak temel snftaki orijinal uygulamay arabilir. rnein:
public override string ToString() { base.ToString(); ... }

virtual ve override anahtar szcklerini kullanarak ok biimli (polymorphic) yntemler bildirirken (Sanal Yntemler ve ok Biimlilik balkl sonraki metin kutusuna bakn) uymanz gereken baz nemli kurallar vardr:
n

virtual ya da override anahtar szckleriyle zel bir yntem bildiremezsiniz. Bildirmeye alrsanz, derleme zaman hatas alrsnz. zel gerekten zeldir. ki yntem imzas zde olmaldr; yani, ayn ada, ayn sayda ve trde parametreye ve ayn dn trne sahip olmaldr. ki yntemin ayn eriim hakkna sahip olmas gerekir. rnein, yntemlerden biri ortak ise, dieri de ortak olmaldr. (Bir sonraki ksmda greceiniz gibi, yntemler de korumal olabilir.)

226

Ksm II
n

C# Dilini Anlamak

Yalnzca sanal bir yntemi geersiz klabilirsiniz. Temel snf yntemi sanal deilse ve onu geersiz klmaya alrsanz, derleme zaman hatas ile karlarsnz. Bu hassas bir konudur; yntemlerinin geersiz klnp klnmamas konusunda karar, temel snfa ait olmaldr. Tretilmi snf override anahtar szcn kullanarak yntem bildirmezse, temel snf yntemini de geersiz klmaz. Dier bir deyile, ayn ada sahip olan tamamen farkl bir yntemin uygulamas haline gelir. Bu durum, new anahtar szcn nceden anlatld gibi kullanarak kapatlabilen derleme zaman gizli uyarsna neden olur. Bir override yntemi dolayl olarak sanaldr ve daha ileri tretilmi bir snfta kendisi geersiz klnabilir. Bununla birlikte, virtual anahtar szcn kullanarak bir override ynteminin sanal olduunu akca bildirmenize izin verilmez.

Sanal Yntemler ve ok Biimlilik


Sanal yntemler, alma zamannda dinamik olarak hesaplanan nesne trne dayanarak, ayn yntemin farkl biimlerini armanz salar. Daha nce anlatlan Mammal hiyerarisi zerinde bir eitlilik tanmlayan aadaki rnek snflar dnn:
class Mammal { ... public virtual string GetTypeName() { return This is a mammal; } } class Horse : Mammal { ... public override string GetTypeName() { return This is a horse; } } class Whale : Mammal { ... public override string GetTypeName () { return This is a whale; } } class Aardvark : Mammal { ... }

Blm 12

Kaltm ile almak

227

ki eye dikkat edin: Birincisi, Horse ve Whale snflarndaki GetTypeName yntemi (ksaca tanmlanacaktr) tarafndan kullanlan override anahtar szc ve ikincisi, Aardvark snfnn bir GetTypeName yntemine sahip olmad gerei. imdi aadaki kod blounu inceleyin:
Mammal myMammal; Horse myHorse = new Horse(...); Whale myWhale = new Whale(...); Aardvark myAardvark = new Aardvark(...); myMammal = myHorse; Console.WriteLine(myMammal.GetTypeName()); // Horse myMammal = myWhale; Console.WriteLine(myMammal.GetTypeName()); // Whale myMammal = myAardvark; Console.WriteLine(myMammal.GetTypeName()); // Aardvark

farkl Console.WriteLine ifadesinin sonucu ne olacaktr? lk bakta, her ifade de bir Mammal trnde myMammal deikeni zerinde GetTypeName yntemini ardndan, ifadenin de Bu bir memeli ktsn vermesini beklersiniz. Bununla birlikte, ilk durumda, myMammal deikeninin gerekte Horsea bavurduunu grebilirsiniz. (Hatrlayn, Horse snf Mammal snfndan tretildiinden, bir Mammal deikenine bir Horse atayabilirsiniz.) GetTypeName yntemi, virtual (sanal) olarak bildirildiinden, alma zaman Horse.GetTypeName yntemini armas gerektiini anlar, bu nedenle ifade gerekte Bu bir at ktsn verir. kinci Console.WriteLine ifadesine de ayn mantk uygulanr, ikinci ifade de Bu bir balina ktsn verir. nc ifade, Aardvark nesnesi zerinde Console.WriteLine yntemini arr. Bununla birlikte, Aardvark snf bir GetTypeName yntemine sahip deildir, bu nedenle Bu bir memeli ktsn veren Mammal snfndaki varsaylan yntem arlr. Ayn ifadenin farkl yntemleri aryor olmas ok biimlilik (polymorphism) olarak adlandrlr, tam olarak ok sayda biim anlamna gelir.

protected Eriimi Anlamak


public ve private eriim anahtar szckleri eriim konusunda iki u durum oluturur: bir snfn public (ortak) alanlar ve yntemleri herkesin eriimine ak iken, private (zel) alanlar ve yntemleri sadece snfn kendisi tarafndan eriilebilir. Bu iki u durum, snflar tek balarna dnrken yeterlidir. Bununla birlikte, nesne ynelimli programlama dilinde uzman programclarn tmnn bildii gibi, tek balarna snflar karmak problemleri zemezler. Kaltm, snflar birletirmenin gl bir yoludur ve tretilmi bir snf ile onun temel snf arasnda ok zel ve yakn bir iliki vardr. ounlukla,

228

Ksm II

C# Dilini Anlamak

bir temel snf iin, temel snfn baz yelerini hiyeraride yer almayan snflardan gizlerken, tretilmi snflarn bu yelere erimesine izin vermek yararldr. Bu ekilde yeleri belirlemek iin, protected (korumal) anahtar szcn kullanabilirsiniz:
n

Bir A snf, B snfndan tretilmi ise, B snfnn korunmu yelerine eriebilir. Dier bir deyile, tretilmi A snf iinde, B snfnn korumal yesi etkin biimde ortaktr. A snf, B snfndan tretilmi deilse, B snfnn korumal yelerine eriemez. Dier bir deyile, A snf iinde, B snfnn korumal yesi etkin olarak zeldir.

C#, programclara hem yntemleri hem de alanlar korumal olarak bildirmek iin tam bir zgrlk vermektedir. Bununla birlikte, nesne-ynelimli programclk klavuzlarnn ou, alanlarnz kesinlikle zel tutmanz nerir. Snfn tm kullanclarnn alanlara dorudan, snrsz eriimi olduundan ortak alanlar kapsllemeyi bozarlar. Korumal alanlar, bu alanlara eriemeyen snfn kullanclarna kapslleme salar. Bununla birlikte, korumal alanlar, kapsllemenin, snftan kaltmla alan snflar tarafndan bozulmasna hala izin vermektedir. Not Korumal bir temel snf yesine, yalnzca tretilmi bir snftan deil, ayn zamanda tretilmi snftan tretilmi snflardan da eriebilirsiniz. Korumal temel snf yesi, eriilebilirliini tretilmi bir snfta koruyabilirken daha ileri tretilmi snflar iin eriilebilir konumdadr. Aadaki altrmada, farkl tat trlerini modellemek iin basit bir snf hiyerarisi tanmlayacaksnz. Vehicle (Tat) adnda bir temel snf ve Airplane (Uak) ve Car (Araba) adnda tretilmi snflar tanmlayacaksnz. Vehicle snfnda, StartEngine ve StopEngine adnda iki ortak yntem tanmlayacaksnz. Ayrca, tretilmi snflara zel olan baz ek yntemler ekleyeceksiniz. Son olarak, Vehicle snfna Drive adnda bir sanal yntem ekleyerek, bu yntemin tretilmi snflarn her ikisindeki varsaylan uygulamasn geersiz klacaksnz.

Snflarn bir hiyerarisini oluturun


1. Microsoft Visual Studio 2008i altrn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 12\ Vehicles klasrnde yer alan Vehicles projesini an. Vehicles projesinde bir nceki altrmada grdnz Main ve Entrance yntemleri ile Program snfn tanmlayan Program.cs dosyas yer almaktadr. 3. Solution Explorerda Vehicles projesini farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Class tklayn. Projeye, yeni bir snf tanmlayan yeni bir dosya eklemenizi salayan Add New Item Vehicles iletiim kutusu alr.

Blm 12

Kaltm ile almak

229

4. Add New ItemVehicles iletiim kutusunda, Name kutusuna Vehicle.cs yazn ve Addi tklayn. Vehicle.cs dosyas yaratld ve projeye eklendii, Code and Text Editor penceresinde grnr. Dosya, Vehicle adnda bo bir snfn tanmlamasn ierir. 5. Aada gsterildii gibi, Vehicle snfna StartEngine ve StopEngine yntemlerini ekleyin:
class Vehicle { public void StartEngine(string noiseToMakeWhenStarting) { Console.WriteLine(Starting engine: {0}, noiseToMakeWhenStarting); } public void StopEngine(string noiseToMakeWhenStopping) { Console.WriteLine(Stopping engine: {0}, noiseToMakeWhenStopping); } }

Vehicle snfndan tretilen tm snflar bu yntemleri kaltmla alacaktr. noiseToMakeWhenStarting ve noiseToMakeWhenStopping parametrelerinin deerleri, her tat tr iin farkl olacaktr ve daha sonralar hangi tatn altn, hangisinin durduunu anlamanza yardmc olacaktr. 6. Project mensnde Add Class tklayn. Add New ItemVehicles iletiim kutusu grnr. 7. Name kutusuna Airplane.cs yazn ve Add i tklayn. Airplane adnda bir snf ieren yeni bir dosya projeye eklenir ve Code and Text Editor penceresinde grntlenir. 8. Code and Text Editor penceresinde, Airplane snfnn tanmlamasn, Vehicle snfndan tretilmi olacak ekilde deitirin:
class Airplane : Vehicle { }

9. Aada koyu harflerle gsterildii gibi, Airplane snfna TakeOff ve Land yntemlerini ekleyin:
class Airplane : Vehicle { public void TakeOff() { Console.WriteLine(Taking off); } public void Land() { Console.WriteLine(Landing); } }

230

Ksm II

C# Dilini Anlamak

10. Project mensnde, Add Class tklayn. Add New ItemVehicles iletiim kutusu grnr. 11. Name kutusuna, Car.cs yazn ve Add i tklayn. Car adnda bir snf ieren yeni bir dosya, projeye eklenir ve Code and Text Editor penceresinde grntlenir. 12. Code and Text Editor penceresinde, Car snfnn tanmlamasn, Vehicle snfndan tretilmi olacak ekilde deitirin:
class Car : Vehicle { }

13. Aada koyu harflerle gsterildii gibi, Car snfna Accelerate ve Brake yntemlerini ekleyin:
class Car : Vehicle { public void Accelerate() { Console.WriteLine(Accelerating); } public void Brake() { Console.WriteLine(Braking); } }

14. Code and Text Editor penceresinde Vehicle.cs dosyasn grntleyin. 15. Aada koyu harflerle gsterildii gibi, Vehicle snfna, sanal Drive yntemini ekleyin:
class Vehicle { ... public virtual void Drive() { Console.WriteLine(Default implementation of the Drive method); } }

16. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 17. Entrance ynteminde, Airplane snfnn oluumunu yaratn ve aadaki gibi, hzl bir uak gezisi simule ederek yntemlerini test edin:
static void Entrance() { Console.WriteLine(Journey by airplane:); Airplane myPlane = new Airplane(); myPlane.StartEngine(Contact);

Blm 12
myPlane.TakeOff(); myPlane.Drive(); myPlane.Land(); myPlane.StopEngine(Whirr); }

Kaltm ile almak

231

18. Entrance ynteminde biraz nce yazdnz kodun hemen arkasna aada koyu harflerle gsterilen ifadeleri ekleyin. Bu ifadeler, Car snfnn bir oluumunu yaratr ve yntemlerini test eder.
static void Entrance() { ... Console.WriteLine(\nJourney by car:); Car myCar = new Car(); myCar.StartEngine(Brm brm); myCar.Accelerate(); myCar.Drive(); myCar.Brake(); myCar.StopEngine(Phut phut); }

19. Debug mensnde, Start Without Debuggingi tklayn. Programn, konsol penceresinde, aadaki resimde gsterildii gibi, uak ve araba ile yaplan bir gezinin farkl aamalarn gsteren iletilerin ktsn verdiini dorulayn:

Her iki ulam biiminin de sanal Drive ynteminin varsaylan uygulamasn ardna dikkat edin. nk snflarn her ikisi de bu yntemi geersiz klmaz. 20. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn. 21. Code and Text Editor penceresinde, Airplane snfn grntleyin. Aadaki gibi, Airplane snfndaki Drive yntemini geersiz kln:
public override void Drive() { Console.WriteLine(Flying); }

232

Ksm II

C# Dilini Anlamak

Not IntelliSensein kullanlabilir yntemlerin listesini otomatik olarak grntlediine dikkat edin. IntelliSense listesinden Drive yntemini seerseniz, Visual Studio otomatik olarak, base.Drive yntemini aran ifadeyi kodunuza ekler. Byle olursa, bu altrma iin gerekli olmayan ifadeyi silin. 22. Code and Text Editor penceresinde Car snfn grntleyin. Aadaki gibi, Car snfnda Drive yntemini geersiz kln:
public override void Drive() { Console.WriteLine(Motoring); }

23. Debug mensnde, Start Without Debuggingi tklayn. Konsol penceresinde, uygulama Drive yntemini ardnda Airplane nesnesinin imdi Flying iletisini, Car nesnesinin de Motoring iletisini gsterdiine dikkat edin. 24. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn. 25. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 26. Entrance ynteminin sonuna, aada koyu harflerle gsterilen ifadeleri ekleyin:
static void Entrance() { ... Console.WriteLine(\nTesting polymorphism); Vehicle v = myCar; v.Drive(); v = myPlane; v.Drive(); }

Bu kod, sanal Drive yntemi tarafndan salanan ok biimlilii test eder. Kod, bir Vehicle deikeni kullanarak Car nesnesine bavuru oluturur (bu gvenlidir, nk tm Car nesneleri, Vehicle nesnesidir) ve daha sonra bu Vehicle deikenini kullanarak Drive yntemini arr. Son iki ifade, Vehicle deikenini Airplane nesnesine ilikilendirir ve Drive yntemi ile ayn grnen yntemi tekrar arr. 27. Debug mensnde, Start Without Debugging i tklayn. Konsol penceresinde, daha nceki iletinin arkasndan aadaki metnin grntlendiini dorulayn:
Testing polymorphism Motoring Flying

Blm 12

Kaltm ile almak

233

Drive yntemi sanaldr, bu nedenle alma zaman (derleyici deil), bu deiken tarafndan bavurulan nesnenin gerek trne dayanan bir Vehicle deikeni zerinde ardnzda, hangi Drive ynteminin arldn bulur. lk durumda, Vehicle nesnesi bir Cara bavurur, bu nedenle uygulama Car.Drive yntemini arr. kinci durumda, Vehicle nesnesi bir Airplanea bavurur, bu nedenle uygulama Airplane.Drive yntemini arr. 28. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn.

Uzant Yntemlerini Anlamak


Kaltm olduka kullanl bir yntemdir, bir snftan yeni bir snf yaratarak, o snfn ilevselliini geniletmenizi salar. Bununla birlikte, bazen yeni davranlar eklemek iin kaltm kullanmak, en uygun mekanizma deildir zellikle var olan kodu etkilemeden bir tr hzlca geniletmeniz gerekiyorsa. rnein, int trne yeni bir zellik eklemek istediinizi varsayn: bir tamsaynn ierdii deerin negatifini dndren Negate adl bir yntem. (Ayn grevi gerekletirmek iin tek bir eksi ilecini (-) kullanabileceinizi biliyorum, fakat sabredin.) Bunu yapmann bir yolu, System. Int32den kaltmla alan (int tr System.Int32 iin bir takma addr) ve Negate yntemini ekleyen NegInt32 adnda yeni bir tr tanmlamak olabilir:
class NegInt32 : System.Int32 { public int Negate() { ... } } // bunu denemeyin!

Teori udur: NegInt32, Negate yntemine ek olarak, System.Int32 tr ile ilgili tm ilevsellii miras alacaktr. u iki nedenden dolay bu yaklam kullanmay istemeyebilirsiniz:
n

Bu yntem sadece NegInt32 trne uygulanr ve yntemi kodunuzda var olan int deikenlerle kullanmak isterseniz, her int deikenin tanmn, tr NegInt32 olacak ekilde deitirmeniz gerekir. System.Int32 tr aslnda bir snf deil, bir yapdr ve yaplarla kaltm kullanamazsnz.

Bu noktada uzant (extension) yntemleri ok kullanldr. Bir uzant yntemi mevcut bir tr (snf ya da yap), ek statik yntemlerle geniletmenizi salar. Bu statik yntemler, geniletilmi trdeki veriye bavuran herhangi bir ifadede hemen kullanlabilir hale gelir.

234

Ksm II

C# Dilini Anlamak

Bir static snfta bir uzant yntemi tanmlayn ve this anahtar szc ile yntemin ilk parametresinin trn belirtin. int tr iin Negate uzant yntemini nasl uygulayabileceinizi gsteren rnek u ekildedir:
static class Util { public static int Negate(this int i) { return i; } }

Szdizimi biraz garip grnyor, fakat Negate yntemini bir uzant yntemi olarak tanmlayan parametreyi ekleyen, this anahtar szcdr. Burada, this anahtar szcnn nne eklenen parametrenin int olmas, int trn genilettiiniz anlamna gelir. Uzant yntemini kullanmak iin, Util snfn kapsam iine getirin (Gerekirse, Util snfnn ait olduu ad alann belirten bir using ifadesi ekleyin). Daha sonra ynteme bavurmak iin . nokta iaretini kullanabilirsiniz:
int x = 591; Console.WriteLine(x.Negate {0}, x.Negate());

Negate yntemini aran ifadede herhangi bir yerde Util snfna bavurmanza gerek olmadna dikkat edin. C# derleyicisi, verilen bir tr iin, kapsam iindeki statik snflarn tmnden uzant yntemlerini otomatik olarak ortaya karr. Ayrca, bu kullanm, yntemi bir uzant yntemi olarak tanmlama amacn karlamamasa da, daha nce grdnz sradan szdizimini kullanarak, parametre olarak int tr geiren Utils.Negate yntemini de arabilirsiniz:
int x = 591; Console.WriteLine(x.Negate {0}, Util.Negate(x));

Aadaki altrmada, int trne bir uzant yntemi ekleyeceksiniz. Bu uzant yntemi, 10 tabannda bir say ieren int deikeninin deerini, farkl say tabanndaki gsterimine evirir.

Bir uzant yntemi yaratn


1. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 12\ ExtensionMethod klasrnde yer alan ExtensionMethod(UzantYntemi) projesini, Visual Studio 2008de an. 2. Code and Text Editor penceresinde Util.cs dosyasn grntleyin. Bu dosya, Extensions adndaki ad alannda Util adnda bir statik snf ierir. Snf, // to do yorum satr dnda botur. Uzant yntemlerini bir statik snf iinde tanmlamanz gerektiini hatrlayn.

Blm 12

Kaltm ile almak

235

3. Util snfna, ConvertToBase adnda bir public statik yntem ekleyin. Yntem iki parametre almaldr: yntemin int tr iin bir uzant yntemi olduunu gstermek iin, this anahtar szc ile i adnda int tr bir parametre ve baseToConvertTo adnda sradan bir int tr parametre. Yntem, i parametresinin deerini, baseToConvertTo ile gsterilen say tabanna evirir. Yntem, evrilmi deeri ieren bir int dndrmelidir. ConvertToBase yntemi u ekilde grnmelidir:
static class Util { public static int ConvertToBase(this int i, int baseToConvertTo) { } }

4. ConvertToBase yntemine, baseToConvertTo parametresinin deerinin 2 ile 10 arasnda olup olmadn denetleyen bir if ifadesi ekleyin. Bu altrma tarafndan kullanlan algoritma, bu say aral dnda gvenli olarak almaz. baseToConvertTo deeri, bu aralk dnda ise, uygun bir iletiyle bir ArgumentException zel durumu oluturun. ConvertToBase yntemi u ekilde grnmelidir:
public static int ConvertToBase(this int i, int baseToConvertTo) { if (baseToConvertTo < 2 || baseToConvertTo > 10) throw new ArgumentException(Value cannot be converted to base + baseToConvertTo.ToString()); }

5. Aada koyu harfle gsterilen ifadeleri, ArgumentException zel durumu oluturan ifadeden sonra, ConvertToBase yntemine ekleyin. Bu kod, 10 tabanndaki sayy farkl bir say tabanna eviren, bilinen bir algoritmay uygular:
public static int ConvertToBase(this int i, int baseToConvertTo) { ... int result = 0; int iterations = 0; do { int nextDigit = i % baseToConvertTo; result += nextDigit * (int)Math.Pow(10, iterations); iterations++; i /= baseToConvertTo; } while (i != 0); return result; }

6. Code and Text Editor penceresinde, Program.cs dosyasn grntleyin.

236

Ksm II

C# Dilini Anlamak

7. Dosyann en stndeki ifadeden, using Systemden sonra, aadaki using ifadesini ekleyin:
using Extensions;

Bu ifade, Util snfn ieren ad alann kapsam iine getirir. Bu grevi gerekletirmezseniz, ConvertToBase uzant yntemi Program.cs dosyasnda eriilebilir olmaz. 8. Program snfnn Entrance yntemine aadaki ifadeleri ekleyin:
int x = 591; for (int i = 2; i <= 10; i++) { Console.WriteLine({0} in base {1} is {2}, x, i, x.ConvertToBase(i)); }

Bu kod, x adnda bir int deiken yaratr ve 591 deerini atar. (stediiniz bir tamsay deerini seebilirsiniz.) Kod daha sonra, 2 ile 10 arasndaki tm say tabanlarnda 591 deerinin ktsn veren bir dng kullanr. Console.WriteLine ifadesinde, xden sonra (.) nokta yazdnzda, ConvertToBasein IntelliSensede bir uzant yntemi olarak grndne dikkat edin. 9. Debug mensnde, Start Without Debuggingi tklayn. Programn aadaki gibi, konsolda farkl say tabanlarnda 591 deerini gsteren iletileri grntlediini dorulayn:

10. Program kapatmak iin Entera basn. Tebrikler. Snflarn hiyerarisini tanmlamak iin baarl bir ekilde kaltm kullandnz ve imdi kaltmla alnm yntemleri nasl geersiz klacanz ve sanal yntemleri nasl uygulayacanz anlam olmalsnz. Ayrca, mevcut bir tre bir uzant yntemini nasl ekleyeceinizi grdnz.

Blm 12
n

Kaltm ile almak

237

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 13e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 12 Hzl Bavuru


Bunun in
Temel bir snftan tretilmi bir snf oluturmak

unu Yapn
Yeni snf ad bildirin, ardndan iki nokta st ste ve temel snfn adn yazn. rnein:
class Derived : Base { ... }

Bir snf kaltmla almak iin kurucu paras olarak bir temel snf kurucusu arn

Tretilmi snf kurucusunun gvdesinden nce kurucu parametre listesini salayn. rnein:
class Derived : Base { ... public Derived(int x) : Base(x) { ... } ... }

Sanal bir yntem bildirmek

Yntemi bildirirken virtual anahtar szcn kullann. rnein:


class Mammal { public virtual void Breathe() { ... } ... }

238

Ksm II

C# Dilini Anlamak

Kaltmla alnan sanal yntemi geersiz klan bir tretilmi snftaki yntemi uygulamak

Tretilmi snftaki yntemi bildirirken override anahtar szcn kullann. rnein:


class Whale : Mammal { public override void Breathe() { ... } ... }

Bir tr iin uzant yntemi tanmlamak

Statik snfa statik ortak yntem ekleyin. lk parametre, nnde this anahtar szc ile geniletilmi trde olmak zorundadr. rnein:
static class Util { public static int Negate(this int i) { return i; } }

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak


Bu blm tamamladktan sonra renecekleriniz:
n n n n

Yntem adlarn belirleyen bir arabirim tanmlamak. Yntemlerin gvdesini yazarak bir yap ya da snf iinde bir arabirim uygulamak. Bir soyut snf iinde yaygn uygulama ayrntlarn yakalamak. sealed anahtar szcn kullanarak bir snfn temel bir snf olarak kullanlamayacan bildirmek.

Bir snftan kaltmla almak gl bir mekanizmadr, fakat kaltmn gerek gc bir arabirimden kaltmla almasndan gelir. Bir arabirim herhangi bir kod ya da veri iermez; sadece bir arabirimden kaltmla alan bir snfn salamak zorunda olduu yntemler ve zellikleri belirtir. Bir arabirim kullanmak, bir snfn yntemlerinin adlar ve imzalarn, yntemin uygulanmasndan tamamen ayrabilmenizi salar. Soyut snflar, kod ve veri ierebilmeleri dnda, birok ynden arabirimlere benzer. Bununla birlikte, bir soyut snfn balca yntemlerini belirleyebilirsiniz, bu nedenle soyut snftan kaltmla alan bir snf, bu yntemler iin kendi uygulamasn salamak zorundadr. ou kez, soyut snflar arabirimlerle kullanrsnz. Birlikte, geniletilebilir programlama ereveleri oluturmanz salayan anahtar teknikler salarlar.

Arabirimleri Anlamak
erdii nesnelerin trne bal olan bir srada, nesneleri saklamak iin bir uygulama salayan yeni bir koleksiyon snf tanmlamak istediinizi varsayn. Koleksiyon snfn tanmladnzda, tutabilecei nesnelerin trnde bir kstlama olmasn istemezsiniz ve bu nedenle bu nesneleri nasl sralayacanz bilemezsiniz. Fakat bu belirtilmemi nesneleri sralamann bir yolunu bulmanz gerekir. Koleksiyon snf yazdnzda trn bilmediiniz nesneleri sralayan bir yntemi nasl salayacaksnz? lk bakta, Blm 12de anlatlan ToString problemine benzer ve koleksiyon snfnzn alt snflarnn geersiz klabilecei bir sanal yntem bildirerek zlebilir gibi grnyor. Bununla birlikte, durum bu deil. Genellikle koleksiyon snf ile snfn tuttuu nesneler arasnda kaltma benzer bir iliki yoktur, bu nedenle sanal yntem ok fazla kullanlmayacaktr. Bir an dnrseniz, problem, koleksiyondaki nesnelerin sralanma eklinin koleksiyona deil, nesnelerin kendi trlerine bal olmasdr. Bu nedenle
239

240

Ksm II

C# Dilini Anlamak

zm, tm nesnelerin koleksiyonun arabilecei ve koleksiyonun nesneleri birbirleri ile karlatrmasna imkan tanyan bir yntem salamalar gerekmesidir. rnek olarak, aadaki CompareTo yntemine bakn:
int CompareTo(object obj) { // return 0 if this instance is equal to obj // return < 0 if this instance is less than obj // return > 0 if this instance is greater than obj ... }

Koleksyion snf, ieriklerini sralamak iin bu yntemi kullanabilir. CompareTo yntemini ieren, biriktirilebilir nesneler iin bir arabirim tanmlayabilir ve koleksiyon snfnn sadece bu arabirimi uygulayan snflar biriktirebileceini belirtebilirsiniz. Bu biimde, bir arabirim bir szlemeye benzer. Bir snf bir arabirim uyguluyorsa, arabirim snfn, arabirimde belirtilen tm yntemleri ierdiini garanti eder. Bu teknikle, koleksiyondaki tm nesneler zerinde CompareTo yntemini arabilir ve nesneleri sralayabilirsiniz. Arabirimler neyi nasldan doru olarak ayrmanz salar. Arabirim, size yalnzca yntemin adnn, dn trnn ve parametrelerinin ne olduunu syler. Yntemin kesin olarak nasl kullanld arabirimin konusu deildir. Arabirim, bir nesnenin o anda nasl kullanldndan ok, sizin onu nasl kullanmak istediinizi gsterir.

Arabirim Szdizimi
Bir arabirim tanmlamak iin, class ya da struct anahtar szckleri yerine, interface anahtar szcn kullanrsnz. Arabirim iinde, yntemleri aynen bir snf ya da yap iindeki gibi bildirirsiniz; farkl olarak herhangi bir eriim deitirici (public, private ya da protected) kullanmazsnz ve yntem gvdesini noktal virglle deitirirsiniz. rnein:
interface IComparable { int CompareTo(object obj); }

pucu Microsoft .NET Framework belgeleri, arabirimlerinizin adn byk harf I ile balatmanz
nerir. Bu, C#taki Macar Simgeleminin son eseridir. Bu arada, System ad alan, burada gsterildii gibi, zaten IComparable arabirimini tanmlar.

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

241

Arabirim Kstlamalar
Hatrlanmas gereken konu, bir arabirimin hibir zaman hibir uygulama iermediidir. Aadaki kstlamalar bu durumun doal sonulardr:
n

Bir arabirim iin herhangi bir alan tanmlamanza izin verilmez (statik alana bile). Bir alan, bir snf ya da yapnn uygulama detaydr. Bir arabirim iinde kurucu tanmlamanza izin verilmez. Kurucu da, bir snf ya da yapnn uygulama detay olarak dnlr. Bir arabirim iinde ykc tanmlamanza izin verilmez. Bir ykc, bir nesne oluumunu ykmak iin kullanlan ifadeleri ierir. (Ykclar p Toplama ve Kaynak Ynetimini Kullanmak balkl Blm 14te anlatlmtr.) Herhangi bir yntem iin bir eriim deitiricisi belirtemezsiniz. Bir arabirimdeki tm yntemler dolayl olarak ortaktr. Bir arabirim iinde hibir tr (numaralandrmalar, yaplar, snflar ya da arabirimler gibi) yuvalayamazsnz. Bir arabirimi bir yap ya da snftan kaltmla almanza izin verilmez. Fakat bir arabirim baka bir arabirimden kaltmla alnabilir. Yaplar ve snflar uygulamalar ierirler; bir arabirimin bunlarn herhangi birinden kaltmla alnmasna izin verilseydi, baz uygulamalar da kaltmla alm olacakt.

Bir Arabirim Uygulamak


Bir arabirim uygulamak iin, arabirimden kaltmla alan ve arabirim tarafndan belirtilen tm yntemleri salayan bir snf ya da yap bildirirsiniz. rnein, Blm 12de gsterilen Mammal hiyerarisini tanmladnz ve ayakl memelilerin bacak saysn int olarak dndren NumberOfLegs adnda bir yntem salamanz gerektiini varsayn (Deniz hayvanlar bu arabirimi uygulamaz.) Bu yntemi ieren ILandBound arabirimini aadaki gibi tanmlayabilirsiniz:
interface ILandBound { int NumberOfLegs(); }

Daha sonra, Horse snfnda bu arabirimi uygulayabilirsiniz:


class Horse : ILandBound { ... int ILandBound.NumberOfLegs() { return 4; } }

242

Ksm II

C# Dilini Anlamak

Bir arabirim uyguladnzda, her yntemin kendine uygun olan arabirim yntemiyle tam olarak elemesini garantiye almalsnz:
n n n

Yntem adlar ve dn trleri kesin olarak elemelidir . Parametreler (ref ve out anahtar szck deitiricileri de dahil) kesin olarak elemelidir. Yntem ad, arabirim ad ile balar. Bu ak olarak arabirim uygulamas olarak bilinir ve iyi bir alkanlktr. Bir arabirim uygulayan tm yntemler ortak olarak eriilebilir olmak zorundadr. Bununla birlikte, ak arabirim uygulamas kullanyorsanz, yntem bir eriim nitelendiriciye sahip olmamaldr.

Arabirim tanm ve arabirimin bildirilen uygulamas arasnda herhangi bir fark varsa, snf derlenmez.

Ak Arabirim Uygulamalarnn Avantajlar


Bir arabirimi ak biimde uygulamak biraz gereksiz grnebilir fakat daha temiz, bakm daha kolay ve nceden tahmin edilebilir daha ok kod yazmanza yardmc olan pek ok avantaj sunar. Arabirim adn ak olarak belirtmeden bir yntem uygulayabilirsiniz fakat bu, uygulamann davran biimlerinde baz farkllklara neden olabilir. Bu farkllklarn bazlar karkla neden olabilir. rnein, aka arabirim uygulamasn kullanarak tanmlanm bir yntem sanal olarak bildirilemez, ancak arabirim adn ihmal etmek bu davrana izin verir. Ayn adda, dn trnde ve parametrelerde yntemler ieren birden fazla arabirim mmkndr. Bir snf, ortak imzalara sahip yntemlerle birden fazla arabirim uygularsa, yntem uygulamalar arasndaki belirsizlii gidermek iin ak olarak arabirim uygulamasn kullanabilirsiniz. Ak olarak arabirim uygulamas, bir snftaki yntemin hangi arabirime ait olduunu tanmlar. Ayrca, her arabirim iin yntemler ortak olarak eriilebilir fakat sadece arabirimin kendisi zerinden eriilebilir. Bir sonraki Bir Snfa Arabirimi zerinden Bavurmak balkl blmde bunun nasl olacana bakacaz. Bu kitapta, mmkn olduunca arabirimi ak olarak uygulamay nerdik. Bir snf baka bir snfa geniletebilir ve ayn anda bir arabirim uygulayabilir. Bu durumda, C#, anahtar szckler kullanarak temel snf ve temel arabirim arasnda, Javada olduu gibi bir

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

243

ayrm yapmaz. Bunun yerine, C# konumsal bir belirtim kullanr. nce temel snf adlandrlr, bunu bir virgl takip eder, daha sonra temel arabirim yazlr. Aadaki rnek, Horse snfn, bir Mammal olan, fakat ek olarak ILandBound arabirimini uygulayan bir snf olarak tanmlar:
interface ILandBound { ... } class Mammal { ... } class Horse : Mammal , ILandBound { ... }

Bir Snfa Arabirimi zerinden Bavurmak


Hiyeraride st srada yer alan snf olarak tanmlanm bir deiken kullanarak bir nesneye bavurabildiiniz gibi, ayn ekilde, snfnn uygulad bir arabirim olarak tanmlanm bir deiken kullanarak bir nesneye bavurabilirsiniz. Bir nceki rnei ele alrsak, aadaki gibi, bir ILandBound deikeni kullanarak bir Horse nesnesine bavurabilirsiniz:
Horse myHorse = new Horse(...); ILandBound iMyHorse = myHorse; // alr

Tm atlarn ayaklar olduundan bu bavuru alr, fakat tersi doru deildir. Dntrme yapmadan, bir Horse deikenine bir ILandBound nesnesi atayamazsnz. Bir nesneye bir arabirim zerinden bavurma teknii yararldr; nk trler belirtilen arabirimi uygulad srece, parametre olarak farkl trler alabilen yntemler tanmlayabilmenizi salar. rnein, aada gsterilen FindLandSpeed yntemi, ILandBound arabirimini uygulayan herhangi bir bamsz deiken alabilir:
int FindLandSpeed(ILandBound landBoundMammal) { ... }

Bir arabirim zerinden bir nesneye bavurduunuzda, sadece arabirim zerinden eriilebilen yntemleri arabileceinize dikkat edin.

244

Ksm II

C# Dilini Anlamak

oklu Arabirimlerle almak


Bir snf en fazla bir temel snfa sahip olabilir fakat snrsz sayda arabirim uygulamasna izin verilir. Bir snf yine de tm arabirimlerinden kaltmla ald yntemlerin tmn uygulamak zorundadr. Bir arabirim, bir yap ya da bir snf, birden fazla arabirimden kaltmla alnrsa, arabirimleri virglle ayrarak yazarsnz. Bir snf ayrca bir temel snfa sahipse, arabirimler temel snftan sonra listelenir. rnein, tm otobur hayvanlar iin ChewGrass (GeviGetirme) yntemi ieren IGrazable adnda baka bir arabirim tanmladnz varsayn. Horse snfn u ekilde tanmlayabilirsiniz:
class Horse : Mammal, ILandBound, IGrazable { ... }

Soyut Snflar
ILandBound ve IGrazable arabirimleri, C# uygulamanzda ka farkl memeli tr modellemek istediinize bal olarak, ok sayda farkl snflar tarafndan uygulanabilir. Bu gibi durumlarda, tretilmi snflarn paralarnn ortak uygulamalar paylamalar olduka yaygndr. rnein, aadaki iki snftaki yineleme ok aktr:
class Horse : Mammal, ILandBound, IGrazable { ... void IGrazable.ChewGrass() { Console.WriteLine(Chewing grass); // gevi getirme iin kod }; } class Sheep : Mammal, ILandBound, IGrazable { ... void IGrazable.ChewGrass() { Console.WriteLine(Chewing grass); // gevi getiren at iin olan kodun ayns }; }

Kodda meydana gelen yineleme bir uyar iaretidir. Yinelemeden kanmak ve kodun bakmn kolaylatrmak iin kodu yeniden dzenlemelisiniz. Bu yeniden dzenlemenin yolu, ortak

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

245

uygulamay zellikle bu ama iin yaratlm yeni bir snfa yerletirmektir. Gerekte, snf hiyerarisine yeni bir snf ekleyebilirsiniz. rnein:
class GrazingMammal : Mammal, IGrazable { ... void IGrazable.ChewGrass() { Console.WriteLine(Chewing grass); // gevi getirme iin ortak kod } } class Horse : GrazingMammal, ILandBound { ... } class Sheep : GrazingMammal, ILandBound { ... }

Bu iyi bir zmdr fakat hala tam olarak doru olmayan birey var: Gerekten GrazingMammal snfnn (ya da Mammal snfnn) oluumlarn yaratabilirsiniz. Bu gerekten mantksz. GrazingMammal snf, ortak varsaylan uygulamay salamak iin vardr. Tek amac, kaltmla alnmasdr. GrazingMammal snf, kendi haklarna sahip bir giriten ok, ortak ilevselliklerin bir soyutlamasdr. Bir snfn oluumlarnn yaratlmasna izin verilmediini bildirmek iin, abstract anahtar szcn kullanarak, aka snfn soyut olduunu bildirmeniz gerekir. rnein:
abstract class GrazingMammal : Mammal, IGrazable { ... }

Bir GrazingMammal nesnesi oluturmaya alrsanz, kod derlenmez:


GrazingMammal myGrazingMammal = new GrazingMammal(...); // derlenmez

Soyut Yntemler
Bir soyut snf, soyut yntemler ierebilir. Soyut yntem, bir yntem gvdesi iermemesi dnda, temelde sanal ynteme benzer. (Blm 12de sanal yntemleri grmtnz.) Tretilmi bir snf, bu yntemi geersiz klmak zorundadr. Aadaki rnek, GrazingMammal snfnda, sanal yntem olarak DigestGrass yntemini tanmlar; otul memeliler otlar inemek iin ayn kodu kullanabilirler fakat DigestGrass ynteminin kendi uygulamasn salamak zorundadrlar. Soyut bir snfta varsaylan bir uygulama salamak mantkl deilse

246

Ksm II

C# Dilini Anlamak

ve bir snftan kaltmla almann o yntemin kendi uygulamasn saladndan emin olmak istiyorsanz, bir soyut yntem yararl olacaktr.
abstract class GrazingMammal : Mammal, IGrazable { abstract void DigestGrass(); ... }

Mhrlenmi Snflar
Kaltm her zaman akllca kullanmak kolay deildir. Bir arabirim ya da soyut bir snf yaratrsanz, gelecekte kaltmla alnacak bir eyler yazyorsunuz demektir. Buradaki sorun, gelecei nceden tahmin etmenin zor olmasdr. Pratik yaptka ve deneyim kazandka, esnek, kullanm kolay arabirim, soyut snflar ve snflar hiyerarisi oluturma becerisi gelitirebilirsiniz fakat bu aba gerektirir ve ayrca modellediiniz problemi ok iyi anlamanz gerekir. Bunu yapmann baka bir yolunu bulmak iin, temel bir snf olarak kullanmak amacyla bilerek bir snf tasarlamadnz srece, temel snf olarak grev yapmas imkanszdr. C#, bir snfn temel snf olmamas gerektiine karar verdiyseniz, o snfn temel snf olarak kullanlmasn nlemek iin sealed anahtar szcn kullanmanza imkan tanr. rnein:
sealed class Horse : GrazingMammal, ILandBound { ... }

Herhangi bir snf, Horse snfn temel snf olarak kullanmaya kalkarsa, derleme hatas meydana gelir. Sealed (Mhrlenmi) snf, herhangi bir sanal yntem bildiremez ve soyut bir snf mhrlenemez. Not Bir yap dolayl olarak mhrlenmitir. Bir yapdan asla tretemezsiniz.

Mhrlenmi Yntemler
sealed anahtar szcn, mhrlenmemi bir snfta tek bir yntemi mhrlenmi olarak bildirmek iin de kullanabilirsiniz. Bu, tretilmi bir snfn daha sonra mhrlenmi yntemi geersiz klamayaca anlamna gelir. Sadece bir override yntemi mhrleyebilirsiniz. (Yntemi, sealed override olarak bildirirsiniz.) interface, virtual, override ve sealed anahtar szcklerini u ekilde dnebilirsiniz:
n n n n

Bir arabirim (interface), bir yntemin adn tantr. Bir sanal (virtual) yntem, bir yntemin ilk uygulamasdr. Bir geersiz klma (override) yntemi, bir yntemin dier bir uygulamasdr. Bir mhrlenmi (sealed) yntem, bir yntemin son uygulamasdr.

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

247

Geniletilebilir ereve Uygulamak


Aadaki altrmada, bir C# kaynak dosyasn okumak ve dosyann ieriini tokens (simgeler) (tanmlayclar, anahtar szckler, ileler ve bunun gibi) iinde snflandrmak iin birlikte basit bir ereve (framework) uygulayan arabirimler ve snflarn hiyerarisi ile tanacaksnz. Bu ereve, tipik bir derleyicinin gerekletirebilecei baz grevleri yerine getirir. ereve, zel grevleri gerekletirmek iin, srayla her bir simgeyi ziyaret etmek iin bir teknik salar. rnein, unlar yaratabilirsiniz:
n n

Zengin metin kutusunda kaynak dosyay gsteren grntleyici ziyareti (visitor) snf. Sekmeleri boluklara dntren ve kme parantezlerini doru olarak hizalayan bir yazc ziyareti snf. Her bir tanmlaycnn yazln denetleyen heceleyici ziyareti snf. Byk harfle balayan ortak tanmlayclar ve byk I ile balayan arabirimleri denetleyen klavuz ziyareti snf. Kodda yuvalanm kme parantezlerinin derinliini gsteren karmaklk ziyareti snf. Her yntemdeki satr saysn, her snftaki yelerin saysn ve her kaynak dosyasndaki satrlarn saysn sayan sayc ziyareti snf. Not Bu ereve, ilk olarak Erich Gamma, Richard Helm, Ralph Johnson ve John Vlissides
tarafndan Design Patterns: Elements of Reusable Object-Oriented Software (Tasarm Modelleri: Yeniden Kullanlabilir Nesne-Ynelimli Yazlmn Elemanlar, Addison Wesley Longman, 1995) kitabnda belgelendirilen Visitor modelini uygular.

n n

n n

Kaltm hiyerarisini ve amacn anlayn .


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\Chapter 13\ Tokenizer klasrndeki Tokenizer projesini an. 3. Code and Text Editor penceresinde SourceFile.cs dosyasn grntleyin. SourceFile snf, tokens olarak adlandrlan bir zel dizi alan ierir:
private { new new new new ... }; IVisitableToken[] tokens = KeywordToken(using), WhitespaceToken( ), IdentifierToken(System), PunctuatorToken(;),

248

Ksm II

C# Dilini Anlamak

tokens dizisi, tm IVisitableToken arabirimini (ksaca aklanmtr) uygulayan art arda gelen nesneleri ierir. Birlikte, bu simgeler basit bir hello, world kaynak dosyasnn simgelerini taklit ederler. (Btn bir derleyici bir kaynak dosyay gramer bakmndan inceleyecek, her bir simgenin trn tanmlayacak ve dinamik olarak tokens dizisi yaratacaktr. Her simge, tipik olarak bir switch ifadesi zerinden, uygun snf trn kullanarak yaratlacaktr.) SourceFile snf ayrca, Accept (KabulEt) adnda bir ortak yntem ierir. SourceFile .Accept yntemi, ITokenVisitor trnde tek bir parametreye sahiptir. SourceFile .Accept ynteminin gvdesi simgelerin iinden yinelenir, onlarn Accept yntemlerini arr. Token .Accept yntemi geerli simgeyi, simgenin trne gre deiik yollarla ileyecektir:
public void Accept(ITokenVisitor visitor) { foreach (IVisitableToken token in tokens) { token.Accept(visitor); } }

Bu ekilde, visitor parametresi srayla her simgeyi ziyaret eder. visitor parametresi, visitor nesnesinin ziyaret ettii simgeyi ileyen ziyareti snfnn bir oluumudur. visitor nesnesi simgeyi ilediinde, simgenin kendi snfnn yntemleri devreye girer. 4. Code and Text Editor penceresinde IVisitableToken.cs dosyasn grntleyin. Bu dosya IVisitableToken arabirimini tanmlar. IVisitableToken arabirimi, IVisitable ve IToken arabirimlerinden kaltmla alr fakat kendi yntemlerini tanmlamaz:
interface IVisitableToken : IVisitable, IToken { }

5. Code and Text Editor penceresinde IVisitable.cs dosyasn grntleyin. Bu dosya, IVisitable arabirimini tanmlar. IVisitable arabirimi, Accept adnda tek bir yntem bildirir:
interface IVisitable { void Accept(ITokenVisitor visitor); }

SourceFile snf iindeki simgelerin dizisindeki her nesneye, IVisitableToken arabirimi kullanlarak eriilir. IVisitableToken arabirimi Accept yntemini kaltmla alr ve her simge Accept yntemini uygular. (Bir arabirimden kaltmla alan herhangi bir snf, arabirimdeki tm yntemleri uygulamak zorunda olduundan, her simgenin Accept yntemini uygulamak zorunda olduunu hatrlayn.) 6. View mensnde, Class Viewi tklayn.

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

249

Class View penceresi, Solution Explorer tarafndan kullanlan pencerede grnr. Bu pencere, proje tarafndan tanmlanan ad alanlar, snflar ve arabirimleri grntler. 7. Class View penceresinde, Tokenizer projesini geniletin ve daha sonra {} Tokenizer ad alann an. Bu ad alanndaki snflar ve arabirimler listelenir. Arabirimleri snflardan ayrmak iin kullanlan simgelere dikkat edin. IVisitableToken arabirimini geniletin ve daha sonra Base Types dmn an. IVisitableToken arabiriminin genilettii arabirimler (IToken ve IVisitable), u ekilde grntlenir:

8. Class View penceresinde, IdentifierToken snfn farenin sa dmesiyle tklayn ve daha sonra, Code and Text Editor penceresinde bu snf grntlemek iin Go To Definition tklayn. (Gerekte SourceFile.cs dosyasnda yer almaktadr.) IdentifierToken snf DefaultTokenImpl soyut snfndan ve IVisitableToken arabiriminden kaltmla alr. Aadaki gibi, Accept yntemini uygular:
void IVisitable.Accept(ITokenVisitor visitor) { visitor.VisitIdentifier(this.ToString()); }

Not VisitIdentifier yntemi, visitor nesnesinin uygun grd ekilde, ynteme parametre olarak geen simgeyi iler. Aadaki altrmada, simgeleri belirli renklerle gsteren VisitIdentifier ynteminin uygulamasn salayacaksnz. Bu dosyadaki dier simge snflar da ayn yolu izler.

250

Ksm II

C# Dilini Anlamak

9. Class View penceresinde, ITokenVisitor arabirimini farenin sa dmesiyle tklayn ve daha sonra Go To Definition tklayn. Bu hareket, Code and Text Editor penceresinde ITokenVisitor.cs kaynak dosyasn grntler. ITokenVisitor arabirimi, her simge tr iin bir yntem ierir. Bu arabirimlerin, soyut snflarn ve snflarn hiyerarisinin sonucu olarak, ITokenVisitor arabirimini uygulayan bir snf yaratabilir, bu snfn bir oluumunu yaratabilir ve SourceFile nesnesinin Accept yntemine parametre olarak bu oluumu geirebilirsiniz. rnein:
class MyVisitor : ITokenVisitor { public void VisitIdentifier(string token) { ... } public void VisitKeyword(string token) { ... } } ... class Program { static void Main() { SourceFile source = new SourceFile(); MyVisitor visitor = new MyVisitor(); source.Accept(visitor); } }

Main yntemindeki kod, kaynak dosyasndaki her simgenin visitor nesnesindeki izleme yntemini armas ile sonulanr. Aadaki altrmada, ITokenVisitor arabiriminden ve onun uygulamalarndan treyen ve ziyaret etme tekniini kullanarak renkli szdizimi ile (rnein, anahtar szckleri mavi renkte) zengin metin kutusunda kaynak kodumuzdaki simgeleri grntleyen bir snf yaratacaksnz.

ColorSyntaxVisitor snfn yazn


1. Design View penceresinde Color Syntax formunu grntlemek iin, Solution Explorerda, (Class View penceresinin altndaki Solution Explorer sekmesini tklayn) Window1.xaml ift tklayn.

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

251

ereveyi test etmek iin bu formu kullanacaksnz. Bu form, simgeletirilecek dosyay amak iin bir dme ve simgeleri grntlemek iin bir zengin metin kutusu ierir:

Formun ortasndaki zengin metin kutusu codeText olarak ve dme de Open olarak adlandrlmtr. Not Zengin metin kutusu, basit biimlendirilmemi metinden ok biimlendirilmi ierik
grntleyebilmesi dnda, sradan metin kutusu gibidir.

2. Formu farenin sa dmesiyle tklayn ve sonra Code and Text Editor penceresinde, formun kodunu grntlemek iin View Codeu tklayn. 3. openClick yntemini bulun. Kullanc Open dmesini tkladnda bu yntem arlr. SourceFile snfnda tanmlanm simgelerin ColorSyntaxVisitor nesnesi kullanlarak zengin metin kutusunda grntlenmesi iin bu yntemi uygulamak zorundasnz. openClick yntemine aada koyu harflerle gsterilen kodu ekleyin:
private void openClick(object sender, RoutedEventArgs e) { SourceFile source = new SourceFile(); ColorSyntaxVisitor visitor = new ColorSyntaxVisitor(codeText); source.Accept(visitor); }

SourceFile snfnn Accept ynteminin tm simgeler zerinde yinelenerek, belirtilen ziyaretiyi kullanarak her simgeyi ilediini hatrlayn. Bu rnekte, ziyareti, her simgeyi bir renkle gsteren ColorSyntaxVisitor nesnesidir. Not Geerli uygulamada, Open dmesi sadece SourceFile snfnda kodlanm veriyi

kullanr. Tmyle ilevsel uygulamada, Open dmesi, kullancy metin dosyasnn adn vermesi iin uyarr ve daha sonra metin dosyasn gramer bakmndan inceler ve Accept yntemini armadan nce, SourceFile snfnda gsterilen biimde simgeletirir.

252

Ksm II

C# Dilini Anlamak

4. Code and Text Editor penceresinde ColorSyntaxVisitor.cs dosyasn an. ColorSyntaxVisitor snf ksmen yazlmtr. Bu snf, ITokenVisitor arabirimini uygular ve simgeleri grntlemek iin kullanlan, balang deeri olarak zengin metin kutusuna target adnda bir bavuru atamak iin bir kurucu ve iki alan ierir. Greviniz, ITokenVisitor arabiriminden kaltmla alnan yntemleri uygulamak ve ayrca zengin metin kutusuna simgeleri yazacak olan bir yntem yaratmaktr. 5. Code and Text Editor penceresinde, ColorSyntaxVisitor snfna, aadaki Write yntemini ekleyin:
private void Write(string token, SolidColorBrush color) { target.AppendText(token); int offsetToStartOfToken = -1 * token.Length - 2; int offsetToEndOfToken = -2; TextPointer start = target.Document.ContentEnd.GetPositionAtOffset(offsetToStartOfToken); TextPointer end = target.Document.ContentEnd.GetPositionAtOffset(offsetToEndOfToken); TextRange text = new TextRange(start, end); text.ApplyPropertyValue(TextElement.ForegroundProperty, color); }

Bu kod, target deikeni tarafndan tanmlanan her simgeyi belirtilen rengi kullanarak zengin metin kutusuna ekler. start ve end adndaki iki TextPointer deikeni, zengin metin kutusunda yeni simgenin nerede baladn ve nerede bittiini gsterir. (Bu konumlarn nasl hesaplandn dnmeyin. Merak ediyorsanz, ContentEnd zelliinin kollar olduklarndan negatif deerlerdir.) TextRange tr text deikeni, yeni eklenen simgeyi gsteren zengin metin kutusundaki metin parasna bavuru salar. ApplyPropertyValue yntemi, bu metnin rengini ikinci parametrede belirtilen renge ayarlar. ColorSyntaxVisitor snfndaki eitli ziyaret yntemlerinin her biri, kodu renkli olarak grntlemek iin, uygun renkle birlikte bu Write yntemini aracaktr. 6. Code and Text Editor penceresinde, ColorSyntaxVisitor snfna ITokenVisitor arabirimini uygulayan aadaki yntemleri ekleyin. Anahtar szckler iin Brushes.Blue, StringLiterals iin Brushes.Green ve dier tm yntemler iin de Brushes.Black olarak belirleyin. (Brushes, System.Windows.Media ad alannda tanmlanm bir snftr.) Bu kodun arabirimi ak olarak uyguladna; her yntemi arabirim ad ile tanmladna dikkat edin.
void ITokenVisitor.VisitComment(string token) { Write(token, Brushes.Black); } void ITokenVisitor.VisitIdentifier(string token) { Write(token, Brushes.Black); }

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

253

void ITokenVisitor.VisitKeyword(string token) { Write(token, Brushes.Blue); } void ITokenVisitor.VisitOperator(string token) { Write(token, Brushes.Black); } void ITokenVisitor.VisitPunctuator(string token) { Write(token, Brushes.Black); } void ITokenVisitor.VisitStringLiteral(string token) { Write(token, Brushes.Green); } void ITokenVisitor.VisitWhitespace(string token) { Write(token, Brushes.Black); }

Token.Accept yntemini geersiz klan simgenin yntemlerinden hangisinin arldn belirleyen, simge dizisindeki simgenin snf trdr. pucu Bu yntemleri, Code and Text Editor penceresinde dorudan yazabilirsiniz ya da her
biri iin varsaylan uygulama retmek ve daha sonra da yntem gvdesini uygun kod ile deitirmek iin Visual Studio 2008i kullanabilirsiniz. Bunun iin, mhrlenmi (sealed) ColorSyntaxVisitor : ITokenVisitor snfnn, snf tanmndaki ITokenVisitor tanmlaycsn farenin sa dmesiyle tklayn. Ksayol mensnde, Implement Interfacei iaret edin ve Implement Interface Explicitly tklayn. Her yntem, bir NotImplementedException zel durumu oluturan bir ifade ierir. Bu kodu, burada gsterilen kod ile deitirin.

7. Build mensnde, Build Solution tklayn. Hatalar dzeltin ve gerekirse yeniden yaplandrn. 8. Debug mensnde, Start Without Debuggingi tklayn. Color Syntax formu grnr. 9. Formdaki Open dmesini tklayn. Kod paras, anahtar szckler mavi ve dize hazr bilgileri yeil olacak biimde zengin metin kutusunda grntlenir.

254

Ksm II

C# Dilini Anlamak

10. Formu kapatn ve Visual Studio 2008e dnn.

Bir Snf izimi retmek


Bir projedeki arabirimler ve snflarn hiyerarisini grntlemek ve zerinde hareket etmek iin Class View penceresi kullanldr. Visual Studio 2008, ayrca bu bilgiyi izimsel olarak gsteren snf izimini oluturmanz salar. (Ayrca, yeni snflar ve arabirimler eklemek, yntemler, zellikler ve dier snf yelerini tanmlamak iin snf izimini kullanabilirsiniz.) Not Bu zellik, Visual C# 2008 Express Editionda yoktur. Yeni bir snf izimi oluturmak iin, Project mensnde Add New Item tklayn. Add New Item iletiim kutusunda, Class Diagram ablonunu sein ve sonra da Addi tklayn. Bu ilem, bo bir izim oluturur. Toolboxdaki Class Designer kategorisinden eleri srkleyerek, yeni trler yaratabilirsiniz. Class View penceresinden snflar ayr ayr srkleyerek ya da ait olduklar ad alanlarn srkleyerek tm mevcut snflarn izimini oluturabilirsiniz. izim, snflar ve arabirimler arasndaki ilikileri gsterir. Snfn ieriini gstermek iin her snfn tanmn geniletebilirsiniz. Bir sonraki sayfadaki resimde gsterildii gibi, izimi daha okunabilir hale getirmek iin, snflar ve birimleri srkleyerek hareket ettirebilirsiniz.

Blm 13

Arabirimler Yaratmak ve Soyut Snflar Tanmlamak

255

Anahtar Szck Bileimlerini zetlemek


Aadaki tablo, snflar ve arabirimler yaratrken kullanlabilecek eitli geerli (evet), geersiz (hayr) ve zorunlu (gerekli) anahtar szck bileenlerini zetlemektedir.
Anahtar Szck
abstract new override private protected public sealed virtual
1 Bir 2 Bir 3 Bir 4 Bir

Arabirim
hayr evet1 hayr hayr hayr hayr hayr hayr

Soyut Snf
evet evet evet evet evet evet evet evet

Snf
hayr evet evet evet evet evet evet evet

Sealed snf
hayr evet evet evet evet evet gerekli hayr

Yap
hayr hayr2 hayr3 evet hayr4 evet hayr hayr

arabirim baka bir arabirime yaylabilir ve ayn imzayla yeni bir yntemi tantabilir. yap, yapnn saklayabilecei yntemleri ieren System.Objectten dolayl olarak treyebilir. yap, sanal yntemleri ieren System.Objectten dolayl olarak treyebilir. yap dolayl olarak mhrldr ve kendisinden tretilemez.

256

Ksm II
n

C# Dilini Anlamak

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 14e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 13 Hzl Bavuru


Bunun in
Bir arabirim bildirmek

unu Yapn
interface anahtar szcn kullann. rnein:
interface IDemo { string Name(); string Description(); }

Bir arabirim uygulamak

Kaltmdaki szdiziminin aynsn kullanan bir snf bildirin ve sonra arabirimin tm ye ilevlerini oluturun. rnein:
class Test : IDemo { public string IDemo.Name() { ... } public string IDemo.Description() { ... } }

Soyut yntemler ieren, bir temel snf olarak kullanlabilecek bir soyut snf yaratmak

abstract anahtar szcn kullanarak bir snf bildirin. Her soyut yntem iin, abstract anahtar szc ile, yntem gvdesi olmadan bir yntem bildirin. rnein:
abstract class GrazingMammal { abstract void DigestGrass(); ... }

Temel snf olarak kullanlamayan bir mhrlenmi snf yaratmak

Snf sealed anahtar szcn kullanarak bildirin. rnein:


sealed class Horse { ... }

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak


Bu blm tamamladktan sonra renecekleriniz:
n n n

p toplamay kullanarak sistem kaynaklarn ynetmek . Bir ykc kullanarak nesne sonlandrldnda alacak kodu yazmak . try/finally ifadesi yazarak, bilinen bir zamanda bir kayna zel durum olmadan serbest brakmak. using ifadesi yazarak, bilinen bir zamanda bir kayna zel durum olmadan serbest brakmak.

nceki blmlerde, deikenleri ve nesneleri nasl yaratacanz grdnz ve deiken ve nesneler yarattnzda nasl bellek ayrldn anlam olmalsnz. (Deeri trleri yn zerinde ve bavuru trleri de bekten alnan bellek zerinde yaratlr.) Bilgisayarlar sonsuz bellee sahip deildir, bu nedenle bir deiken ya da bir nesne artk kullanlmadnda ayrlan bellek iade edilmelidir. Veri trleri kapsam dna ktnda yok edilir ve bellekleri iade edilir. Bu bir para kolaydr. Ya bavuru trleri? new anahtar szcn kullanarak bir nesne yaratrsnz. Fakat bir nesne ne zaman ve nasl ortadan kaldrlr? Bu blm tmyle bununla ilgilidir.

Bir Nesnenin mr ve mr Uzunluu


lk olarak, bir nesne yarattnzda neler olduunu tekrarlayalm. new ileci kullanarak bir nesne yaratrsnz. Aadaki rnek, TextBox snfnn yeni bir oluumunu yaratr. (Bu snf, Microsoft .NET Framework iinde salanmtr.)
TextBox message = new TextBox(); // TextBox bavuru trdr

Sizin bak anzdan, new ilemi atomik bir ilemdir fakat daha derine inildike, nesne yaratm gerekten iki aamal bir sretir: 1. new ilemi, bekten ham bellek yn ayrr. Nesne yaratmnn bu aamas zerinde hibir denetiminiz yoktur. 2. new ilemi, ham bellek ynn bir nesneye dntrr; nesneye balang deeri atamas gerekir. Bir kurucu kullanarak bu aamay denetleyebilirsiniz.
257

258

Ksm II

C# Dilini Anlamak

Not C++ programclar, C#ta yerleimi denetlemek iin newin ar yklenemeyeceine dikkat etmelidir. Bir nesne yarattktan sonra, nokta ileci (.) kullanarak nesnenin yelerine eriebilirsiniz. rnein, TextBox snf, aadaki gibi eriebileceiniz, Text adnda bir ye ierir:
message.Text = People of Earth, your attention please;

Dier bavuru deikenlerinin ayn nesneye bavurmasn salayabilirsiniz:


TextBox messageRef = message;

Bir nesneye ka adet bavuru oluturabilirsiniz? stediiniz kadar! Bu nesnenin mrn etkiler. alma zamannn tm bu bavurular izlemesi gerekir. message deikeni yok olursa (kapsam dna karsa), dier deikenler (messageRef gibi) yine de var olabilir. Bir nesnenin mr, belirli bir bavuru deikenine bal olamaz. Bir nesne, sadece tm bavurular yok olduunda ortadan kaldrlabilir ve bellei iade edilebilir. Not C++ program gelitiricileri, C#ta silme ileminin olmadna dikkat etmeliler. Bir nesnenin
ne zaman ortadan kaldrlacan alma zaman denetler.

Nesne yaratm gibi, nesne lm de iki aamal bir ilemdir. Nesnenin yok edilmesinin iki aamas, yaratlmasnn iki aamasn tam olarak yanstmaktadr: 1. alma zamannn baz balamalar yapmas gerekir. Bir ykc yazarak bunu denetleyebilirsiniz. 2. alma zamannn daha nce nesneye ait olan bellei bee geri dndrmesi gerekir; nesnenin iinde yaad bellein serbest braklmas gerekir. Bu aamada bir denetime sahip deilsiniz. Bir nesneyi yok etme ve bellek alann bee geri dndrme ilemi, p toplama olarak bilinir.

Ykclar Yazmak
Bir nesne iin p toplandnda gerekli olan balama ilemlerini gerekletirmek iin bir ykc kullanabilirsiniz. Ykc, biraz kurucuya benzeyen zel bir yntemdir. Farkl olarak alma zaman nesneye son bavuru da yok olduktan sonra ykcy arr. Bir ykc yazmak iin gerekli szdizimi tilda (~) ve ardndan snfn adnn yazlmas biimindedir. rnein, aada,

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

259

kurucudaki statik deikenin deerini artrarak ve ykcdaki ayn statik deikenin deerini azaltarak mevcut oluumlarn saysn hesaplayan basit bir snf grebilirsiniz:
class Tally { public Tally() { this.instanceCount++; } ~Tally() { this.instanceCount--; } public static int InstanceCount() { return this.instanceCount; } ... private static int instanceCount = 0; }

Ykclar iin baz ok nemli kstlamalar vardr:


n

Ykclar sadece bavuru trlerine uygulanr. Bir struct gibi veri trlerinde bir ykc bildiremezsiniz.
struct Tally { ~Tally() { ... } // derleme zaman hatas }

Bir ykc iin bir eriim deitiricisi (public gibi) belirtemezsiniz. Kendi kodunuzda asla bir ykc armazsnz (p toplama olarak adlandrlan alma zaman paras bunu sizin iin yapar).
public ~Tally() { ... } // derleme zaman hatas

Bir ykcy hibir zaman parametrelerle bildiremezsiniz ve ykc bir parametre alamaz. Bunun nedeni de, kendinizin bir ykc armayacanzdr.
~Tally(int parameter) { ... } // derleme zaman hatas

Derleyici, otomatik olarak bir ykcy Object.Finalize ynteminin geersiz klma biimine dntrr. Dier bir deyile derleyici aadaki ykcy:
class Tally { ~Tally() { ... } }

260

Ksm II

C# Dilini Anlamak

una evirir:
class Tally { protected override void Finalize() { try { ... } finally { base.Finalize(); } } }

Derleyicinin oluturduu Finalize yntemi, ykc gvdesini bir try blounda ierir; bunu temel snftaki Finalize yntemini aran finally blou izler. (try ve finally anahtar szckleri Hatalar ve zel Durumlar Ynetmek balkl Blm 6da anlatlmtr.) Bu, bir ykcnn her zaman temel snf ykcsn armasn salar. Sadece derleyicinin bu dnm yapabileceini anlamak nemlidir. Kendiniz Finalize yntemini geersiz klamazsnz ve aramazsnz.

Neden p Toplayc Kullanlr?


C# kodu kullanarak hibir zaman bir nesneyi kendi kendinize yok edemeyeceinizi anlam olmalsnz. Bunun iin bir szdizimi olmad gibi, C# tasarmclarnn nesneleri yok etmek iin kod yazlmasn yasaklamaya karar vermelerinin ok ak nedenleri vardr. Nesneleri yok etmek sizin sorumluluunuzda olsayd, er ya da ge aadaki durumlar meydana gelecekti:
n

Bir nesneyi yok etmeyi unutacaktnz. Bu, nesne ykcsnn (varsa) almayaca ve bu bellein yna yeniden verilmeyecei anlamna gelir. Kolayca bellei doldurabilirdiniz. Etkin bir nesneyi yok etmeye alacaktnz. Hatrlayn, nesnelere bavurular yoluyla eriilir. Bir snf yok edilmi bir nesneye bavuruyu tutarsa, bu sallantda bir bavuru olacakt. Sallantdaki bir bavuru, ya kullanlmayan bellee ya da ayn bellek alanndaki tamamyla farkl bir nesneye bavurur. Her iki durumda da byle sallantda olan bir bavuruyu kullanmak tanmsz olur. Ayn nesneyi birden ok kez yok etmeye alacaktnz. Bu, ykcdaki koda bal olarak bir felaket olabilir.

Bu problemler, tasarm amalarnda salaml ve gvenlii en st srada tutan C# gibi bir programlama dilinde kabul edilemez. Nesnelerin yok edilmesi iin sizin yerinize p toplayc sorumludur. p toplayc unlar garanti eder:
n

Her nesnenin ykcs alacak ve her nesne yok edilecektir. Program sonlandnda btn etkin nesneler yok edilecektir. Her nesne, tam olarak sadece bir defa yok edilecektir.

Blm 14
n

p Toplama ve Kaynak Ynetimini Kullanmak

261

Her nesne, sadece nesne eriilemez olduunda, yani ona bavuran tm bavurular ortadan kalktnda yok edilecektir.

Bu garantiler byk lde yararldr ve sizi, programcy, skc dzenleme ilerinden ve kolayca hata yapma olaslndan kurtarr. Programn mantna odaklanmanz ve daha retken olmanz salar. p toplama ne zaman meydana gelir? Bu tuhaf bir soru gibi gelebilir. Sonuta, elbette, bir nesne daha fazla gerekli olmadnda p toplama meydana gelir. Fakat hemen meydana gelmesi art deildir. p toplama masrafl bir sre olabilir, bu nedenle alma zaman sadece gerektiinde (kullanlabilir bellek yetersiz olmaya baladnda) ve mmkn olduunca ok p toplar. Birka byk bellek p toplamak, ok sayda kk bellek p krnts toplamaktan daha verimlidir! Not Bir programda, System.GC.Collect statik yntemini ararak p toplamay balatabilirsiniz.
Bununla birlikte, birka durum dnda, bu nerilmez. System.GC.Collect yntemi p toplamay balatr fakat ilem ezamanl olarak almaz ve yntem ars tamamlandnda, hala nesnelerinizin yok edilip edilmediini bilemezsiniz. Ne zaman p toplanacana en iyisi alma zaman karar versin!

p toplamann bir zellii de udur: Nesnelerin hangi srayla yok edileceini bilemezsiniz ve bu sralamaya gvenmemelisiniz. Anlalmas gereken son ey en nemlisidir: ykclar, nesneler iin p toplanana kadar almaz. Bir ykc yazdysanz, altrlacan bilirsiniz fakat ne zaman alacan bilemezsiniz.

p Toplayc Nasl alr?


p toplayc kendi temasnda (thread) alr ve sadece belirli zamanlarda uygulanr (tipik olarak, uygulamanz bir yntemin sonuna ulatnda). p toplayc alrken, uygulamanzda alan dier temalar geici olarak durur. Bunun nedeni, p toplaycnn nesneleri hareket ettirmesinin ve nesne bavurularn gncellemesinin gerekebilmesidir; bunu nesneler kullanlrken yapamaz. p toplayc altnda aadaki admlar gerekletirir: 1. Btn eriilebilir nesnelerin bir grafiini oluturur. Bunu, yineleyen biimde nesnelerin iindeki bavuru alanlarn izleyerek yapar. p toplayc bu grafii ok dikkatli biimde oluturur ve dairesel bavurularn sonsuz dngye girmediini garantiler. Bu grafikte bulunmayan btn nesnelerin eriilmez olduu varsaylr. 2. Eriilmez olan nesnelerden herhangi birinin bir ykcya sahip olup olmadn denetler (sonlandrma olarak adlandrlan ilem) Sonlandrlmas gereken eriilemez nesneler, freachable queue (F-reachable olarak okunur) olarak adlandrlan bir sraya konur.

262

Ksm II

C# Dilini Anlamak

3. Geri kalan eriilemez nesnelerin (sonlandrlmas gerekmeyenler) bellek alan iade edilir. p toplayc bu iade ilemini eriilebilir nesneleri bekte aaya tayarak ve bylece bei birletirip en stteki bellei boaltarak gerekletirir. p toplayc eriilebilir bir nesneyi tadnda, o nesneye yaplan btn bavurular da gncelletirir. 4. p toplayc imdi dier temalarn kaldklar yerden devam etmelerine izin verir. 5. Sonlandrlmas gereken eriilmez nesneler (u anda freachable queuede olanlar) kendi temalar tarafndan sonlandrlr.

neriler
Ykc ieren snflar yazmak, kodunuzun ve p toplama iinin karmakln artrr ve programnzn almasn yavalatr. Programnz hi ykc iermezse, p toplaycnn eriilmez nesneleri freachable queue srasna yerletirmesine ve onlar sonlandrmasna gerek yoktur. Akas, bir eyi yapmamak yapmaktan daha hzldr. Bu nedenle, gerekten gerekmedike ykclar kullanmaktan kanmaya aln. rnein, bunun yerine using ifadesi kullann. (Bu blmdeki using fadesi balna bakn.) Bir ykc yazarsanz, ok dikkatli yazmalsnz. zellikle, ykcnz, ykclar p toplayc tarafndan zaten arlm olabilecek olan dier nesneleri arp armadnn farknda olmalsnz. Unutmayn, sonlandrmann sras belirsizdir. Bu nedenle, ykclarn bir dierine bal olmadndan ya da bir dier ykc ile akmadndan emin olun. (rnein, ayn kayna serbest brakmaya alan iki ykcya sahip olmayn.)

Kaynak Ynetimi
Bazen bir ykcda bir kayna serbest brakmak nerilmez; baz kaynaklar p toplayc gerekten onlar serbest brakana kadar istee bal bir sre serbest braklmam olarak kalmalarn gerektirecek kadar deerlidir ve az bulunur. Az bulunur kaynaklarn serbest braklmalar ve bunun mmkn olan en ksa srede yaplmas gerekir. Bu tr durumlarda, tek seeneiniz kayna sizin serbest brakmanzdr. Bir yok etme yntemi yaratarak bunu salayabilirsiniz. Bir yok etme yntemi, bir kayna ak olarak yok etme yntemidir. Bir snf bir yok etme yntemine sahipse, bu yntemi ararak kaynan ne zaman serbest braklacan denetleyebilirsiniz. Not Yok etme yntemi terimi, bir yntem ad olmaktan ok yntemin amacn gsterir. Bir yok
etme yntemi herhangi geerli bir C# tanmlaycs kullanlarak adlandrlabilir.

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

263

Yok Etme Yntemleri


Bir yok etme yntemine sahip snfa rnek, System.IO ad alannn TextReader snfdr. Bu snf, art arda girilen karakterleri okumak iin bir teknik salar. TextReader snf, karakter akn sonlandran, Close adnda bir sanal yntem ierir. StreamReader snf (bir ak dosya gibi bir aktan karakterleri okur) ve StringReader snfnn (bir dizeden karakterleri okur) her ikisi de TextReader snfndan trer ve her ikisi de Close yntemini geersiz klar. StreamReader snfn kullanarak bir dosyadaki metnin satrlarn okuyan ve daha sonra ekranda grntleyen rnek aadadr:
TextReader reader = new StreamReader(filename); string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } reader.Close();

ReadLine yntemi metnin bir sonraki satrn bir dize olarak okur. Akta baka bir ey kalmamsa, ReadLine yntemi null dndrr. reader ile iiniz bittiinde, Close yntemini armak, dosya ileme ve ilgili kaynaklar serbest brakmak iin nemlidir. Bununla birlikte, bu rnekle ilgili bir sorun vardr: zel durum-gvenli deildir. ReadLine ya da WriteLine arlmas bir zel durum oluturursa, Close yntemi arlmayacaktr. Bu durum sk meydana gelirse, dosya ilemeyi bitiremez ve baka dosya aamazsnz.

zel Durum-Gvenli Yok Etme


Bir yok etme ynteminin (Close gibi), zel durum olsa da olmasa da her zaman arldndan emin olmann yolu, yok etme yntemini bir finally blou iinde armaktr. Bir nceki rnein bu yntemi kullanan biimi aadaki gibidir:
TextReader reader = new StreamReader(filename); try { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } finally { reader.Close(); }

264

Ksm II

C# Dilini Anlamak

Bu biimde bir finally blou kullanmak, ie yarar fakat onun ideal zm olmasna engel olan baz kt yanlar vardr:
n

Birden ok kayna brakacaksanz hzla hantallar (i ie gemi birok try ve finally blou ile urarsnz.) Baz durumlarda, kodu deitirmeniz gerekir. (rnein, kaynak bavurularnn bildirimlerinin srasn deitirmeniz gerekebilir, bavuruyu null olarak balatmay unutmayn ve bavurunun finally blounda null olmadndan emin olun.) zmn bir sanaln yaratamazsnz. Bunun anlam, zmn anlalmasnn zor olduu ve gerekli olduunda her seferinde yinelenmesi gerektiidir. Kaynaa yaplan bavuru finally bloundan sonra da kapsam iinde kalr. Bunun anlam, serbest brakldktan sonra bir kayna kazayla kullanabileceinizdir.

using ifadesi tm bu sorunlar zmek iin tasarlanmtr.

using fadesi
using ifadesi, kaynaklarn mrn denetlemek iin ak bir teknik salar. Bir nesne yaratabilirsiniz ve bu nesne using ifadesi bittiinde yok edilir. nemli Bu blmde gsterilen using ifadesini kapsama bir ad alan getiren using ynergesi ile kartrmayn. Ne yazk ki, ayn anahtar szck iki farkl anlam tamaktadr. using ifadesinin szdizimi aadaki gibidir:
using ( type variable = initialization ) { StatementBlock }

Kodunuzun her zaman bir TextReader zerinde Close yntemini ardndan emin olmann en iyi yolu udur:
using (TextReader reader = new StreamReader(filename)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } }

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

265

Bu using ifadesi, tam olarak aadaki eviriye denktir:


{ TextReader reader = new StreamReader(filename); try { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } finally { if (reader != null) { ((IDisposable)reader).Dispose(); } } }

Not using ifadesi, kapsam amalar iin kendi blounu salar. Bu dzenleme, using ifadesinde bildirdiiniz deikenin, gml ifadenin sonunda otomatik olarak kapsam dna kmas ve yok edilen kaynaa kazara eriemeyeceiniz anlamna gelir. using ifadesinde bildirdiiniz deiken, IDisposable arabirimini uygulayan trde olmak zorundadr. IDisposable arabirimi System ad alannda bulunur ve yalnzca Dispose yntemini ierir:
namespace System { interface IDisposable { void Dispose(); } }

StreamReader snfnn IDisposable arabirimini uygulamas ve ak bitirmek iin Dispose ynteminin Closeu armas olan bir durumdur. Bir kaynan her zaman serbest brakldndan emin olmak iin ak, zel durum-gvenli ve gl bir yol olarak using ifadesini kullanabilirsiniz. Bu yaklam, try/finally zmndeki tm sorunlar zer. Artk aadaki zelliklere sahip bir zmnz var:
n n n n

Birden ok kayna yok etmeniz gerektiinde kolayca leklenebilir. Program kodunun mantn bozmaz. Sorunu soyutlar ve yinelemeden kanr. Gldr. using ifadesi iinde bildirilen deikeni (bu rnekte reader deikeni) using ifadesi sonlandktan sonra kullanamazsnz, nk artk kapsam iinde deildir (derleme zaman hatas alrsnz).

266

Ksm II

C# Dilini Anlamak

Bir Ykcdan Dispose Yntemini armak


Bir snf yazarken, bir ykc yazmal msnz ya da IDisposable yntemini mi uygulamalsnz? Bir ykcya yaplan ar gerekleecektir fakat ne zaman gerekleeceini bilemezsiniz. Dier taraftan, Dispose yntemine yaplan arnn ne zaman gerekleeceini tam olarak bilirsiniz fakat gerekten gerekleeceinden emin olamazsnz, nk programcnn bir using ifadesi yazmay unutmamasna baldr. Bununla birlikte, Dispose yntemini ykcdan ararak her zaman arlacandan emin olabilirsiniz. Bu, yararl bir yedek gibi alr. Dispose yntemini armay unutabilirsiniz fakat en azndan program kapatlrken bile olsa, arlacandan emin olabilirsiniz. Bunu nasl yapabileceinizi gsteren bir rnek aadadr:
class Example : IDisposable { ... ~Example() { Dispose(); } public virtual void Dispose() { if (!this.disposed) { try { // kt kayna burada serbest brak } finally { this.disposed = true; GC.SuppressFinalize(this); } } } public void SomeBehavior() // rnek yntem { checkIfDisposed(); ... } ... private void checkIfDisposed() { if (this.disposed) { throw new ObjectDisposedException(Example: object has been disposed); } } private Resource scarce; private bool disposed = false; }

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

267

Example snfnn aadaki zelliklerine dikkat edin:


n n n n

Snf IDisposable arabirimini uygular. Ykc Dispose yntemini arr. Dispose yntemi ortaktr ve herhangi bir zamanda arlabilir. Dispose yntemi gvenli bir biimde birden ok kez arlabilir. disposed deikeni yntemin zaten alp almadn gsterir. Az bulunur bir kaynak, sadece yntem ilk arldnda serbest braklr. Dispose yntemi statik GC.SuppressFinalize yntemini arr. Bu yntem, p toplaycnn bu nesne zerinde ykc armasn engeller, nk nesne henz sonlandrlmtr. Snfn (SomeBehavior gibi) tm normal yntemleri, nesnenin yok edilip edilmediini denetler. Yok edildiyse, bir zel durum oluturur.

Kodu zel Durum-Gvenli Yapmak


Aadaki altrmada, bir para kodu zel durum gvenli yapmak iin yeniden yazacaksnz. Kod, bir metin dosyasn aar, bir defada bir satr olacak biimde okur, bu satrlar ekranda bir metin kutusuna yazar ve daha sonra metin dosyasn kapatr. Bununla birlikte, dosya okunurken ya da satrlar metin kutusuna yazlrken bir zel durum oluursa, metin dosyasn kapatmak iin yaplan ar atlanr. Bir using ifadesi kullanarak kodu yeniden yazacak ve bylece kodu zel durumlardan arndracaksnz.

Bir using ifadesi yazn


1. Microsoft Visual Studio 2008i an. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 14\ UsingStatement klasrnde yer alan UsingStatement projesini an. 3. Debug mensnde Start Without Debuggingi tklayn. Bir Windows Presentation Foundation (WPF) formu alr. 4. Form zerinde Open File tklayn. 5. Open iletiim kutusunda, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 14\UsingStatement\UsingStatement klasrne gidin ve Window1.xaml. cs kaynak dosyasn sein. Bu, uygulama iin kaynak dosyadr.

268

Ksm II

C# Dilini Anlamak

6. Open tklayn. Dosya ierii, aadaki gibi form zerinde gsterilir:

7. Visual Studio 2008e dnmek iin formu kapatn. 8. Code and Text Editor penceresinde Window1.xaml.cs dosyasn an ve daha sonra openFileDialogFileOk yntemini bulun. Yntem u ekilde grnmelidir:
private void openFileDialogFileOk(object sender, System.ComponentModel.CancelEventArgs e) { string fullPathname = openFileDialog.FileName; FileInfo src = new FileInfo(fullPathname); fileName.Text = src.Name; source.Clear(); TextReader reader = new StreamReader(fullPathname); string line; while ((line = reader.ReadLine()) != null) { source.Text += line + \n; } reader.Close(); }

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

269

fileName, openFileDialog ve source deikenleri Window1 snfnn zel alandr. Bu koddaki sorun, reader.Closea yaplan arnn gerekleeceinin kesin olmamasdr. Dosyann almasndan sonra bir zel durum oluursa, yntem sonlanacak fakat dosya uygulama bitene kadar ak kalacaktr. 9. openFileDialogFileOk yntemini deitirin ve dosyay ileyen kodu bir using ifadesi iine yerletirin. TextReader nesnesini kapatan ifadeyi kaldrn.
private void openFileDialogFileOk(object sender, System.ComponentModel.CancelEventArgs e) { string fullPathname = openFileDialog.FileName; FileInfo src = new FileInfo(fullPathname); fileName.Text = src.Name; source.Clear(); using (TextReader reader = new StreamReader(fullPathname)) { string line; while ((line = reader.ReadLine()) != null) { source.Text += line + \n; } } }

using ifadesi tamamlandnda, StreamReader snfnn Dispose yntemi tarafndan otomatik olarak arlacandan, reader.Close arsna gerek yoktur. Bu, using ifadesinin doal olarak bitmesini ya da zel durum nedeniyle sonlanmasn salar. 10. Debug mensnde Start Without Debuggingi tklayn. 11. Uygulamann nceki gibi altndan emin olun ve daha sonra formu kapatn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 14e gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

270

Ksm II

C# Dilini Anlamak

Blm 14 Hzl Bavuru


Bunun in
Bir ykc yazmak

unu Yapn
Ad snfn adyla ayn olan ve (~) ile balayan bir yntem yazn. Yntem, deitiriciye (public gibi) eriememelidir ve parametresi olmamaldr ya da bir deer dndrmemelidir. rnein:
class Example { ~Example() { ... } }

Bir ykc armak p toplaycy zorlamak (nerilmez) Bir kayna bilinen bir zamanda brakmak (zel durum uygulamay keserse, bellek kaybetme riskini gze alarak)

Bir ykc aramazsnz. Sadece p toplayc bir ykc arabilir. System.GC.Collecti arn. Bir yok etme yntemi (bir kayna yok eden bir yntem) yazn ve onu programda arn. rnein:
class TextReader { ... public virtual void Close() { ... } } class Example { void Use() { TextReader reader = ...; // okuyucuyu kullan reader.Close(); } }

Blm 14

p Toplama ve Kaynak Ynetimini Kullanmak

271

Bir kayna bilinen bir zamanda zel durum gvenli olarak brakmak (nerilen yaklam)

Kayna bir using ifadesi ile serbest brakn. rnein:


class TextReader : { ... public virtual { // Closeu } public virtual { ... } } IDisposable

void Dispose() ar void Close()

class Example { void Use() { using (TextReader reader = ...) { // okuyucuyu kullan } } }

Adm Adm Microsoft Visual C# 2008

Bileenler Yaratmak
Bu ksmdaki konular: Blm 15 . Alanlara Erimek in zellikler Uygulamak . . . . . . . . . . . . . . . . . . . . Blm 16 . Dizinleyicileri Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 17 . Program Akn Kesmek ve Olaylar lemek . . . . . . . . . . . . . . . . . . . . Blm 18 . Genericse Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 19 . Koleksiyonlar Numaralandrmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 20 . Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak . . . . . . Blm 21 . le Ar Yklemesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 295 311 333 355 371 395

Ksm III

273

Blm 15

Alanlara Erimek in zellikler Uygulamak


Bu blm tamamladktan sonra renecekleriniz:
n n n n n n n

zellikleri kullanarak mantksal alanlar kapsllemek. get eriimcileri bildirerek zelliklere okuma eriimini denetlemek. set eriimcileri bildirerek zelliklere yazma eriimini denetlemek. zellikler bildiren arabirimler yaratmak. Yaplar ve snflar kullanarak, zellikler ieren arabirimler uygulamak. Otomatik olarak alan tanmlarna dayal zellikler retmek. Nesneleri balatmak iin zellikler kullanmak.

Bu kitabn ilk iki ksmnda C# dilinin temel szdizimi sunuldu ve yaplar, numaralandrmalar ve snflar kullanarak yeni trleri C# dilinde nasl oluturacanz gsterildi. Ayrca, bir program altnda, alma zamannn deikenler ve nesneler tarafndan kullanlan bellei nasl ynettiini grdnz. C# nesnelerinin mrn anlam olmalsnz. Bileenler Yaratmak balkl Ksm IIIte, blmler, bu bilgi zerine oluturuldu. Bu blmde, bir snftaki alanlar gizlemek iin zellikleri nasl tanmlayacanz ve kullanacanz ele alnacaktr. nceki blmlerde, bir snf iindeki alanlar zel yapmanz ve bu alanlardaki deerleri saklamak ve yeniden elde etmek iin yntemler salamanz gerektii vurgulanmtr. Bu yaklam, alanlara gvenli ve kontroll bir eriim salar ve izin verilen deerlere ilikin ek mantk ve kurallar kapsllemenizi salar. Bununla birlikte, bu yolla bir alana eriim iin szdizimi doal deildir. Bir deiken okumak ya da yazmak istediinizde, normal olarak bir atama ifadesi kullanrsnz, bu nedenle bir alanda (sonu olarak, bir deiken) ayn etkiye erimek iin bir yntem armak biraz acemiliktir. zellikler bu uygunsuzluu gidermek iin tasarlanmtr.

275

276

Ksm III

Bileenler Yaratmak

Yntemleri Kullanarak Kapslleme Uygulamak


lk olarak, alanlar gizlemek iin yntemleri kullanmay zetleyelim. Bilgisayar ekranndaki bir noktay x ve y koordinatlar olarak gsteren aadaki yapy dnn. x-koordinat iin geerli araln 0 ile 1280 arasnda olduunu ve y-koordinat iin de geerli araln 0 ile 1024 arasnda olduunu varsayn:
struct ScreenPosition { public ScreenPosition(int x, int y) { this.X = rangeCheckedX(x); this.Y = rangeCheckedY(y); } public int X; public int Y; private static int rangeCheckedX(int x) { if (x < 0 || x > 1280) { throw new ArgumentOutOfRangeException(X); } return x; } private static int rangeCheckedY(int y) { if (y < 0 || y > 1024) { throw new ArgumentOutOfRangeException(Y); } return y; } }

Bu yap ile ilgili bir problem, kapsllemenin altn kuralna uymamasdr; yani, verisi zel (private) deildir. Ortak (public) veri kt bir fikirdir nk kullanm denetlenmez. rnein, ScreenPosition kurucu aral parametrelerini denetler fakat byle bir denetim ortak alanlara ham eriim zerine yaplamaz. Er ya da ge (byk olaslkla hemen), programlama hatas sonucu olarak, X ya da Y aralnn dna decektir:
ScreenPosition origin = new ScreenPosition(0, 0); ... int xpos = origin.X; origin.Y = -100; // oops

Blm 15

Alanlara Erimek in zellikler Uygulamak

277

Bu problemi zmek iin yaygn yntem, alanlar zel yapmak ve her zel alann deerini srasyla okumak ve yazmak iin bir deitirici yntem ve bir eriimci yntemi eklemektir. Deitirici yntemler daha sonra yeni alan deerlerinde aralk denetimi yapabilirler. rnein, aadaki kod X alan iin bir eriimci (GetX) ve bir deitirici (SetX) ierir. SetX in parametre deerini nasl denetlediine dikkat edin.
struct ScreenPosition { ... public int GetX() { return this.x; } public void SetX(int newX) { this.x = rangeCheckedX(newX); } ... private static int rangeCheckedX(int x) { ... } private static int rangeCheckedY(int y) { ... } private int x, y; }

Kod artk aralk kstlamalarn baaryla uygular, bu da iyidir. Bununla birlikte, bu deerli garanti iin denmesi gereken bir bedel vardr (ScreenPosition artk doal bir alan benzeri szdizimine sahip deildir; bunun yerine artk yntem temelli szdizimine sahiptir). Aadaki rnek, X in deerini 10 artrr. Bunu yapmak iin, GetX eriimci yntemini kullanarak X in deerini okumak ve SetX deitirici yntemini kullanarak X in deerini yazmak zorundadr.
int xpos = origin.GetX(); origin.SetX(xpos + 10);

Bunu X alan ortak olduunda kullanlan denk kodla karlatrn:


origin.X += 10;

Hi phe yok ki, bu durumda alanlar kullanmak daha ksa, daha ak ve daha kolaydr. Ne yazk ki, ortak (public) alanlar kullanmak kapsllemeyi krar. zellikler, her iki rnein iyi ynlerini birletirmenizi salar: alan benzeri szdizimine izin verirken, kapsllemeyi de srdrmek.

278

Ksm III

Bileenler Yaratmak

zellikler Nelerdir?
Bir zellik (property), mantksal bir alanla fiziksel bir yntem arasndaki geitir; bir alan gibi grnr fakat bir yntem gibi alr. Bununla birlikte, derleyici otomatik olarak bu alan benzeri szdizimini eriimci yntemlere arya dntrr. Bir zellik bildirimi aadaki gibi grnr:
AccessModifier Type PropertyName { get { // eriimci kodu oku } set { // eriimci kodu yaz } }

Bir zellik, get ve set anahtar szckleri ile balayan iki kod blou ierebilir. get blou, zellik okunduunda uygulanan ifadeler ierir. set blou da zellik yazldnda alan ifadeler ierir. zellik tr, get ve set eriimciler tarafndan okunan ve yazlan verinin trn belirler. Sonraki kod rnei, ScreenPosition yapsnn zellikler kullanlarak yazlm biimini gsterir. Bu kodu okurken unlara dikkat edin:
n n n

Kk harfte x ve y private alanlardr. Byk harfte X ve Y public alanlardr. Tm set eriimcileri, value adnda tmleik, gizli bir parametre kullanarak yazlan veriyi geirir.

pucu Alanlar ve zellikler, standart Microsoft Visual C# public/private (ortak/zel) adlandrma geleneklerini izler. Public alanlar ve zellikler byk harfle, private alanlar ve zellikler kk harfle balamaldr.
struct ScreenPosition { public ScreenPosition(int X, int Y) { this.x = rangeCheckedX(X); this.y = rangeCheckedY(Y); }

Blm 15
public int X { get { return this.x; } set { this.x = rangeCheckedX(value); } } public int Y { get { return this.y; } set { this.y = rangeCheckedY(value); } } private static int rangeCheckedX(int x) { ... } private static int rangeCheckedY(int y) { ... } private int x, y; }

Alanlara Erimek in zellikler Uygulamak

279

Bu rnekte, bir private alan dorudan her bir zellii gelitirir. Bu bir zellik gelitirmenin yollarndan yalnzca biridir. Gereken tek ey bir get eriimcisinin bir deeri belirtilen trde dndrmesidir. Byle bir deer kolayca hesaplanabilir ve bu durumda da fiziksel bir alana gereksinim yoktur. Not Bu blmdeki rnekler bir yap iin zellik tanmlamay gsterse de bunlar aynen snflara
da uygulanabilir; szdizimi ayndr.

zellikleri Kullanmak
Bir zellii bir deyimde kullandnzda onu ya bir okuma balamnda (deerini deitirmediiniz durumlar) ya da bir yazma balamnda (deerini deitirdiiniz durumlar) kullanrsnz. Aadaki rnek bir ScreenPosition yapsnn X ve Y zelliklerindeki deerleri okumay gsterir:
ScreenPosition origin = new ScreenPosition(0, 0); int xpos = origin.X; // origin.X.geti ar int ypos = origin.Y; // origin.Y.geti ar

zellik ve alanlara ayn szdizimini kullanarak eritiinize dikkat edin. Bir zellii okuma balamnda kullandnzda derleyici alan benzeri kodunuzu otomatik olarak o zelliin get eriimcisine yaplan bir arya dntrr. Benzer biimde, bir zellii yazma balamnda kullanyorsanz, derleyici alan benzeri kodunuzu otomatik olarak o zelliin set eriimcisine yaplan bir arya dntrr:
origin.X = 40; origin.Y = 100; // deeri 40a ayarlayarak origin.X.seti ar // deeri 100e ayarlayarak origin.Y.Seti ar

Daha nce akland gibi, atanan deerler value deikeni kullanlarak set eriimcilerine geirilir. alma zaman bunu otomatik olarak yapar.

280

Ksm III

Bileenler Yaratmak

Bir zellii okuma/yazma balamnda kullanmak da olasdr. Bu durumda, hem get hem de set eriimcileri kullanlr. rnein, derleyici aadaki gibi ifadeleri otomatik olarak get ve set eriimcilerine yaplan arlara dntrr:
origin.X += 10;

pucu static zellikleri tpk static alan ve yntemleri bildirdiiniz gibi bildirebilirsiniz. Statik zelliklere, snf ya da yapnn bir oluumu kullanlarak deil, snfn ya da yapnn ad kullanlarak eriilir.

Salt Okunur zellikler


Yalnzca get eriimcisi olan zellikler bildirmenize izin verilir. Bu durumda, zellii yalnzca okuma balamnda kullanabilirsiniz. rnein, aada ScreenPosition yapsnn X zelliinin salt okunur bir zellik olarak bildirilmi biimini grebilirsiniz:
struct ScreenPosition { ... public int X { get { return this.x; } } }

X zellii bir set eriimcisi iermez; bu nedenle, Xi bir yazma balamnda kullanmak iin yaplan her giriim baarsz olur. rnein:
origin.X = 140; // derleme zaman hatas

Salt Yazlr zellikler


Benzer biimde, yalnzca set eriimcisi olan bir zellik bildirebilirsiniz. Bu durumda, zellii yalnzca yazma balamnda kullanabilirsiniz. rnein, aada ScreenPosition yapsnn X zelliinin salt yazlr bir zellik olarak bildirilmi biimini grebilirsiniz:
struct ScreenPosition { ... public int X { set { this.x = rangeCheckedX(value); } } }

Blm 15

Alanlara Erimek in zellikler Uygulamak

281

X zellii bir get eriimcisi iermez; Xi bir okuma balamnda kullanmak iin yaplan her giriim baarsz olur. rnein:
Console.WriteLine(origin.X); origin.X = 200; origin.X += 10; // derleme zaman hatas // derlenir // derleme zaman hatas

Not Salt yazlr zellikler parola gibi gvenli veri iin yararldr. deal olarak, gvenlii gzeten

bir uygulamann parola oluturmanza izin vermesi ancak parolanz okumanza izin vermemesi gerekir. Oturum ama yntemi yalnzca kullancnn girdii dize ile depolanm parolay karlatrmal ve bunlarn eleip elemediini bildirmelidir.

zellik Eriebilirlii
Bir zelliin eriebilirlii (public, private ya da protected) zellii bildirdiinizde belirtilir. Ancak, get ve set eriimcileri iin farkl eriebilirlik belirtmek olanakldr. rnein, ScreenPosition yapsnn aada gsterilen srm X ve Y zelliklerinin set eriimcilerini private olarak tanmlamaktadr (get eriimcileri public olarak kalr):
struct ScreenPosition { ... public int X { get { return this.x; } private set { this.x = rangeCheckedX(value); } } public int Y { get { return this.y; } private set { this.y = rangeCheckedY(value); } } ... private int x, y; }

Birbirinden farkl eriebilirlikleri olan eriimcileri tanmlarken baz kurallara uymanz gerekir:
n

Tanmlarken, eriimcilerden yalnzca bir tanesinin eriebilirliini deitirebilirsiniz. Her iki eriimcinin eriebilirliinin private olduu public bir zellik yazmak zaten anlamszdr! Deitirici, zelliinkinden daha az kstlayc bir eriebilirlik belirtmemelidir. rnein, zellik private olarak bildirilmise okuma eriimcisini public olarak belirtemezsiniz (bu rnekte, zellii public, okuma eriimcisini private yaparsnz) .

282

Ksm III

Bileenler Yaratmak

zellikler ve Alan Adlar: Bir Uyar


zellikler ve zel alanlara, sadece ilk harfin byk ve kk harf olarak farkl olmas dnda, ayn adn verilmesi yaygn bir uygulama olmakla birlikte, bir dezavantaj vardr. Employee adnda bir snf gerekletiren aadaki kodu inceleyin. employeeID alan zeldir fakat EmployeeID zellii, bu alana eriim salar.
class Employee { private int employeeID; public int EmployeeID; { get { return this.EmployeeID; } set { this.EmployeeID = value; } }

Bu kod sorunsuzca derlenir fakat EmployeeID zelliine eriildiinde bir StackOverflowException zel durumu oluturur. Bunun nedeni, get ve set eriimcilerinin private alandan (kk harf e) ok, zellie (byk harf E) bavurmasdr. Bu, kullanlabilir bellek alann tketen sonsuz bir dngye neden olur. Bu tr hatay yakalamak ok zordur!

zellik Kstlamalarn Anlamak


zellikler, alanlar gibi grnr, davranr ve hissedilirler. Ancak gerekte alan deildirler ve onlara baz kstlamalar uygulanr:
n

Bir yapnn ya da snfn zelliine sadece snf ya da yap balatldktan sonra bir deer atayabilirsiniz. Aadaki rnekteki kod geersizdir nk konum deikeni balatlmamtr (new kullanlarak). rnein:
ScreenPosition location; location.X = 40; // derleme zaman hatas, konum atanmam

Not Bu nemsiz grnebilir, ancak X bir zellik deil bir alan olsayd kod geerli olurdu.

Bunun anlam, alan ve zellikler arasnda baz farklar olduudur. Yap ve snflar, daha sonra zelliklere geirdiiniz alanlar kullanarak deil, ilk batan zellikler kullanarak tanmlamanz gerekir; alanlar zelliklere dntrrseniz snf ve yaplarnz kullanan kod artk almayabilir. Bu konuyu, Otomatik zellikler retmek balkl blmde yeniden ele alacaz.

Blm 15
n

Alanlara Erimek in zellikler Uygulamak

283

Bir zellii bir ref ya da out bamsz deikeni olarak kullanamazsnz (ama yazlabilir bir alan bir ref ya da out bamsz deikeni olarak kullanabilirsiniz). zellik gerekte bir bellek konumunu deil bir eriimci yntemini iaret ettiinden, bu mantkldr. rnein:
MyMethod(ref location.X); // derleme zaman hatas

Bir zellik yalnzca tek bir get ya da set eriimcisi ierebilir. Bir zellik baka yntem, alan ya da zellik ieremez. get ve set eriimcileri parametre alamaz. Atanmakta olan veri, value deikeni kullanlarak otomatik olarak set eriimcisine geirilir. const zellikleri bildiremezsiniz. rnein:
const int X { get { ... } set { ... } } // derleme zaman hatas

zellikleri Uygun Biimde Kullanmak


zellikler temiz, alan benzeri bir szdizimi ieren gl aralardr. Doru biimde kullanldklarnda zellikler kodun okunuunu ve bakmn kolaylatrr. Ancak, nesnelerin zelliklerine deil, davranna odaklanan zenli nesne ynelimli tasarmnn yerini almalar sz konusu deildir. Sradan yntemlerle ya da zelliklerle zel alanlara erimek kendi bana kodunuzun tasarmn gelitirmez. rnein, bir banka hesab bir bakiye (Balance) ierir. Dolaysyla, aadaki gibi, bir BankAccount (BankaHesab) snfnda bir Balance zellii oluturmak isteyebilirsiniz:
class BankAccount { ... public money Balance { get { ... } set { ... } } private money balance; }

Bu kt bir tasarmdr. Bir banka hesabna para yatrrken ve hesaptan para ekerken gereken ilevsellii yanstmamaktadr. (Bakiyeyi sizin belirlemenize izin veren bir banka biliyorsanz bana da haber verin.) Program yazarken sorunun ifade edilmesi iini bir yn alt dzey szdizimi iinde kaybetmemeye aln; zdnz sorunu zmde ifade etmeye aln:
class BankAccount { ... public money Balance { get { ... } } public void Deposit(money amount) { ... } public bool Withdraw(money amount) { ... } private money balance; }

284

Ksm III

Bileenler Yaratmak

Arabirim zelliklerini Bildirmek


Blm 12de arabirimleri grdnz. Arabirimler, yntemlerin yan sra zellikler de belirtebilir. Bunu yapmak iin, ya get ya set anahtar szcn ya da her ikisini birden bildirmeniz gerekir ama get/set eriimcilerinin gvdelerini bir noktal virglle deitirin. rnein:
interface IScreenPosition { int X { get; set; } int Y { get; set; } }

Bu arabirimi kullanan btn snf ya da yaplar, get ve set eriimci yntemleri ile X ve Y zelliklerini de kullanmak zorundadr. rnein:
struct ScreenPosition : IScreenPosition { ... public int X { get { ... } set { ... } } public int Y { get { ... } set { ... } } ... }

Arabirim zelliklerini bir snf iinde kullanrsanz, zellik kullanmlarn virtual olarak bildirebilirsiniz. Bu da daha sonra bundan tretilen snflarn bu kullanmlar geersiz klmasn salar. rnein:
class ScreenPosition : IScreenPosition { ... public virtual int X { get { ... } set { ... } } public virtual int Y { get { ... } set { ... } } ... }

Blm 15

Alanlara Erimek in zellikler Uygulamak

285

Not rnek, bir snf gstermektedir. virtual anahtar szc yaplar iin geerli deildir; nk yaplardan tretme yapamazsnz; yaplar mhrl (sealed) olarak kapaldr. Bir zellii ayrca, Blm 13te anlatlan ak arabirim gelitirmesi szdizimini kullanarak da uygulayabilirsiniz. Bir zelliin ak kullanm genel de deildir sanal da (ve geersiz de klnamaz). rnein:
struct ScreenPosition : IScreenPosition { ... int IScreenPosition.X { get { ... } set { ... } } int IScreenPosition.Y { get { ... } set { ... } } ... private int x, y; }

zellikleri Bir Windows Uygulamasnda Kullanmak


Microsoft Visual Studio 2008te Properties penceresini kullandnzda, aslnda, eitli uygulama bileenlerinin (TextBox denetimleri, Windows ve Button denetimleri gibi eler) zellik deerlerini ayarlayan ve alan bir kod oluturursunuz. Baz bileenlerin ok sayda zellii vardr ve baz zellikler dierlerinden daha ok kullanlr. Bu blmde grdnz szdiziminin aynsn kullanarak bu zelliklerin ounu alma zamannda deitirebilirsiniz. Aadaki altrmada, pencere yeniden boyutlandnda bile srekli ana penceresinin boyutlarn gsteren basit bir uygulama yaratmak iin TextBox denetimlerinin ve Window snfnn baz nceden tanml zelliklerini kullanacaksnz.

zellikleri kullann
1. Visual Studio 2008i balatn. 2. Belgeler klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 15\ WindowProperties klasrndeki WindowProperties projesini an. 3. Debug mensnde Start Without Debugging i tklayn.

286

Ksm III

Bileenler Yaratmak

Proje oluturulur ve alr. Width ve Height olarak etiketlenmi iki bo metin kutusu grntleyen bir pencere (Windows Presentation Foundation [WPF] formu) belirir. Programda metin kutusu denetimleri width ve height olarak adlandrlr. u an iin botur. Uygulamaya, pencerenin geerli boyutunu gsteren kodu ekleyeceksiniz. 4. Formu kapatn ve Visual Studio 2008 programlama ortamna dnn. 5. Code and Text Editor penceresinde, Window1.xaml.cs dosyasn grntleyin ve sizeChanged yntemini bulun. Bu yntem Window1 kurucusu tarafndan kullanlr. Bunu, formun geerli boyutunu width ve height metin kutularnda grntlemek iin kullanacaksnz. Window snfnn ActualWidth ve ActualHeight zelliklerini kullanl hale getireceksiniz. Bu zellikler, double deerler olarak geerli width ve height deerini dndrr. 6. Formun boyutunu grntlemek iin, sizeChanged yntemine iki ifade ekleyin. lk ifade, formun ActualWidth zelliinin deerini okumal, bu deeri bir dizeye evirmeli ve bu deeri width metin kutusunun Text zelliine atamaldr. kinci ifade, formun ActualHeight zelliinin deerini okumal, bir dizeye evirmeli ve bu deeri height metin kutusunun Text zelliine atamaldr. sizeChanged yntemi tam olarak u ekilde grnmelidir:
private void sizeChanged() { width.Text = this.ActualWidth.ToString(); height.Text = this.ActualHeight.ToString(); }

7. window1SizeChanged yntemini bulun. Uygulama altnda, pencerenin boyutu her deitiinde bu yntem alr. Bu yntemin, metin kutularnda yeni pencere boyutunu grntlemek iin sizeChanged yntemini ardna dikkat edin. 8. Projeyi oluturmak ve altrmak iin Debug mensnde Start Without Debugging i tklayn. Form, 305 ve 155 deerlerini ieren iki metin kutusu grntler. Bunlar, form tasarlandnda belirlenen, formun varsaylan boyutlardr. 9. Formu yeniden boyutlandrn. Metin kutularndaki metnin, yeni boyutu yansttna dikkat edin. 10. Formu kapatn ve Visual Studio 2008 programlama ortamna dnn.

Blm 15

Alanlara Erimek in zellikler Uygulamak

287

Otomatik zellikler retmek


Bu blmn nceki ksmlarnda, zelliklerin balca amacnn, alanlarn uygulamasn d dnyadan saklamak olduundan bahsedilmiti. zellikleriniz gerekten baz yararl iler yapyorsa bu iyidir fakat get ve set eriimciler, sadece alana bir deer atamak ya da deer okumak ilemlerini yerine getiriyorsa, bunun doru bir yaklam olup olmadn sorabilirsiniz. Veriyi public alanlar olarak gstermek yerine zellikler tanmlamanz iin en az iki neden vardr:
n

Uygulamalarla uygunluk Alanlar ve zellikler, derlemelerde farkl meta veri kullanarak kendilerini ortaya koyarlar. Bir snf gelitiriyorsanz ve public alanlar kullanmaya karar verdiyseniz, bu snf kullanan bir uygulama, alanlar olarak bu elere bavuracaktr. Bir zellii okurken ve yazarken kullandnz C# szdizimini, bir alan okumak ve yazmak iin kullanabilseniz de, derlenen kod gerekte olduka farkldr (C# derleyici bu farklar sizden saklar). Daha sonra bu alanlar, zellikler olarak deitirmeniz gerektiine karar verirseniz (iin gereksinimleri deimi olabilir ve deerleri atarken ek bir mantk gerekletirmeniz gerekebilir), mevcut uygulamalar yeniden derlenmeden snfn gncellenmi srmn kullanamaz. Uygulamay bir irketin ok sayda kullancsna uyguladysanz, bu bir dezavantajdr. Bunu zmenin yollar vardr fakat genellikle ilk bata bu durumla karlamaktan kanmak en iyisidir. Arabirimlerle uygunluk Bir arabirim gerekletiriyorsanz ve arabirim zellik olarak bir e tanmlyorsa, zellik sadece private alandaki veriyi okuyor ve yazyor olsa bile, arabirimdeki artlara uyan bir zellik yazmanz gerekir. Sadece ayn adla bir public alan gstermek yoluyla bir zellik gelitiremezsiniz.

C# dili tasarmclar, programclarn gereinden fazla kod yazacak kadar zaman olmayan megul insanlar olduunu bilir. Bu amala, C# derleyici sizin iin otomatik olarak zellikler kodunu retebilir:
class Circle { public int Radius{ get; set; } ... }

Bu rnekte, Circle snf Radius adnda bir zellik ierir. Bu zellik tr dnda, bu zelliin nasl altn belirtmeniz gerekmez (get ve set eriimcileri botur). C# derleyicisi, bu tanm aadakine benzer bir private alana ve bir varsaylan uygulamaya dntrr:

288

Ksm III

Bileenler Yaratmak

class Circle { private int _radius; public int Radius{ get { return this._radius; } set { this._radius = value; } } ... }

Daha az uramak iin, otomatik olarak retilmi kodu kullanarak basit bir zellii gerekletirebilirsiniz ve daha sonra ek bir mantk gerekirse, mevcut uygulamalar bozmadan bunu yapabilirsiniz. Bununla birlikte, otomatik olarak retilmi zellikle birlikte get ve set eriimcilerinin her ikisini de belirtmeniz gerektiine dikkat edin (otomatik zellik salt-okunur ya da salt-yazlr olamaz). Not Bir otomatik zellii tanmlamak iin kullanlan szdizimi, bir arabirimdeki zellii

tanmlamak iin kullanlan szdizimine benzer. Farkl olarak, otomatik zellik, private, public ya da protected gibi bir eriim dzenleyici belirleyebilir.

zellikleri Kullanarak Nesneleri Balatmak


Blm 7de, bir nesneyi balatmak iin kurucular tanmlamay rendiniz. Bir nesne birden fazla kurucuya sahip olabilir ve bir nesnedeki farkl eleri balatmak iin eitli parametrelerle kurucular tanmlayabilirsiniz. rnein, aadaki gibi, bir geni modelleyen bir snf tanmlayabilirsiniz:
public class Triangle { private int side1Length; private int side2Length; private int side3Length; // varsaylan kurucu - tm ynler iin varsaylan deerler public Triangle() { this.side1Length = this.side2Length = this.side3Length = 10; } // side1Length iin uzunluk belirle, dierleri iin varsaylan deerler public Triangle(int length1)

Blm 15
{ this.side1Length = length1; this.side2Length = this.side3Length = 10; } // side1Length ve side2Length iin uzunluk belirle, // side3Length iin varsaylan deer public Triangle(int length1, int length2) { this.side1Length = length1; this.side2Length = length2; this.side3Length = 10; }

Alanlara Erimek in zellikler Uygulamak

289

// tm ynler iin uzunluk belirle public Triangle(int length1, int length2, int length3) { this.side1Length = length1; this.side2Length = length2; this.side3Length = length3; } }

Bir snfn ka adet alan ierdiine ve alanlar balatmak iin istediiniz eitli bileimlere bal olarak, ok sayda kurucu yazmaya son verebilirsiniz. Ayrca ok sayda alan ayn trde ise problemler meydana gelebilir: Alanlarn tm bileimleri iin benzersiz bir kurucu yazamayabilirsiniz. rnein, nceki Triangle snfnda, sadece side1Length ve side3Length alanlarn balatan bir kurucuyu kolayca ekleyemezsiniz nk benzersiz bir imzaya sahip olmayacaktr; iki int parametresi alacaktr, side1Length ve side2Length alanlarn balatan kurucu zaten bu imzaya sahiptir. Bunun zm, aadaki gibi, private alanlar varsaylan deerleri ile balatmak ve zellikler tanmlamaktr:
public class Triangle { private int side1Length = 10; private int side2Length = 10; private int side3Length = 10; public int Side1Length { set { this.side1Length = value; } } public int Side2Length { set { this.side2Length = value; } } public int Side3Length { set { this.side3Length = value; } } }

290

Ksm III

Bileenler Yaratmak

Bir snfn oluumunu yarattnzda, set eriimcilere sahip public zellikler iin deerler belirleyerek bu oluumu balatabilirsiniz. Yani, Triangle nesneler yaratabilir ve genin kenarn herhangi bir bileimle balatabilirsiniz:
Triangle Triangle Triangle Triangle tri1 tri2 tri3 tri4 = = = = new new new new Triangle Triangle Triangle Triangle { { { { Side3Length Side1Length Side2Length Side1Length Side3Length = = = = = 15 }; 15, Side3Length = 20 }; 12, Side3Length = 17 }; 9, Side2Length = 12, 15 };

Bu szdizimi, object initializer (nesne balatc) olarak bilinir. Bu yolla bir nesne balatc ardnzda, C# derleyici, varsaylan kurucuyu aran ve daha sonra belirtilen deer ile balatmak iin adlandrlm her zelliin set eriimcisini aran kodu retir. Nesne balatclar, varsaylan olmayan kurucularla da belirleyebilirsiniz. rnein, Triangle snf, genin trn tanmlayan tek bir dize parametresi alan bir kurucu da ieriyorsa, aadaki gibi bu kurucuyu arabilir ve dier zellikleri balatabilirsiniz:
Triangle tri5 = new Triangle(Equilateral triangle) { Side1Length = 3, Side2Length = 3, Side3Length = 3 };

Unutmamanz gereken nemli bir nokta, kurucunun ilk olarak alt ve zelliklerin daha sonra atanddr. Kurucu, bir nesnedeki alanlar belirli deerlere atyorsa ve belirlediiniz zellikler bu deerleri deitiriyorsa bu sralamay anlamak nemlidir. Sonraki altrmada greceiniz gibi, nesne balatclar otomatik zelliklerle de kullanabilirsiniz. Bu altrmada, bir dzgn okgeni modellemek iin bir snf tanmlayacaksnz. Bu snf, okgenin kenar saysn ve kenarlarn uzunluklarn salamak iin otomatik zellikler ierecek.

Otomatik zellikler tanmlayn ve nesne balatclar kullann


1. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\Chapter 15\ AutomaticProperties klasrndeki AutomaticProperties projesini Visual Studio 2008de an. AutomaticProperties projesi, nceki altrmalarda grdnz Main ve Entrance yntemleri ile Program snfn tanmlayan Program.cs dosyasn ierir. 2. Solution Explorerda, AutomaticProperties projesini farenin sa dmesiyle tklayn, Addi iaret edin ve sonra da Class tklayn. Add New Itemda (AutomaticProperties iletiim kutusu), Name metin kutusuna Polygon.cs yazn ve sonra Addi tklayn. Polygon.cs dosyas, yaratlarak projeye eklenen ve Code and Text Editor penceresinde gsterilen Polygon snfn tutar.

Blm 15

Alanlara Erimek in zellikler Uygulamak

291

3. Polygon snfna, aada koyu harflerle gsterilen NumSides ve SideLength otomatik zelliklerini ekleyin:
class Polygon { public int NumSides { get; set; } public double SideLength { get; set; } }

4. Aadaki varsaylan kurucuyu Polygon snfna ekleyin:


class Polygon { public Polygon() { this.NumSides = 4; this.SideLength = 10.0; } ... }

Bu altrmada, varsaylan okgen 10 birim uzunluunda kenarlara sahip bir karedir. 5. Code and Text Editor penceresinde Program.cs dosyasn grntleyin. 6. Aada koyu harflerle gsterilen ifadeleri Entrance yntemine ekleyin:
static void { Polygon Polygon Polygon } Entrance() square = new Polygon(); triangle = new Polygon { NumSides = 3 }; pentagon = new Polygon { SideLength = 15.5, NumSides = 5 };

Bu ifadeler Polygon nesneleri yaratr. square deikeni, varsaylan kurucu kullanlarak balatlr ve daha sonra bu kod, Polygon snf tarafndan ortaya karlm zelliklerin deerlerini deitirir. triangle deikeni durumunda, NumSides zelliine 3 deeri atanr fakat SideLength zelliinin deeri varsaylan deer olan 10.0 olarak braklr. pentagon deikeni iin, kod SideLength ve NumSides zelliklerinin deerlerini deitirir. 7. Aadaki kodu Entrance ynteminin sonuna ekleyin:
static void Entrance() { ... Console.WriteLine(Square: number of sides is {0}, length of each side is {1}, square.NumSides, square.SideLength); Console.WriteLine(Triangle: number of sides is {0}, length of each side is {1}, triangle.NumSides, triangle.SideLength); Console.WriteLine(Pentagon: number of sides is {0}, length of each side is {1}, pentagon.NumSides, pentagon.SideLength); }

292

Ksm III

Bileenler Yaratmak

Bu ifadeler, her Polygon nesnesi iin NumSides ve SideLength zelliklerin deerini grntler. 8. Debug mensnde Start Without Debuggingi tklayn. Programn oluturularak altrldn ve konsola aadaki iletiyi yazdn dorulayn:

9. Uygulamay kapatmak ve Visual Studio 2008e dnmek iin Entera basn. Otomatik zelliklerin nasl yaratldn ve nesneleri balatrken zellikleri nasl kullanacanz grdnz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 16ya gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 15 Hzl Bavuru


Bunun in
Bir yap ya da snf iin bir okuma/ yazma zellii bildirmek

unu Yapn
zelliin trn, adn, bir get eriimcisi ve bir set eriimcisi bildirin. rnein:
struct ScreenPosition { ... public int X { get { ... } set { ... } } ... }

Blm 15

Alanlara Erimek in zellikler Uygulamak

293

Bir yap ya da snf iin salt okunur bir zellik bildirmek

Yalnzca bir get eriimcisi olan bir zellik bildirin. rnein:


struct ScreenPosition { ... public int X { get { ... } } ... }

Bir yap ya da snf iin salt yazlr bir zellik bildirmek

Yalnzca bir set eriimcisi olan bir zellik bildirin. rnein:


struct ScreenPosition { ... public int X { set { ... } } ... }

Bir arabirim iinde zellik bildirmek

Yalnzca get, set ya da her ikisi de olan bir zellik bildirin.rnein:


interface IScreenPosition { int X { get; set; } // int Y { get; set; } // }

gvde yok gvde yok

Bir yap ya da snf iin bir arabirim zellii kullanmak

Arabirimi kullanan yap ya da snfta zellii bildirin, zellii bildirin ve eriimcileri uygulayn. rnein:
struct ScreenPosition : IScreenPosition { public int X { get { ... } set { ... } } public int Y { get { ... } set { ... } } }

294

Ksm III

Bileenler Yaratmak

Otomatik zellik yaratmak

zellik ieren snf ya da yapda, zellii bo get ve set eriimcilerle tanmlayn. rnein:
class Polygon { public int NumSides { get; set; } }

Bir nesneyi balatmak iin zellikleri kullanmak

Nesneyi kurarken, zellikler ve deerlerini kme parantezi arasnda listeleyin. rnein:


Triangle tri3 = new Triangle { Side2Length = 12, Side3Length = 17 };

Blm 16

Dizinleyicileri Kullanmak
Bu blm tamamladktan sonra renecekleriniz:
n n n n n

Mantksal dizi benzeri bildirimleri kapsllemek iin dizinleyicileri kullanmak. Dizinleyicilere okuma eriimini denetlemek iin get eriimcileri bildirmek. Dizinleyicilere yazma eriimini denetlemek iin set eriimcileri bildirmek. Dizinleyicileri bildiren arabirimler yaratmak. Arabirimlerden kaltmla alnan yap ve snflarda dizinleyiciler kullanmak.

nceki blmde bir snftaki alanlara denetimli bavuru salamak iin zellikleri kullanp uygulamak aklanmt. zellikler, tek bir deer ieren alanlar yanstmak iin yararldr. Ancak, doal ve tandk bir szdizimi kullanarak birden ok deer ieren elere eriim salamak isterseniz dizinleyiciler ok deerlidir.

Dizinleyici Nedir?
Bir dizinleyici (indexer), tpk bir zelliin akll bir alan olmas gibi, akll bir dizidir. Bir dizinleyici iin kullandnz szdizimi, tmyle bir dizi iin kullandnz szdiziminin aynsdr. Gelin, bir rnek zerinde alalm. lk olarak bir sorun tanmlayacaz ve dizinleyici kullanmayan kt bir zm greceiz. Daha sonra ayn sorun zerinde almaya devam edecek ve dizinleyici kullanan daha iyi bir zm greceiz. Sorun tamsaylarla ilgili ya da daha doru belirtmek gerekirse int tr ile ilgili.

Dizinleyici Kullanmayan Bir rnek


Normalde bir tamsay deeri tamas iin bir int kullanrsnz. sel olarak, bir int, deerini, her bitin 0 ya da 1 olabildii 32 bitlik bir srada tutar. ou zaman bu isel ikili gsterim konusunu dnmeniz gerekmez; yalnzca bir tamsay deeri tamas iin bir inti kova olarak kullanrsnz. Ancak, programclar int trn bazen baka amalar iin kullanrlar; baz programlar bir int iindeki tek tek bitleri deitirirler. Dier bir deyile, ara sra bir program bit inti bir tamsayy gsterdii iin deil de 32 bit tad iin kullanabilir. (Benim gibi eski bir C program gelitiriciyseniz, bundan sonra gelenler tandk olmaldr!)

295

296

Ksm III

Bileenler Yaratmak

Not Baz eski programclar int trlerini bellekten tasarruf etmek iin kullanabilir. Tek bir int 32 bit
tutar ve her bit 0 ya da 1 olabilir. Baz durumlarda programclar bir deerin doru olduunu belirtmek iin 1, yanl olduunu belirtmek iinse 0 kullanrlar ve daha sonra bir Boolean deerler kmesi olarak bir int kullanrlar.

rnein, aadaki deyim, bits adl intin 6. dizinindeki bitin 0 m yoksa 1 mi olduunu bulmak iin << ve & bit benzeri ileleri kullanyor:
(bits & (1 << 6)) != 0

6. dizindeki bit 0 ise deyim false, 1 ise true sonucunu verecektir. Bu olduka karmak bir deyim, ama 6. dizindeki biti, &= karlatrma atama ileci ile 0a eitleyen aadaki deyimle karlatrlamaz bile:
bits &= ~(1 << 6)

Not Bit ileleri, sadan sola doru bitlerin konumunu sayar, bu nedenle 0 biti en sadaki bit ve 6. dizindeki bit de sadan 6. sradaki bittir. Benzer ekilde, 6. dizindeki biti 1 olarak ayarlamak istiyorsanz, bit OR (|) ilecini kullanabilirsiniz. Aadaki karmak ifade |= birleik atama ilecine dayanr:
bits |= (1 << 6)

Bu rneklerle ilgili sorun, alyor olsalar bile neden ve nasl alyor olduklarnn ok ak olmamasdr. ok karmaktrlar ve zm ok basittir. zm getirdii problemin bir soyutlamasn yapamaz.

Bit Benzeri ve Kaydrma leleri


Bu rneklerde gsterilen baz ilgin simgeleri fark etmisinizdir. zellikle, ~, <<, | ve &. Bunlar bit benzeri ve kaydrma ilelerinden bazlar olup int ve long veri trlerinde tutulan bitleri deitirmek iin kullanlrlar.
n

NOT (~) ileci bir bit benzeri tamamlaycsdr. Tekil bir iletir. rnein, 8 bit 11001100n (204n karl) deerini alp ~ ilecini uygularsanz 00110011 (51in karl) deerine ularsnz.

Blm 16
n

Dizinleyicileri Kullanmak

297

<< ileci sola kaydrma ilemi uygular. kili bir iletir. 204 << 2 deyiminin sonucu 48dir (ikilik sistemde 204 11001100a karlk gelir ve iki basamak sola kaydrma ileminin sonunda 00110000 deerine ulalr ya da karl olan 48e). En soldaki iki bit atlr ve sadan iki sfr eklenir. Bunun tam kart olan bir de saa kaydrma ileci >> vardr. OR (|) ileci bir bit benzeri OR (ya da) ilemi uygular. Bir ikili iletir ve iki ile deikeninden herhangi biri 1 ise o biti 1 yapar. rnein, 204 | 24 ileminin deeri 220dir (204n karl 11001100dr, 24n karl ise 00011000dr, 220 ise 110011100dr). AND (&) ileci bir bit benzeri AND (ve) ilemi uygular. AND, bit benzeri OR ilecine benzer. Bir ikili iletir ve ile deikenlerinin her ikisi de 1 ise o biti 1 yapar. Bu yzden, 204&24 ileminin sonucu 8dir (204n karl 11001100dr, 24n karl ise 00011000dr, 8 ise 00001000dr). XOR (^) ileci, bir XOR (zel ya da) ilemi uygular ve ilenenlerden birinde ya da dierinde 1 varsa (ama ikisinde deil) her bitte 1 dndrr. (ki 1 deeri 0 sonucunu verir bu da ilecin zel blmdr.) Bu yzden 204^24 ileminin sonucu 212dir (11001100^00011000 ileminin sonucu 11010100dr).

Ayn rnein Dizinleyici Kullanan Biimi


Gelin nceki dk seviye zm bir kenara brakp sorunun ne olduunu kendimize anmsatmak iin birazck duralm. Sorun, bir inti bir int gibi kullanmak istemeyip 32 bitlik bir dizi gibi kullanmak istememizdi. Bu yzden bu sorunu zmenin en iyi yolu int deeri 32 bitin oluturduu bir dizi olarak kullanmaktr! Dier bir deyile bits bir int deerse 6. dizindeki biti almak iin yazmamz gereken udur:
bits[6]

Ve, rnein, 6. dizindeki biti true yapmak iin unu yazabilmeliyiz:


bits[6] = true

Ne yazk ki, bir int zerinde keli parantez kullanamazsnz. Keli parantezi yalnzca bir dizi ya da bir dizi gibi davranan baka bir tr zerinde kullanabilirsiniz; yani bir dizinleyici tanmlayan bir tr stnde. Sonuta sorunun zm bool deerlerden oluan bir dizi gibi davranan, hisseden ve kullanlan, fakat int tr kullanlarak uygulanan yeni bir tr yaratmaktr. Gelin bu yeni tre IntBits diyelim. IntBits (kurucusunda balatlan) bir int deer ierecek ama biz IntBitsi bool deerlerden oluan bir dizi gibi kullanacaz. pucu IntBits kk ve hafif olduundan onu bir snf olarak deil, yap olarak yaratmak daha akllcadr.

298

Ksm III

Bileenler Yaratmak

struct IntBits { public IntBits(int initialBitValue) { bits = initialBitValue; } // dizinleyici buraya yazlr private int bits; }

Dizinleyiciyi tanmlamak iin bir zellik ile bir dizi arasnda gei olan bir gsterim biimi kullanrsnz. IntBits yapsnn dizinleyicisi aadaki gibidir:
struct IntBits { ... public bool this [ int index ] { get { return (bits & (1 << index)) != 0; } set { if (value) // deer true ise biti a; deilse kapat bits |= (1 << index); else bits &= ~(1 << index); } } ... }

Aada belirtilen noktalara dikkat edin:


n

Dizinleyiciler yntem deildir; bir parametre ieren parantez kullanlmaz, ama bir dizin belirten keli parantez vardr. Bu dizin, hangi eye eriildiini gsterir. Btn dizinleyiciler, yntem ad yerine this anahtar szcn kullanrlar. Bir snf ya da yapnn yalnzca bir dizinleyici tanmlamasna izin verilir ve bu her zaman this olarak adlandrlr. Dizinleyiciler, zelliklerdeki gibi get ve set eriimcileri ierir. Bu rnekte, get ve set eriimcileri yukarda sz edilen karmak bit benzeri deyimleri ierir. Dizinleyici bildiriminde belirtilen bamsz deiken dizinleyici arldnda belirtilen dizin deeriyle doldurulur. get ve set eriim yntemleri eriilecek eleri belirlemek iin bu bamsz deikeni okuyabilir.

Blm 16

Dizinleyicileri Kullanmak

299

Not Dizinleyici kodunuzda herhangi bir beklenmedik zel durum olumasn nlemek iin dizinleyicideki dizin deeri zerinde bir aralk denetimi yapmanz gerekir. Dizinleyici bildirildikten sonra bir int yerine IntBits tr bir deiken kullanabilir ve keli parantez gsterim biimini uygulayabiliriz:
int adapted = 62; // 62 111110un ikili temsilidir IntBits bits = new IntBits(adapted); bool peek = bits[6]; // 6 dizininde bool al; true (1) olmal bits[0] = true; // 0 dizininde biti true (1) olarak ayarla bits[3] = false; // 3 dizininde biti false (0) olarak ayarla // deitirilen deer imdi 111011, ya da ikili temsilde 59

Bu szdizimini anlamak kesinlikle daha kolaydr. Dorudan ve uzatmadan sorunun zn yakalar. Not Dizinleyici ve zellikler, get ve set eriimcilerini kullanmalar asndan birbirine benzer. Bir
dizinleyici birden ok deeri olan bir zellik gibidir. Ancak, static zellikler bildirmenize izin verilse de static dizinleyiciler geersizdir.

Dizinleyici Eriimcilerini Anlamak


Bir dizinleyiciyi okuduunuzda derleyici otomatik olarak sizin dizi benzeri kodunuzu bu dizinleyicinin get eriimcisine yaplan bir arya dntrr. rnein, aadaki rnei dnn:
bool peek = bits[6];

Bu ifade bitsin get eriimcisine yaplan bir arya dntrlr ve index bamsz deikeninin deeri 6 olarak ayarlanr. Benzer biimde, bir dizinleyiciye yazarsanz derleyici otomatik olarak sizin dizi benzeri kodunuzu bu dizinleyicinin set eriimcisine yaplan bir arya dntrr ve index bamsz deikenini keli parantez iinde belirtilen deer olarak ayarlar. rnein:
bits[6] = true;

Bu ifade, index deerinin 6 olduu bitsin set eriimcisine yaplan bir arya dntrlr. Sradan zelliklerdeki gibi, dizinleyiciye yazdnz deer (bu durumda true) set eriimcisi iinden value anahtar szc kullanlarak eriilebilir klnr. value tr dizinleyicinin tryle ayndr (bu durumda, bool).

300

Ksm III

Bileenler Yaratmak

Ayrca birletirilmi bir okuma/yazma balamnda bir dizinleyici kullanmak da olanakldr. Bu durumda get ve set eriimcileri kullanlr. rnein, aadaki ifadeyi dnn:
bits[6] ^= true;

Bu kod, otomatik olarak aadaki koda dntrlr:


bits[6] = bits[6] ^ true;

Bu kod alr nk dizinleyici hem bir get hem de bir set eriimcisi bildirir. Not Yalnzca bir get eriimcisi (salt okunur bir dizinleyici) ya da set eriimcisi (salt yazlr bir
eriimci) ieren bir dizinleyici de bildirebilirsiniz.

Dizinleyicilerle Dizileri Karlatrmak


Bir dizinleyici kullandnzda, szdizimi dizi szdizimine benzer. Ancak, dizinleyicilerle diziler arasnda baz nemli farklar vardr:
n

Dizinleyiciler say olmayan girdi kullanabilirler, ama diziler yalnzca tamsay girdi kullanabilir:
public int this [ string name ] { ... } // Tamam

pucu Anahtar/deer iftlerine bal olarak bileik arama uygulayan Hashtable gibi birok
koleksiyon snf, yeni bir deer eklemek ve kodunuzdaki bir deeri bulmak iin Values zellii boyunca yineleme yapmaya ve Add yntemini kullanmaya uygun bir alternatif olarak dizinleyicileri kullanr. rnein, unun yerine:

Hashtable ages = new Hashtable(); ages.Add(John, 42);

bunu kullanabilirsiniz:
Hashtable ages = new Hashtable(); ages[John] = 42;

Dizinleyiciler (yntemler gibi) ar yklenebilirken, diziler yklenemez:


public Name this [ PhoneNumber number ] { ... } public PhoneNumber this [ Name name ] { ... }

Dizinleyiciler ref ya da out parametreleri olarak kullanlamazlarken dizi eleri kullanlabilir:


IntBits bits; // bits bir dizinleyici ierir Method(ref bits[1]); // derleme zaman hatas

Blm 16

Dizinleyicileri Kullanmak

301

zellikler, Diziler ve Dizinleyiciler


Bir zelliin bir dizi dndrmesi olanakl olsa da dizilerin bavuru tr olduunu ve dolaysyla bir diziyi bir zellik olarak gstermenin birok verinin zerine yazlmasn olanakl kldn unutmayn. Aadaki Data (Veri) adl, bir dizi zelliine sahip yapya bakn:
struct Wrapper { private int[] data; ... public int[] Data { get { return this.data; } set { this.data = value; } } }

imdi bu zellii kullanan aadaki kodu dnn:


Wrapper wrap = new Wrapper(); ... int[] myData = wrap.Data; myData[0]++; myData[1]++;

Bu zararsz grnmektedir. Ancak, diziler bavuru tr olduu iin myData deikeni Wrapper yapsndaki zel data deikeniyle ayn nesneye bavurur. myData deikenindeki elere yaptnz her deiiklik data dizisine yaplr; myData[0]++ ifadesinin etkisi data[0]++ ile ayndr. stediiniz bu deilse, veri dizisinin bir kopyasn dndrmek iin Data zelliinin get ve set eriimcisinde Clone yntemini kullanmal ya da burada gsterildii gibi, ayarlanan deerin bir kopyasn almalsnz. (Clone yntemi, bir tamsay diziye dntrmeniz gereken bir nesne dndrr.)
struct Wrapper { private int[] data; ... public int[] Data { get { return this.data.Clone() as int[]; } set { this.data = value.Clone() as int[]; } } }

Bununla birlikte, bu karmak ve bellek kullanm asndan pahal bir ilem olabilir. Dizinleyiciler bu soruna doal bir zm sunmaktadr: tm diziyi bir zellik olarak gstermeyin; yalnzca bamsz elerini bir dizinleyici iinden kullanlabilir kln:
struct Wrapper { private int[] data; ...

302

Ksm III

Bileenler Yaratmak

public int this [int i] { get { return this.data[i]; } set { this.data[i] = value; } } }

Aadaki kod, dizinleyiciyi daha nce gsterilen zellie benzer biimde kullanr:
Wrapper wrap = new Wrapper(); ... int[] myData = new int[2]; myData[0] = wrap[0]; myData[1] = wrap[1]; myData[0]++; myData[1]++;

Bu kez, MyData dizisindeki deerleri artrmann Wrapper nesnesindeki zgn dizi zerinde bir etkisi olmaz. Wrapper nesnesindeki veriyi gerekten deitirmek istiyorsanz aadaki gibi ifadeler yazmanz gerekir:
wrap[0]++;

Bu ok daha temiz ve gvenlidir!

Arabirimdeki Dizinleyiciler
Bir arabirimde dizinleyiciler bildirebilirsiniz. Bunu yapmak iin get ve/veya set anahtar szckleri bildirirsiniz ama get/set eriimcisinin gvdesinin yerine bir noktal virgl yazarsnz. Arabirimi kullanan her snf ya da yap arabirimde bildirilmi olan dizinleyici eriimlerini gelitirmek zorunda kalr. rnein:
interface IRawInt { bool this [ int index ] { get; set; } } struct RawInt : IRawInt { ... public bool this [ int index ] { get { ... } set { ... } } ... }

Blm 16

Dizinleyicileri Kullanmak

303

Arabirim dizinleyicisini bir snf iinde gelitirirseniz, dizinleyici uygulamalarn sanal olarak bildirebilirsiniz. Bu, ilerde tretilen snflarn get ve set eriimcilerini geersiz klmalarn salar. rnein:
class RawInt : IRawInt { ... public virtual bool this [ int index ] { get { ... } set { ... } } ... }

Ayrca bir dizinleyiciyi, Blm 12de anlatlan ak arabirim gelitirme szdizimini kullanarak gelitirmeyi de tercih edebilirsiniz. Bir dizinleyicinin ak gelitirmesi ne geneldir ne de sanal (ve bu yzden geersiz klnamazlar). rnein:
struct RawInt : IRawInt { ... bool IRawInt.this [ int index ] { get { ... } set { ... } } ... }

Dizinleyicileri Bir Windows Uygulamasnda Kullanmak


Aadaki altrmada, basit bir telefon defteri uygulamasn inceleyeceksiniz. Greviniz PhoneBook (TelefonDefteri) snfna biri Name parametresi alp bir PhoneNumber (TelefonNumaras) dndren, dieri ise bir PhoneNumber alp bir Name dndren iki tane dizinleyici yazmak olacak. (Name ve PhoneNumber yaplar zaten yazlm durumdadr.) Ayrca bu dizinleyicileri program iinde doru yerlerde armanz gerekecek.

Uygulamaya yaknlan
1. Microsoft Visual Studio 2008i an. 2. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\Chapter 16\ Indexers klasrndeki Indexers projesini an. Bu, kullancnn bir telefon numarasn aramasn ve hatta verilen bir numara ile eleen ad bulmasn salayan bir Windows Presentation Foundation (WPF) uygulamasdr.

304

Ksm III

Bileenler Yaratmak

3. Debug mensnde Start Without Debugging i tklayn. Proje oluturulup altrlr. Name ve Phone Number olarak adlandrlm iki bo metin kutusu gsteren bir form belirir. Form ayrca dme ierir: biri bir ad/telefon numaras ifti eklemek iin; dieri bir ad verildiinde telefon numarasn bulmak iin; sonuncusu da bir telefon numaras verildiinde ad bulmak iin. Bu dmeler u anda hibir i yapmaz. Greviniz bu dmeleri alr duruma getirmek iin uygulamay tamamlamak. 4. Formu kapatn ve Visual Studio 2008e dnn. 5. Code and Text Editor penceresinde Name.cs kaynak dosyasn grntleyin. Name yapsn inceleyin. Amac adlar iin bir tutucu grevi grmektir. Ad, kurucuya bir dize olarak salanmtr. Text adl salt okunur dize zellii kullanlarak ad alnabilir. (Equals ve GetHashCode yntemleri Name deerleri dizisinde arama yaparken Namesi karlatrmak iin kullanlr (imdilik bunlar gz ard edebilirsiniz). 6. Code and Text Editr penceresinde PhoneNumber.cs kaynak dosyasn grntleyin. PhoneNumber yapsn inceleyin. Name yapsna ok benzer. 7. Code and Text Editor penceresinde PhoneBook.cs kaynak dosyasn grntleyin ve PhoneBook snfn inceleyin. Bu snf iki zel dizi ierir: names adl Name deerlerini tutan bir dizi ve phoneNumbers adl PhoneNumber deerlerini tutan bir dizi. PhoneBook snf ayrca, telefon defterine ad ve telefon numaras ekleyen bir Add yntemine sahiptir. Bu yntem Add dmesi tklandnda arlr. Kullanc baka bir girdi eklediinde dizilerin dolu olup olmadn denetlemek iin enlargeIfFull yntemi Add tarafndan arlr. Bu yntem daha byk iki dizi yaratr, var olan dizilerin ieriini bunlara kopyalar ve ardndan eski dizileri atar.

Dizinleyicileri yazn
1. PhoneBook.cs kaynak dosyasnda PhoneBook snfna bir Name dndren ve bir tek PhoneNumber parametresi alan public salt okunur bir dizinleyici ekleyin. get eriimcisinin gvdesini bo brakn. Dizinleyici yle grnmelidir:
sealed class PhoneBook { ... public Name this [PhoneNumber number] { get { } } ... }

Blm 16

Dizinleyicileri Kullanmak

305

2. get eriimcisini aadaki gibi gelitirin. Eriimcinin grevi, belirtilen telefon numarasyla eleen ad bulmaktr. Bunu yapmak iin, Array snfnn statik IndexOf yntemini armanz gerekir. IndexOf yntemi bir dizi boyunca arama gerekletirir ve eleen dizideki ilk enin dizinini dndrr. IndexOfun ilk bamsz deikeni, iinde arama yaplacak dizidir (phoneNumbers). IndexOfun ikinci bamsz deikeni, aradnz edir. IndexOf aranan eyi bulursa enin dizininin tam say deerini dndrr, aksi takdirde IndexOf, -1 deerini dndrr. Dizinleyici telefon numarasn bulursa onu dndrr, bulamazsa bo bir Name deeri dndrr. (Namein bir yap olduuna ve her zaman zel alann nulla eitleyen bir varsaylan kurucu iereceine dikkat edin.) Tamamlanm get eriimcisi ile dizinleyici aadaki gibi grnr:
sealed class PhoneBook { ... public Name this [PhoneNumber number] { get { int i = Array.IndexOf(this.phoneNumbers, number); if (i != -1) return this.names[i]; else return new Name(); } } ... }

3. PhoneBook snfna tek bir Name parametresi alan ve PhoneNumber dndren ikinci bir public salt okunur dizinleyici daha ekleyin. Bu dizinleyiciyi birinci ile ayn biimde gelitirin (yine PhoneNumbern bir yap olduuna ve bu yzden her zaman bir varsaylan kurucusu olacana dikkat edin). kinci dizinleyici yle grnmelidir:
sealed class PhoneBook { ... public PhoneNumber this [Name name] { get { int i = Array.IndexOf(this.names, name); if (i != -1) return this.phoneNumbers[i]; else return new PhoneNumber(); } } ... }

306

Ksm III

Bileenler Yaratmak

Bu ar yklenmi dizinleyicilerin ayn anda var olduklarna nk imzalarnn farkl olduuna da dikkat edin. Name ve PhoneNumber yaplarn birer dize ile deitirirseniz, yklemeler ayn imzaya sahip olacaklar ve derlenmeyeceklerdir. 4. Build mensnde Build Solution tklayn. Varsa szdizimi hatalarn dzeltip yeniden oluturun.

Dizinleyicileri arn
1. Code and Text Editor penceresinde, Window1.xaml.cs dosyasn grntleyin ve daha sonra findPhoneClick yntemini bulun. Search by Name dmesi tklandnda bu yntem arlr. Bu yntem u an botur. Aadaki grevleri gerekletirmek iin, aadaki rnekteki kodu ekleyin: 1.1. Form zerindeki name metin kutusundan Text zelliinin deerini okuyun. Bu, kullancnn yazd ad ieren bir dizedir. 1.2. Text dizesi bo deilse, PhoneBookta o ada karlk gelen telefon numarasn bulmak iin, bir dizinleyici kullanarak arama yapmak (Form1in phoneBook adl zel bir PhoneBook alan olduuna dikkat edin); dizeden bir Name nesnesi oluturmak ve bunu PhoneBook dizinleyicisine bir parametre olarak geirmek. 1.3. Form zerindeki phoneNumber metin kutusuna, dizinleyiciden dnen PhoneNumber yapsnn Text zelliini yazmak. findPhoneClick yntemi u ekilde grnmelidir:
private void findPhoneClick(object sender, RoutedEventArgs e) { string text = name.Text; if (!String.IsNullOrEmpty(text)) { phoneNumber.Text = phoneBook[new Name(text)].Text; } }

pucu Bir dizenin bo olup olmadn hesaplamak iin statik String yntemi

IsNullOrEmpty kullanldna dikkat edin. Bir dizenin deer ierip iermediini hesaplamak iin tercih edilen yntemdir. Dize bir deere sahipse true, sahip deilse false dndrr.

2. Window1.xaml.cs dosyasnda findNameClick yntemini bulun. findPhoneClick ynteminin altndadr.

Blm 16

Dizinleyicileri Kullanmak

307

findName_Click yntemi Search by Phone dmesi tklandnda arlr. Bu yntem u anda botur, aadaki gibi uygulanmas gerekir. (Kod, aadaki rnekte koyu harflerle gsterilmitir.) 2.1. phoneNumber metin kutusundan Text zelliinin deerini okumak. Bu deer, kullancnn yazd telefon numarasn ieren bir dizedir. 2.2. Text dizesi bo deilse, o telefon numarasna PhoneBookta karlk gelen ad bulmak iin, dizinleyici kullanarak arama yapmak. 2.3. Form zerindeki name metin kutusuna, dizinleyiciden dnen Name yapsnn Text zelliini yazmak. Tamamlanm yntem u ekilde grnmelidir:
private void findNameClick(object sender, RoutedEventArgs e) { string text = phoneNumber.Text; if (!String.IsNullOrEmpty(text)) { name.Text = phoneBook[new PhoneNumber(text)].Text; } }

3. Build mensnde Build Solution tklayn. Bir hata oluursa dzeltin.

Uygulamay altrn
1. Debug mensnde Start Without Debuggingi tklayn. 2. Metin kutularna adnz ve telefon numaranz girip Add dmesini tklayn. Add dmesini tkladnzda Add yntemi girdileri telefon defterine koyar ve arama iin hazr duruma gelmeleri iin metin kutularn temizler. 3. kinci adm farkl adlarla ve farkl telefon numaralaryla birka kez yineleyin ki telefon defteri birka giri iersin. Not Uygulama, yazdnz telefon numaralarn ve adlar denetlemez ve siz ayn ad ve

telefon numarasn birden fazla yazm olabilirsiniz. Bu karmaklktan kanmak iin, farkl adlar ve telefon numaralar girdiinizden emin olun.

4. Name metin kutusuna ikinci admda kullandnz ad girip Search by Name i tklayn. kinci admda girdiiniz telefon numaras telefon defterinden bulunup Phone Number metin kutusunda grntlenir.

308

Ksm III

Bileenler Yaratmak

5. Phone Number metin kutusuna bir telefon numaras yazn ve daha sonra Search by Phoneu tklayn. Ad telefon defterinden bulunup Name metin kutusunda grntlenir. 6. Name kutusuna tmyle yeni bir ad girip Search by Name i tklayn. Bu kez Phone Number kutusu botur; bunun anlam adn telefon defterinde bulunamaddr. 7. Formu kapatn ve Visual Studio 2008 programlama ortamna dnn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 17e gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 16 Hzl Bavuru


Bunun in
Bir snf ya da yap iin dizinleyici yaratmak

unu Yapn
Dizinleyicinin trn bildirin, ardndan anahtar szck thisi ve keli parantez arasnda dizinleyici bamsz deikenlerini ekleyin. Dizinleyicinin gvdesi bir get ve/veya set eriimcisi ierebilir. rnein:
struct RawInt { ... public bool this [ int index ] { get { ... } set { ... } } ... }

Bir arabirimde bir dizinleyici tanmlamak

Dizinleyiciyi get ve/veya set anahtar szckleri ile tanmlayn. rnein:


interface IRawInt { bool this [ int index ] { get; }

set; }

Blm 16

Dizinleyicileri Kullanmak

309

Bir snf ya da yapda bir arabirim dizinleyicisi gelitirmek

Arabirimi gelitiren snf ya da yapda dizinleyiciyi tanmlayn ve eriimcileri gelitirin. rnein:


struct RawInt : IRawInt { ... public bool this [ int index { get { ... } set { ... } } ... }

Bir snf ya da yapda ak arabirim gelitirmesi kullanarak bir arabirim dizinleyicisi gelitirmek

Arabirimi gelitiren snf ya da yapda arabirimi aka adlandrn, ancak dizinleyici eriilebilirliini belirtmeyin. rnein:
struct RawInt : IRawInt { ... bool IRawInt.this [ int index { get { ... } set { ... } } ... }

Blm 17

Program Akn Kesmek ve Olaylar lemek


Bu blm tamamladktan sonra renecekleriniz:
n n n n n n n

Bir yntem imzasnn soyutlamasn yaratmak iin bir temsilci bildirmek. Belirli bir ynteme bavurmak iin temsilcilerin rneklerini yaratmak. Bir temsilci zerinden bir yntem armak. Bir temsilci kodunu belirtmek iin, bir lambda deyimi tanmlamak. Bir olay alan bildirmek. Bir temsilci kullanarak bir olay ilemek. Bir olay balatmak.

u ana dek kitaptaki eitli altrmalarda yazdnz kodun byk blm, ifadelerin sral olarak altn varsaymaktayd. Bu yaygn bir senaryo olsa da bazen alma srasna mdahale etmenin ve baka, daha nemli bir grevi yapmann gerekli olduunu grrsnz. Grev tamamlannca program brakt yerden devam edebilir. Bu tr programn klasik rnei Microsoft Windows Presentation Foundation (WPF) formudur. Bir form, dme ve metin kutusu gibi denetimler ierir. Bir dmeyi tkladnzda ya da metin kutusuna metin yazdnzda formun hemen yant vermesini beklersiniz. Uygulama geici olarak yapt eyi durdurmak ve sizin girdinizi ilemek durumundadr. Bu tr bir ilem yalnzca grafik arabirimler iin deil, bir ilemin acil olarak gerekletirilmesinin gerektii her uygulama iin geerlidir (rnein, nkleer santralin ar snmas durumunda reaktrn kapatlmas gibi). Bu tr bir uygulamay ilemek iin alma zaman iki ey salamak zorundadr: Acil bir eyin olduunu gstermenin bir yolu ve bu olduunda alan bir yntem. Olaylarn ve temsilcilerin grevi budur. nce temsilcilere bakacaz.

Temsilciler Bildirmek ve Kullanmak


Temsilci bir yntemi iaret eder ve bir yntemi ardnz gibi arabilirsiniz. arlan bir temsilci sradan bir yntem gibi grnr ve davranr. Ancak, bir temsilciyi ardnzda alma zaman aslnda temsilcinin bavurduu yntemi altrr. Temsilcinin bavurduu bir yntemi dinamik olarak deitirebilirsiniz; dolaysyla, bir temsilciyi aran kod aslnda her

311

312

Ksm III

Bileenler Yaratmak

altnda farkl bir yntem altrabilir. Temsilcileri anlamann en iyi yolu onlar ibanda grmektir; bu yzden gelin bir rnek zerinde alalm. Not C++ biliyorsanz bir temsilci, ilev iaretisine benzer. Ancak, ilev iaretilerinin aksine,

temsilciler tr gvenlidir; bir temsilcinin yalnzca temsilcinin imzasyla eleen bir ynteme bavurmasn salayabilirsiniz ve geerli bir ynteme bavurmayan bir temsilciyi aramazsnz.

Otomasyonlu Fabrika Senaryosu


Otomasyonlu bir fabrika iin denetim sistemlerini yazdnz varsayalm. Fabrika, retimde (metal folyolar biimlendiren ve bken, birbirine kaynak yapan, boyayan vb. gibi) farkl grevler gerekletirilen birok farkl makine ierir. Her makine uzman kiilerce retilip kurulmutur. Makinelerin tm bilgisayar denetimli olup her datc makinelerini denetlemeniz iin bir dizi API (Uygulama Programlama Arabirimi) salamtr. Sizin greviniz, makineler tarafndan kullanlan farkl sistemleri tek bir denetleme programnda birletirmektir. Odaklanmaya karar verdiiniz ynlerden birisi, gerektiinde tm makineleri kapatacak bir yntem salamaktr! Not API, Application Programming Interfacein ksaltmasdr. Bir yazlm denetleyebilmeniz iin
yazlm tarafndan salanan bir yntem ya da yntemler topluluudur. .NET Frameworku bir APIler topluluu olarak dnebilirsiniz nk .NET alma zaman katman ve Microsoft Windows iletim sistemini denetlemenizi salayan yntemler salar.

Her makinenin gvenle kapanmak iin kendine zg bilgisayar denetimli bir sreci (API) vardr. Bunlar aada zetlenmitir:
StopFolding(); FinishWelding(); PaintOff(); // makineyi ekillendirmek // makineyi kaynaklamak // makineyi boyamak

Temsilci Kullanmadan Fabrika Senaryosunu Uygulamak


Denetim programnda kapatma ilevini uygulamann basit bir yntemi aada gsterilmitir:
class Controller { // farkl makineleri temsil eden alanlar private FoldingMachine folder; private WeldingMachine welder; private PaintingMachine painter; ...

Blm 17
public void ShutDown() { folder.StopFolding(); welder.FinishWelding(); painter.PaintOff(); } ... }

Program Akn Kesmek ve Olaylar lemek

313

Bu yaklam alsa da ok geniletilebilir ya da esnek deildir. Fabrika yeni bir makine alsa bu kodu deitirmeniz gerekir; Controller (Denetleyici) snfyla makineler sk skya elemitir.

Temsilci Kullanarak Fabrika Senaryosunu Uygulamak


Her yntemin ad farkl olsa da ayn ekle sahiptirler; parametre almazlar ve bir deer dndrmezler (durum byle olmad zaman ne olduunu sonra greceiz; sabrl olun!). Dolaysyla, her yntemin genel biimi aadaki gibidir:
void methodName();

te temsilci burada ie yarar. Bu ekille eleen bir temsilci makine kapatma yntemlerinden herhangi birine bavurmak iin kullanlabilir. Bir temsilciyi aadaki gibi bildirirsiniz:
delegate void stopMachineryDelegate();

Aadaki noktalara dikkat edin :


n n

Bir temsilci bildirirken delegate anahtar szcn kullann. Bir temsilci bavurabilecei yntemlerin ekillerini tanmlar. Siz dn trn (bu rnekte, void), temsilci adn (stopMachineryDelegate) ve varsa parametreleri (burada yoktur) belirtirsiniz.

Temsilciyi tamamladktan sonra rnei yaratabilir ve += ilecini kullanarak eleen ynteme bavurmasn salayabilirsiniz. Bunu, controller snfnn kurucusunda aadaki gibi yapabilirsiniz:
class Controller { delegate void stopMachineryDelegate(); private stopMachineryDelegate stopMachinery; // an instance of the delegate ... public Controller() { this.stopMachinery += folder.StopFolding; } ... }

314

Ksm III

Bileenler Yaratmak

Bu szdizimine almak biraz zaman alabilir. Temsilciye yntemi eklersiniz; bu aamada yntemi armanz sz konusu deildir. Temsilcilerle kullanldnda + ileci bu yeni anlam tamak iin ar yklenmitir (leler hakknda daha fazla bilgiyi Blm 21de bulabilirsiniz). Yalnzca yntemin adn belirttiinize ve herhangi bir parantez ya da parametre eklememeniz gerektiine dikkat edin. Balatlmam temsilci zerinde += ilecini kullanmak gvenlidir. Otomatik olarak balatlacaktr. Ayrca, aadaki gibi new anahtar szcn kullanarak bir temsilciyi, tek bir zel yntemle aka balatabilirsiniz:
this.stopMachinery = new stopMachineryDelegate(folder.StopFolding);

Temsilciyi aadaki gibi altrarak yntemi arabilirsiniz


public void ShutDown() { this.stopMachinery(); ... }

Bir temsilciyi altrma bir yntem ars yapmayla ayn szdizimini kullanr. Temsilcinin bavurduu yntem parametre alyorsa bunlar bu aamada belirtmeniz gerekir. Not Balatlmam bir temsilciyi altrmaya alrsanz bir NullReferenceException zel durumu
oluur.

Bir temsilci kullanmann asl yarar birden ok ynteme bavurabilmesidir; Bunlar aadaki gibi temsilciye eklemek iin += ilecini kullanmanz yeterlidir:
public Controller() { this.stopMachinery += folder.StopFolding; this.stopMachinery += welder.FinishWelding; this.stopMachinery += painter.PaintOff; }

Controller snfnn Shutdown (Kapat) yntemindeki this.stopMachinery()yi altrmak otomatik olarak her yntemi srayla arr. Shutdown ynteminin ka adet makine bulunduunu ya da yntemlerin adlarnn ne olduunu bilmesi gerekmez. -= ilecini kullanarak bir yntemi temsilciden silebilirsiniz:
this.stopMachinery -= folder.StopFolding;

Blm 17

Program Akn Kesmek ve Olaylar lemek

315

Geerli dzen, makine yntemlerini Controller kurucusundaki temsilciye ekler. Controller snfin eitli makinelerden tam bamsz klmak iin, stopMachineryDelegate trn genel yapmanz ve Controller dndaki snflarn temsilciye yntem eklemesinin bir yolunu bulmanz gerekir. Birka seeneiniz vardr:
n

stopMachinery temsilci deikenini genel yapn:


public stopMachineryDelegate stopMachinery;

stopMachinery temsilci deikenini zel olarak tutun, ancak buna eriim salamak iin bir okuma/yazma zellii salayn:
public delegate void stopMachineryDelegate(); ... public stopMachineryDelegate StopMachinery { get { return this.stopMachinery; } set { this.stopMachinery = value; } }

Ayr Add ve Remove yntemleri uygulayarak tam bir kapslleme salayn. Add yntemi bir yntemi parametre olarak alp temsilciye eklerken Remove yntemi belirtilen yntemi temsilciden kaldrr. (Bir temsilci tr kullanarak bir yntemi parametre olarak belirttiinize dikkat edin):
public void Add(stopMachineryDelegate stopMethod) { this.stopMachinery += stopMethod; } public void Remove(stopMachineryDelegate stopMethod) { this.stopMachinery -= stopMethod; }

Nesne ynelimli programclktan dn vermeyenlerdenseniz byk olaslkla Add/Remove yaklamn benimseyeceksiniz. Ancak, dierleri de sk kullanlan alternatifler olduundan burada gsterilmektedirler.

316

Ksm III

Bileenler Yaratmak

Hangi teknii seerseniz sein makine yntemlerini temsilciye ekleyen kodu Controller kurucusundan kaldrmanz gerekir. Daha sonra, dier makineleri temsil eden bir Controller ve nesneleri aadaki gibi balatabilirsiniz (bu rnekte Add/ Remove yaklam kullanlmtr):
Controller control = new Controller(); FoldingMachine folder = new FoldingMachine(); WeldingMachine welder = new WeldingMachine(); PaintingMachine painter = new PaintingMachine(); ... control.Add(folder.StopFolding); control.Add(welder.FinishWelding); control.Add(painter.PaintOff); ... control.ShutDown(); ...

Temsilciler Kullanmak
imdiki altrmada, bir WPF form zerinde dijital saat olarak davranan bir metin kutusunda zaman gsteren bir yntemi kapsllemek iin bir temsilci yaratacaksnz. Bu temsilci nesnesini, her saniye bal temsilciyi aran Ticker adnda bir snfa balayacaksnz.

Dijital saat uygulamasn tamamlayn


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 17\ Delegates klasrnde yer alan Delegates projesini an. 3. Debug mensnde Start Without Debugging i tklayn. Proje oluturulur ve altrlr. Bir dijital saat gsteren form grnr. Saat o anki saati 00:00:00 olarak gsterir. Bu blm gece yars okumuyorsanz, saat yanl zaman gstermektedir. 4. Start, sonra da Stopu tklayn. Hibir ey olmaz. Start ve Stop yntemleri henz gelitirilmemitir. Sizin greviniz bu yntemleri gelitirmektir 5. Formu kapatn ve Visual Studio 2008 ortamna geri dnn. 6. Ticker.cs kaynak dosyasn ap Code and Text Editor penceresinde grntleyin. Bu dosya bir saatin i alma dzenini modelleyen Ticker adl bir snf ierir. Her saniye bir titreim gndermeyi salayan ticking adl bir System.Timers.Timer nesnesi kullanr. Bu snf bir olay (olaylar ileride aklanmaktadr) kullanarak titreimi yakalar ve sonra bir temsilci ararak grntnn gncelletirilmesini salar.

Blm 17

Program Akn Kesmek ve Olaylar lemek

317

Not .NET Framework, System.Timers.Timer adnda baka bir zamanlayc snf salar. Bu
snf, DispatcherTimer snf ile ayn ilevsellii salar fakat bir WPF uygulamasnda kullanmak iin uygun deildir.

7. Code and Text Editor penceresinde Tick temsilcisinin bildirildii yeri bulun. Neredeyse dosyann en stndedir ve aadaki gibi grnr:
public delegate void Tick(int hh, int mm, int ss);

Tick temsilcisi, tamsay parametresi alan ancak bir deer dndrmeyen bir ynteme bavurmak iin kullanlabilir. Snfn sonunda, bu tre bal tickers adl bir temsilci deikeni vardr. Bu snftaki Add ve Remove yntemleri kullanarak (aadaki kod rneinde gsterilmitir), eleen yntemleri tickers temsilci deikenine ekleyip kaldrabilirsiniz.
class Ticker { ... public void Add(Tick newMethod) { this.tickers += newMethod; } public void Remove(Tick oldMethod) { this.tickers -= oldMethod; } ... private Tick tickers; }

8. Clock.cs kaynak dosyasn ap Code and Text Editor penceresinde grntleyin. Clock snf saat grntsn modeller. Balatldklarnda saatin almasn balatan ve durduran Start ve Stop adl yntemleri ve parametre (saat, dakika ve saniye) tarafndan belirtilen zaman gstermek iin bir dizeyi biimlendiren ve sonra bunu display adl TextBox alannda grntleyen RefreshTime adl bir yntemi vardr. Bu TextBox alan kurucuda balatlr. Snf ayrca pulsed adl zel bir Ticker alan ierir ve bu, grntlenen zamann ne zaman gncelletirileceini saate bildirir:
class Clock { ... public Clock(TextBox displayBox) { this.display = displayBox; } ...

318

Ksm III

Bileenler Yaratmak
private void RefreshTime(int hh, int mm, int ss ) { this.display.Text = string.Format({0:D2}:{1:D2}:{2:D2}, hh, mm, ss); } private Ticker pulsed = new Ticker(); private TextBox display;

9. Window1.xaml.cs kaynak dosyasnn kodunu Code and Text Editor penceresinde grntleyin. Kurucunun, parametre olarak digital adl bir TextBox alanndan geen Clock snf iin yeni bir rnek yarattna dikkat edin:
public Window1() { ... clock = new Clock(digital); }

Dijital alan formda grntlenen TextBox denetimidir. Clock snf, bunun ktsn bu TextBox denetiminde grntleyecektir. 10. Clock.cs kaynak dosyasna dnn. Ticker.Add yntemini kullanarak pulsed nesnesindeki Clock.RefreshTime yntemini temsilciye eklemesi iin Clock.Start yntemini aadaki gibi gelitirin. Bir an getiinde, pulsed temsilcisi arlr ve bu ifade RefreshTime ynteminin uygulanmasna neden olur. Start yntemi aadaki gibi grnr:
public void Start() { pulsed.Add(this.RefreshTime); }

11. Ticker.Remove yntemini kullanarak pulsed nesnesindeki Clock.RefreshTime yntemini temsilciden kaldrmas iin Clock.Stop yntemini balatn. Stop yntemi aadaki gibi grnr:
public void Stop() { pulsed.Remove(this.RefreshTime); }

12. Debug mensnde Start Without Debuggingi tklayn. 13. WPF form zerinde Start tklayn. Form imdi doru zaman grntler ve her saniye gncellenir. 14. Stop u tklayn. Grnt tepki vermeyi keser ya da donar. Bunun nedeni, Stop dmesinin artk RefreshTime yntemini Ticker temsilcisinden ayran Clock.Stop yntemini aryor olmasdr. Dier bir deyile, artk RefreshTime her saniye arlmaz.

Blm 17

Program Akn Kesmek ve Olaylar lemek

319

Not Start birden ok tklarsanz, Stopu da ayn sayda tklamanz gerekir. Start her

tkladnzda, temsilciye RefreshTime yntemine bir bavuru eklersiniz. Saat durmadan nce bu bavurularn tmn kaldrmanz gerekir.

15. Tekrar Start tklayn. Grnt ilemeye devam eder ve zaman her saniye gncelletirir. Bunun nedeni, Start dmesinin artk RefreshTime yntemini Ticker temsilcisine balayan Clock.Start yntemini aryor olmasdr. 16. Formu kapatn ve Visual Studio 2008 ortamna geri dnn.

Lambda Deyimler ve Temsilciler


u ana dek grdnz bir temsilciye bir yntem eklemeyle ilgili tm rnekler yntemin adn kullanr. rnein, daha nce gsterilen otomasyonlu fabrika senaryosuna dnersek, folder nesnesinin StopFolding (DurdurKatlama) yntemini stopMachinery (durdurMekanizma) temsilcisine eklemek iin aadakini yaptk:
this.stopMachinery += folder.StopFolding;

Temsilcinin imzasyla eleen uygun bir yntem varsa bu yaklam ok yararldr, ancak ya durum bu deilse? StopFolding ynteminin gerekte aadaki imzaya sahip olduunu dnn:
void StopFolding(int shutDownTime); // Belirlenen saniyeler iinde kapat

Bu imdi FinishWelding ve PaintOff yntemlerinden farkl olduundan tm yntemi ilemek iin ayn temsilciyi kullanamayz.

Bir Yntem Badatrcs Yaratmak


Bu problemi zmenin yolu, aadaki gibi, StopFoldingi aran ama kendisi hibir parametre almayan baka bir yntem yaratmaktr:
void FinishFolding() { folder.StopFolding(0); // Hemen kapat }

Daha sonra, ayn szdizimini kullanarak, stopMachinery temsilcisine StopFolding yntemi yerine FinishFolding yntemini ekleyebilirsiniz:
this.stopMachinery += folder.FinishFolding;

320

Ksm III

Bileenler Yaratmak

stopMachinery temsilci arldnda, 0 parametresini geiren ve StopFolding yntemini aran FinishFolding yntemi arlr. Not FinishFolding yntemi badatrcya klasik bir rnektir; farkl bir imza vermek iin bir

yntemi dntren (ya da badatran) bir yntem. Bu kalp ok yaygn olup Gamma, Helm, Johnson ve Vlissidesin yazd Design Patterns: Elements of Reusable Object Oriented Architecture (Addison-Wesley Professional; 1994) adl kitapta belgelendirilmitir

Birok durumda, bunun gibi badatrc yntemler kk olup bir yntemler denizinde kaybolmalar olanakldr, zellikle byk bir snf iinde. stelik ShopFolding ynetimini temsilcinin kullanm iin badatrmalar dnda baka bir yerde arlmalar pek dk bir olaslktr. C# bunun gibi durumlar iin lambda (adsz) deyimler salar.

Lambda Deyimini Badatrc Olarak Kullanmak


Lambda deyimi, yntem dndren bir deyimdir. C#da imdiye kadar grdnz deyimlerin ou bir deer dndrdnden, bu biraz garip gelebilir. Haskell gibi ilevsel programlama dillerine aina iseniz, bu kavram da size yabanc gelmez. Lambda deyimler karmak deildir ve szdiziminin kullanmn anladktan sonra, ok yararl olduklarn greceksiniz. Blm 3te, tipik bir yntemin drt e ierdiini grdnz: dn tr, yntem ad, parametre listesi ve yntem gvdesi. Bir lambda deyimi bu elerin iki tanesini ierir: parametre listesi ve yntem gvdesi. Lambda deyimleri bir yntem ad tanmlamaz ve dn tr (eer varsa), lambda deyiminin kullanld ierikten karlr. FoldingMachine snfnn StopFolding ynteminde problem, bu yntemin imdi iki parametre almas, bu nedenle, stopMachinery temsilcisine ekleyebileceiniz, parametre almayan bir badatrc yaratmanz gerekmesidir. Bunun iin aadaki ifadeyi kullanabilirsiniz:
this.stopMachinery += () => { folder.StopFolding(0); };

+= ilecinin sa tarafndaki metnin tm bir lambda deyimidir. stopMachinery temsilcisine eklenen yntemi tanmlar. Aadaki szdizimi kurallarn izler:
n

Parametre listesi kme parantezi iinde yer alr. Sradan bir yntemde olduu gibi, tanmladnz yntem (nceki altrmadaki gibi) bir parametre almyorsa da, parantezleri yazmanz gerekir. => ileci, C# derleyicisine bunun bir lambda deyimi olduunu gsterir. Yntem gvdesi. Burada gsterilen rnek olduka basittir, tek bir ifade ierir. Bununla birlikte, bir lambda deyimi birden fazla ifade ierebilir ve bu ifadeleri istediiniz biimde yazabilirsiniz. Sadece her ifadeden sonra noktal virgl eklemeyi unutmayn.

n n

Ak konumak gerekirse, bir lambda deyiminin gvdesi birden fazla ifade ieren bir yntem gvdesi olabilir ya da gerekten tek bir deyim olabilir. Bir lambda deyiminin gvdesi tek

Blm 17

Program Akn Kesmek ve Olaylar lemek

321

bir deyim ieriyorsa, kme parantezlerini ve noktal virgl kullanmayabilirsiniz (ifadeyi tamamlamak iin yine de bir noktal virgl gerekmektedir):
this.stopMachinery += () => folder.StopFolding(0) ;

stopMachinery temsilcisini ardnzda, lambda deyimi tarafndan tanmlanan kod alacaktr.

Lambda Deyimlerinin Biimi


Lambda deyimler, ok sayda farkl biim alabilir. Lambda deyimler aslnda, ilevleri (ilevi, bir deer dndren yntem olarak dnebilirsiniz) tanmlamak iin bir gsterim salayan Lambda Calculus ad verilen matematiksel bir gsterimin parasdr. C# dili, lambda deyimlerinin uygulanmasnda, Lambda Calculus szdizimini ve anlam bilimini gelitirmi olmakla birlikte, birok orijinal ilke yine de uygulanr. C#da bulunan lambda deyiminin farkl biimleri aada gsterilmitir:
x => x * x // Parametrenin karesini dndren basit bir ifade // Parametre x tr balamdan karlr.

x => { return x * x ; } // Semantik olarak nceki ifadeyle ayn // ama gvde olarak basit bir ifade yerine // C# ifade bloku kullanr (int x) => x / 2 // Parametrenin 2ye blnen deerini // dndren basit bir ifade // Parametre x tr ak ekilde belirtilir. Bir yntem arma ifade hibir parametre almyor. ifade bir deer dndrebilir, ama dndrmeyebilir de. Birden ok parametre; derleyici parametre trleri karr. Parametre x deeri tarafndan geirilir, bylece ++ ilemi ifade ile kstl kalr. Birden ok parametre ak trlere sahip Parametre x bavuru tarafndan geirilir bylece ++ ileminin etkisi kalcdr.

() => folder.StopFolding(0) // // // //

(x, y) => { x++; return x / y; } // // // // //

(ref int x, int y) { x++; return x / y; } // // // // //

Lambda deyiminin bilmeniz gereken baz zellikleri aada zetlenmitir:

322

Ksm III
n

Bileenler Yaratmak

Lambda deyimi parametre alyorsa, parametreleri => ilecinin solunda parantez iinde yazarsnz. Parametre trlerini belirtmeyebilirsiniz, C# derleyicisi lambda deyiminin ieriinden karacaktr. Lambda deyiminin deerlerini kapsam dnda da deitirebilmesini istiyorsanz, parametreleri bavuru yoluyla (ref anahtar szcn kullanarak) geirebilirsiniz, fakat bu nerilmez. Lambda deyimleri deerler dndrebilir fakat dn deerlerinin trnn, dn deerlerinin eklenecei temsilciyle elemesi gerekir. Lambda deyiminin gvdesi, basit bir deyim ya da birden fazla ifade, yntem arlar, deiken bildirimleri bulunan bir C# kod blou olabilir. Lambda deyimi ynteminde tanmlanan deikenler, yntem bittiinde kapsam dna kar. Lambda deyimi, tanmland kapsam dndaki deikenlerin tmne eriebilir ve deitirebilir. Bu zellie ok dikkat edin!

Kitabn sonraki blmlerinde, lambda deyimleri hakknda daha fazla bilgi bulacak, parametreler alan ve deerler dndren daha fazla rnek greceksiniz.

Lambda Deyimler ve Anonim Yntemler


Lambda deyimler, C# diline 3.0 srmnde eklenen yeni bir eklentidir. C# 2.0 srmnde, benzer bir grev gerekletiren fakat lambda deyimler gibi esnek olmayan anonim yntemler sunulmutu. Anonim yntemler ncelikle, adlandrlm bir yntem yaratmak zorunda kalmadan temsilciler tanmlayabilmeniz iin eklenmitir; aadaki gibi basite yntem ad yerine yntem gvdesinin tanmn salarsnz:
this.stopMachinery += delegate { folder.StopFolding(0); };

Ayrca aadaki gibi, temsilci yerine bir anonim yntemi parametre olarak geirebilirsiniz:
control.Add(delegate { folder.StopFolding(0); } );

Bir anonim yntemi yazarken nce delegate anahtar szcn yazmanz gerektiine dikkat edin. Ayrca, gerekli parametreler delegate anahtar szcnden sonra kme parantezi iinde belirtilir. rnein:
control.Add(delegate(int param1, string param2) { /* code that uses param1 and param2 */ ... });

Lambda deyimlerinin, anonim yntemlerinin szdiziminden daha ksa ve z szdizimi olduunu ve C#n ileri seviye yaklamlarnn birounda yaygnlatn greceksiniz. Genel anlamda, kodunuzda anonim yntemlerden ok lambda deyimler kullanmalsnz.

Blm 17

Program Akn Kesmek ve Olaylar lemek

323

Bildirimleri Olaylarla Etkinletirmek


Bir nceki blmde, bir temsilci trnn nasl bildirildiini, temsilcinin nasl arldn ve temsilci rneklerinin nasl yaratldn grdnz. Ancak, bu hikayenin yarsdr. Temsilciler herhangi bir sayda yntemi dolayl olarak balatmanza izin verse de temsilciyi ak biimde balatmanz gerekir. Birok durumda, nemli bir ey olduunda temsilciyi otomatik olarak altrmak yararl olur. rnein, otomasyonlu fabrika senaryosunda, bir makine ar sndnda stopMachinery temsilcisini balatmak ve makineyi durdurmak nemli olabilir. .NET Frameworkte olaylar nemli eylemleri tanmlayp yakalamanza ve durumu ilemek iin bir temsilci ayarlamanza olanak verir. .NET Frameworkdeki birok snf, olaylar sergiler. Bir WPF formu zerine yerletirebileceiniz denetimlerin ou ve Windows snfnn kendisi, rnein kullanc bir dmeyi tklad ya da bir alana bir ey yazdnda kodu altrmanz iin olaylar kullanr. Ayrca kendi olaylarnz da tanmlayabilirsiniz.

Bir Olay Bildirmek


Bir olay, olay kayna olarak dnlm bir snfta bildirirsiniz. Bir olay kayna genellikle evresini izleyen ve nemli bir ey olunca bir olay aran bir snftr. Otomasyonlu fabrikada bir olay kayna, her makinenin ssn izleyen bir snf olabilir. Bir makinenin s snrn getiini (makinenin ar scak olduunu) belirleyen s izleyici snf bir machine overheating (makine ar snmas) olay arr. arlan olay bir yntemler listesi barndrr. Bu yntemlere bazen aboneler denir. Bu yntemler makine ar snmas olayn ilemeye ve gerekli nlemi almaya, yani makineleri kapatmaya hazr olmaldr. Bir olay, bir alan bildirir gibi bildirirsiniz. Ancak, olaylar temsilcilerle kullanlmak zere tasarlandklarndan bir olayn tr bir temsilci olmaldr ve siz bildirimin nne event anahtar szcn koymalsnz. Bir olay bildirmek iin aadaki szdizimini kullann: event delegateTypeName eventName rnein, ite otomasyonlu fabrikadaki StopMachineryDelegate temsilcisi. Bu, makinelerin ssn izleyen eitli elektronik alglayclara bir arabirim salayan TemperatureMonitor adl yeni bir konuma yerletirilmitir (buras, olay iin Controller snfndan daha mantkl bir yerdir):
class TemperatureMonitor { public delegate void StopMachineryDelegate(); ... }

324

Ksm III

Bileenler Yaratmak

stopMachineryDelegate temsilcisini aracak olan MachineOverheating olayn u ekilde tanmlayabilirsiniz:


class TemperatureMonitor { public delegate void StopMachineryDelegate(); public event StopMachineryDelegate MachineOverheating; ... }

TemperatureMonitor snfndaki mantk (burada gsterilmemitir) otomatik olarak MachineOverheating olayn gerektii gibi arr. Bir Olay armak balkl bir sonraki blmde bir olay nasl kaldracanz greceksiniz. Ayrca, yntemleri olayn dayand temsilciye eklemek yerine olayn kendisine eklersiniz (olaya subscribing (abone olmak) olarak bilinen ilem).

Bir Olaya Abone Olmak


Temsilciler gibi, olaylar da += ileciyle hazr olarak gelirler. Bir olaya abone olmak iin bu += ilecini kullanrsnz. Otomasyonlu fabrikada her makineyi denetleyen yazlm, MachineOverheating olay arldnda, aadaki gibi kapatma yntemlerinin arlmasn salayabilir:
class TemperatureMonitor { public delegate void StopMachineryDelegate(); public event StopMachineryDelegate MachineOverheating; ... } ... TemperatureMonitor tempMonitor = new TemperatureMonitor(); ... tempMonitor.MachineOverheating += () => { folder.StopFolding(0); }; tempMonitor.MachineOverheating += welder.FinishWelding; tempMonitor.MachineOverheating += painter.PaintOff;

Szdiziminin bir temsilciye bir yntem eklemekle ayn olduuna dikkat edin. Hatta bir lambda deyimi kullanarak da abone olabilirsiniz. tempMonitor.MachineOverheating olay alnca abone olan tm yntemleri arr ve makineleri kapatr.

Bir Olay Aboneliini ptal Etmek


Bir temsilciyi bir olaya balamak iin += ilecinin kullanldn bilerek, bir temsilciyi bir olaydan ayrmak iin -= ilecinin kullanlacan tahmin edebilirsiniz. -= ilecini armak temsilciyi, olayn iindeki bal temsilciler koleksiyonundan karr. Bu eyleme genellikle bir olay aboneliini iptal etmek denir.

Blm 17

Program Akn Kesmek ve Olaylar lemek

325

Bir Olay armak


Tpk bir temsilci gibi, bir olay da bir yntem gibi arlabilir. Bir olay ardnzda bal olan btn temsilciler srayla arlr. rnein; aada MachineryOverheating olayn aran bir zel Notify yntemi ile TemperatureMonitor snfn grebilirsiniz:
class TemperatureMonitor { public delegate void StopMachineryDelegate; public event StopMachineryDelegate MachineOverheating; ... private void Notify() { if (this.MachineOverheating != null) { this.MachineOverheating(); } } ... }

Bu yaygn bir deyimdir. null denetimi gereklidir, nk bir olay alan dolayl olarak nulldur ve yalnzca bir yntem += ilecini kullanarak ona abone olunca null olmaz. Bir null olay armaya alrsanz bir NullReferenceException zel durumu oluur. Olay tanmlayan temsilci parametre isterse, olay ardnzda uygun bamsz deikenler salanmaldr. Bunun baz rneklerini ileride greceksiniz. nemli Olaylar ok yararl bir yerleik gvenlie sahiptir. Genel bir olay (MachineOverheating gibi) yalnzca snf (TemperatureMonitor snf) iinde tanml yntemler tarafndan arlabilir. Yntemi snf dnda arma giriimleri bir derleyici hatasyla sonulanr.

WPF Kullanc Arabirimi Olaylarn Anlamak


Daha nce sz edildii gibi, GUI (Globally Unique Identifier, Genel Benzersiz Tammlayc) oluturmak iin kullanlan .NET Framework snflar ve denetimleri olaylar bolca kullanrlar. Bu kitabn ikinci yarsnda GUI olaylarn birok yerde grecek ve kullanacaksnz. rnein, Button snf ButtonBase snfndan, RoutedEventHandler trnde Click adl bir genel olay devralarak trer. RoutedEventHandler temsilcisi iki parametre ister; olayn arlmasna neden olan nesneye bir bavuru ve olayla ilgili ek bilgi ieren bir RoutedEventArgs nesnesi:
public delegate void RoutedEventHandler(Object sender, RoutedEventArgs e);

326

Ksm III

Bileenler Yaratmak

Button snf unun gibi grnr:


public class ButtonBase: ... { public event RoutedEventHandler Click; ... } public class Button: ButtonBase { ... }

Ekrandaki dmeyi tkladnzda Button snf otomatik olarak Click olayn balatr (bunun nasl olduu kitabn kapsam dndadr). Bu dzenleme, seilen bir yntem iin temsilci yaratma ve bu temsilciyi gerekli bir olaya balama iini kolaylatrr. Aadaki rnek, okay adl bir dme, okayClick adl bir yntem ve okay dmesi iindeki Click olayn okayClick yntemine balayan kodu ieren bir WPF formunu gsteriyor:
public partial class Example : System.Windows.Window, System.Windows.Markup.IComponentConnector { internal System.Windows.Controls.Button okay; ... void System.Windows.Markup.IComponentConnector.Connect(...) { ... this.okay.Click += new System.Windows.RoutedEventHandler(this.okayClick); ... } ... }

Bu kod genellikle sizden saklanr. Visual Studio 2008te Design View kullandnzda ve formun Extensible Application Markup Language (XAML) tanmnda, okayClicke okay dmesinin Click zelliini atadnzda, Visual Studio 2008 bu kodu sizin iin retir. Yapmanz gereken, uygulama mantnz, Example.xaml.cs dosyasnda erimeniz gereken kod parasnda, olay ileme yntemi, okayClickde yazmaktr.
public partial class Example : System.Windows.Window { ... private void okayClick(object sender, RoutedEventArgs args) { // your code to handle the Click event } }

GUI snflarnn oluturduu olaylar her zaman ayn yapdadr. Olaylar, imzas bir void dn tr ve iki bamsz deikeni olan bir temsilci trdr. lk bamsz deiken her zaman

Blm 17

Program Akn Kesmek ve Olaylar lemek

327

olayn gndericisi, ikinci bamsz deikense EventArgs bamsz deikenidir (ya da EventArgsdan tretilmi bir snf). Sender (Gnderici) bamsz deikeni, birden ok olay iin tek temsilciyi tekrar tekrar kullanmanz salar. Temsil edilen yntem, gnderici bamsz deikenini inceler ve ona gre yant verir. rnein, Click olayn iki dmeye abone yapmak iin (ayn yntemi iki farkl olaya eklersiniz) ayn yntemi kullanabilirsiniz. Olay arlnca yntemdeki kod hangi dmenin tklandn belirlemek iin gnderici bamsz deikenini inceler. Blm 22de, WPF denetimleri iin olaylar nasl ileyeceinizi greceksiniz.

Olaylar Kullanmak
Aadaki altrmada, ilk altrmada tamamladnz program basitletirmek iin olaylar kullanacaksnz. Ticker snfna bir olay alan ekleyecek ve Add ve Remove yntemlerini kaldracaksnz. Daha sonra olaya abone olmak iin Clock.Start ve Clock. Stop yntemlerini deitireceksiniz. Ayrca, her saniyede bir titreim almak iin Ticker snf tarafndan kullanlan Timer nesnesini inceleyeceksiniz.

Dijital saat uygulamasyla yeniden aln


1. Delegates projesini grntleyen Visual Studio 2008e dnn. 2. Code and Text Editor penceresinde Ticker.cs dosyasn grntleyin. Bu dosya Ticker snfndaki Tick temsilci trnn bildirimini ierir:
public delegate void Tick(int hh, int mm, int ss);

3. Ticker snfna Tick trnde tick adl bir genel olay ekleyin. Ticker snf imdi yle grnr:
class Ticker { public delegate void Tick(int hh, int mm, int ss); public event Tick tick; ... }

4. Artk geersiz olan aadaki tickers temsilci deikenini Ticker snfnn sonunda aklama satr haline getirin.
// private Tick tickers;

5. Ticker snfndan Add ve Remove yntemlerini aklama satr haline getirin. Ekleme ve kaldrma ilevleri otomatik olarak, olay nesnesinin += ve -= ileleri tarafndan sunulacaktr.

328

Ksm III

Bileenler Yaratmak

6. Ticker.Notify yntemini bulun. Bu yntem nceden, Tick temsilcisinin tickers adnda bir rneini balatmt. Bunun yerine tick olayn aracak biimde deitirin. Olay armadan nce tickin null olup olmadn denetlemeyi unutmayn. Notify yntemi aadaki gibi grnr:
private void Notify(int hours, int minutes, int seconds) { if (this.tick != null) this.tick(hours, minutes, seconds); }

Tick temsilcisinin parametreler belirttiine dikkat edin. Bu yzden tick olayn aran ifade, bu parametrelerin her biri iin bamsz deiken belirtmelidir. 7. Snfn sonundaki ticking deikenini inceleyin:
private DispatcherTimer ticking = new DispatcherTimer();

DispatcherTimer snf, belirli aralklarla bir olay tekrar tekrar armaya programlanabilir. 8. Ticker snf iin kurucuyu inceleyin:
public Ticker() { this.ticking.Tick += new EventHandler(this.OnTimedEvent); this.ticking.Interval = new TimeSpan(0, 0, 1); // 1 seconds this.ticking.Start(); }

DispatcherTimer snf, Interval zelliinin deerine gre dzenli aralklarla arlabilen Tick olayn gsterir. Interval zelliini TimeSpane ayarlarmak, Tick olaynn saniyede bir arlmasna neden olur. Zamanlayc, siz Start yntemini arnca balar. Tick olayna abone olan yntemler, EventHandler temsilcisinin imzas ile elemelidir. EventHandler temsilcisi, daha nce tanmlanan EventHandler temsilcisi ile ayn imzaya sahiptir. Ticker kurucu, bu temsilcinin, OnTimedEvent yntemine bavuran ve Tick olayna abone olan bir rneini yaratr. Ticker snfndaki OnTimedEvent yntemi, statik DateTime.Now zelliini inceleyerek o anki saati elde eder. DateTime yaps, .NET Framework snf ktphanesinin parasdr. Now zellii bir DateTime yaps dndrr. Bu yap, Hour, Minute ve Second gibi birka alana sahiptir. OnTimedEvent yntemi, Notify yntemi zerinden tick olayn balatmak iin bu bilgiyi kullanr.
private void { DateTime int hh = int mm = OnTimedEvent(object source, EventArgs args) now = DateTime.Now; now.Hour; now.Minutes;

Blm 17
int ss = now.Seconds; Notify(hh, mm, ss); }

Program Akn Kesmek ve Olaylar lemek

329

9. Code and Text Editor penceresinde Clock.cs dosyasn grntleyin. 10. Clock.Start yntemini, temsilci += ilecini kullanarak pulsed alannn tick olayna balanacak biimde deitirin: Clock.Start yntemi aadaki gibi grnmelidir:
public void Start() { pulsed.tick += this.RefreshTime; }

11. Code and Text Editor penceresinde Clock.Stop yntemini, temsilci -= ilecini kullanarak pulsed alannn tick olayndan ayrlacak biimde deitirin. Clock.Stop yntemi aadaki gibi grnmelidir:
public void Stop() { pulsed.tick -= this.RefreshTime; }

12. Debug mensnde Start Without Debugging i tklayn. 13. Start tklayn. Dijital saat formu doru zaman gsterir ve her saniye gncellenir. 14. Stopu tklayn ve saatin durduunu dorulayn. 15. Formu kapatn ve Visual Studio 2008e dnn.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 18e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 17 Hzl Bavuru


Bunun in
Bir temsilci tr bildirmek

unu Yapn
delegate anahtar kelimesini yazn, ardndan dn trn, temsilci trnn adn ve parametre trlerini ekleyin. rnein:
delegate void myDelegate();

330

Ksm III

Bileenler Yaratmak

Temsilcinin, tek bir zel yntemle balatlan bir rneini yaratmak

Bir snf ya da yap iin kullandnz szdiziminin aynsn kullann: new anahtar szcn yazn, ardndan trn adn (temsilcinin adn) ve parantez iinde bamsz deikeni ekleyin. Bamsz deiken imzas tam olarak temsilcinin imzasna uyan bir yntem olmaldr. rnein:
delegate void myDelegate(); private void myMethod() { ... } ... myDelegate del = new myDelegate(this.myMethod);

Bir temsilciyi armak

Bir yntem arsyla ayn szdizimini kullann. rnein:


myDelegate del; ... del();

Bir olay bildirmek

event anahtar szcn yazn, ardndan trn adn (tr bir temsilci tr olmaldr) ve olayn adn ekleyin. rnein:
delegate void myEvent(); class MyClass { public event myDelegate MyEvent; }

Bir olaya abone olmak

Bir temsilci rnei yaratn (olayla ayn trden) ve temsilci trn olaya += ilecini kullanarak balayn. rnein:
class MyEventHandlingClass { ... public void Start() { myClass.MyEvent += new myDelegate (this.eventHandlingMethod); } private void eventHandlingMethod() { ... } private MyClass myClass = new MyClass(); }

Ayrca, abonelik yntemini belirterek derleyicinin yeni temsilciyi otomatik olarak oluturmasn salayabilirsiniz:
public void Start() { myClass.MyEvent += this.eventHandlingMethod; }

Blm 17

Program Akn Kesmek ve Olaylar lemek

331

Bir olay aboneliini iptal etmek

Bir temsilci rnei yaratn (olayla ayn trden) ve temsilci trn olaydan -= ilecini kullanarak ayrn. rnein:
class MyEventHandlingClass { ... public void Stop() { myClass.MyEvent -= new myDelegate (this.eventHandlingMethod); } private void eventHandlingMethod() { ... } private MyClass myClass = new MyClass(); }

Ya da:
public void Stop() { myClass.MyEvent -= this.eventHandlingMethod; }

Bir olay balatmak

Olay bir yntemmi gibi parantezleri kullann. Olayn trn eletirmek iin bamsz deikenleri salamalsnz. Olayn null olup olmadn denetlemeyi unutmayn. rnein:
class MyClass { public event myDelegate MyEvent; ... private void RaiseEvent() { if (this.MyEvent != null) { this.MyEvent(); } } ... }

Blm 18

Genericse Giri
Bu blm tamamladktan sonra renecekleriniz:
n n n n

Generic kullanarak tr-gvenli bir snf tanmlamak. Parametre olarak belirtilen trlere dayanarak bir generic snf rneklerini yaratmak. Generic bir arabirim uygulamak. zerinde alt verinin trnden bamsz bir algoritma uygulayan bir generic yntem tanmlamak.

Blm 8de herhangi bir snfn bir rneine bavurmak iin object trnn nasl kullanldn grdnz. object trn herhangi bir trn deerini depolamak iin kullanabilirsiniz. Bir ynteme herhangi bir tr deer geirmeniz gerektiinde object trn kullanarak parametreler tanmlayabilirsiniz. Bu uygulama ok esnek olsa da ne tr bilgi kullanldn anmsama sorumluluunu programcya verir ve programc bir hata yaparsa alma zaman hatalarna yol aabilir. Bu blmde, bu tr hatalar nlemenize yardmc olmas iin tasarlanm bir zellik olan Generici reneceksiniz.

Nesnelerle lgili Sorunlar


Genericsi anlamak iin bunlarn zmeyi amalad, zellikle object trn kullanrken oluan sorunlara yakndan bakmak yararldr. object trn herhangi bir deer ya da deikene bavuru olarak kullanabilirsiniz. Tm bavuru trleri otomatik olarak (dorudan ya da dolayl olarak) .NET Frameworkteki System.Object snfndan kaltmla alrlar. Bu bilgiyi olduka genelletirilmi snf ya da yntemler yaratmak iin kullanabilirsiniz. rnein, System. Collection ad alanndaki snflarn birou herhangi bir tr koleksiyon oluturmanza olanak vermek iin bu gerekten yararlanr. (Blm 10da koleksiyon snflarn grdnz) Ayrca, System.Collections.Queue snfnda unu fark edersiniz: Hemen her eyi ierebilen kuyruklar yaratabilirsiniz. Aadaki kod paras Circle nesnelerinin bir kuyruunu oluturup ynetmeyi gstermektedir:

333

334

Ksm III

Bileenler Yaratmak

using System.Collections; ... Queue myQueue = new Queue(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... myCircle = (Circle)myQueue.Dequeue();

Enqueue yntemi objecti kuyruun bana ekler ve Dequeue yntemi objecti kuyruun dier ucundan kaldrr. Bu yntemler aadaki gibi tanmlanr:
public void Enqueue( object item ); public object Dequeue();

Enqueue ve Dequeue yntemleri objectleri ynettiinden Circles, PhoneBooks, Clocks ya da nceki altrmalarda grdnz baka snflar zerinde ilem yapabilirsiniz. Ancak, Dequeue yntemi tarafndan dndrlen deeri uygun tre dntrmeniz gerektiine dikkat edin, nk derleyici, nesne trnden bu dntrmeyi otomatik olarak gerekletirmez. Dndrlen deeri dntrmezseniz aadaki kod parasnda grld gibi, Cannot implicitly convert type object to Circle (Nesne tr Circlea rtl olarak dntrlemiyor) derleyici hatasn alrsnz. Bu ak dntrme (explicit cast) gereklilii object trnn salad esnekliin byk bir blmn alp gtrmektedir. Aadaki gibi bir kod yazmak ok kolaydr:
Queue myQueue = new Queue(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... Clock myClock = (Clock)myQueue.Dequeue(); // alma zaman hatas

Bu kod derlense de geerli deildir ve alma zamannda bir System.InvalidCastException oluturur. Hata, bir Clock deikeninde bir Circlea bavuru depolamaya almaktan kaynaklanr ve bu iki tr uyumlu deildir. Bu hata alma zamanna dek anlalmaz nk derleyici bu denetimi yapacak yeterli bilgiye sahip deildir. Kuyruktan karlan (dequeued) nesnenin gerek tr yalnzca kod altnda belirlenebilir. Genelletirilmi snflar ve yntemler yaratmak iin object yaklamn kullanmann baka bir kt yan, alma zamannn bir objecti bir deer trne ve ardndan nceki durumuna dntrmesi gerekirse, ek bellek ve ileme zaman kullanmasdr. Bir int kuyruunu yneten aadaki kod parasn dnn:
Queue myQueue = new Queue(); int myInt = 99; myQueue.Enqueue(myInt); // inti bir nesneye kutular ... myInt = (int)myQueue.Dequeue(); // nesnenin inte olan kutulamasn kaldrr

Blm 18

Genericse Giri

335

Queue (Kuyruk) veri tr tuttuu elerin bavuru tr olmasn bekler. int gibi bir deer trn kuyrua koymak iin bir bavuru trne dntrlmesi, yani kutulanmasn gerektirir. Benzer biimde, bir inti kuyruktan karmak iin yeniden bir deer trne dntrlmesi yani enin kutulamasnn kaldrlmas gerekir. Ayrntl bilgi iin Blm 8deki Kutulamak ve Kutulamay Kaldrmak balkl blmlere bakn. Kutulama ve kutulamay kaldrma effaf bir biimde gereklese de dinamik bellek ayrmay gerektirdiklerinden performans yavalatrlar. Her e iin bu yavalama kk olsa da, bir program ok sayda deer tr kuyruu yaratnca artar.

Generics zm
C#, dntrme gerekliliini ortadan kaldrmak, tr gvenliini artrmak, gerekli kutulama miktarn azaltmak ve genelletirilmi snf ve yntemler yaratmay kolaylatrmak iin genericleri salar. Generic snflar ve yntemler, zerinde altklar nesne trlerini belirten type parameters (tr parametreleri) kabul eder. .NET Framework Class Library System. Collections.Generic ad alannda birok koleksiyon snf ve arabiriminin generic srmlerini ierir. Aadaki kod, Circle nesnelerinin bir kuyruunu yaratmak iin bu ad alannda bulunan generic Queue snfnn kullanmn gstermektedir:
using System.Collections.Generic; ... Queue<Circle> myQueue = new Queue<Circle>(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... myCircle = myQueue.Dequeue();

Yukardaki rnek kodda dikkat edilmesi gereken iki yeni ey vardr:


n

myQueue deikenini bildirirken tr parametresinin, <Circle>, al parantezler iinde kullanm. Dequeue yntemini kullanrken bir dntrme ileminin olmamas.

Al parantezler iindeki tr parametresi kuyruk tarafndan kabul edilen nesnelerin trlerini belirtir. Bu kuyruktaki yntemlere ynelik tm bavurular otomatik olarak, object yerine bu tr kullanmay bekler ve Dequeue yntemini Circle trne dntrme ilemini gereksiz klar. rnein, circleQueueden Clock nesnesine bir e geirmeye alrsanz, alma zaman yerine derleme zamannda bir hata oluturarak trlerin yanllkla karmamasn salar. Microsoft Visual Studio 2008 belgelerindeki generic Queue snfnn aklamasn incelerseniz bunun aadaki gibi tanmlandn grrsnz:
public class Queue<T> : ...

336

Ksm III

Bileenler Yaratmak

Burada T, tr parametresini tanmlar ve derleme zamannda gerek bir tr iin yer tutucu grevi grr. Generic bir Queueyu temsil edecek bir kod yazdnzda, Tnin yerine geecek tr salamanz gerekir (Circle belirten bir nceki rnekte olduu gibi). stelik Queue<T> snfnn yntemlerine bakarsanz Enqueue ve Dequeue gibi bazlar Tyi bir parametre tr ya da dn deeri olarak belirtir:
public void Enqueue( T item ); public T Dequeue();

Tr parametresi T, sizin kuyruu bildirirken belirttiiniz trle yer deitirir. stelik, derleyici imdi, uygulamay oluturduunuzda sk tr denetimi yapmak iin yeterli bilgiye sahiptir ve tr eleme hatalarn nceden yakalayabilir. Ayrca, belirtilen bir tr iin T ile bu yer deitirme basit bir metin deitirme dzenei deildir. Bunun yerine, derleyici tam bir anlambilimsel yer deitirme gerekletirir ve T iin herhangi bir geerli tr belirtmenize olanak verir. te baka rnekler:
struct Person { ... } ... Queue<int> intQueue = new Queue<int>(); Queue<Person> personQueue = new Queue<Person>(); Queue<Queue<int>> queueQueue = new Queue<Queue<int>>();

lk iki rnek deer tr kuyruklar yaratrken ncs kuyruklarn (intlerin) bir kuyruunu yaratr. rnek olarak intQueue deikenini alrsak, derleyici Enqueue ve Dequeue yntemlerinin aadaki srmlerini de oluturur:
public void Enqueue( int item ); public int Dequeue();

Bu tanmlar nceki blmdeki generic olmayan Queue snfnn tanmlaryla karlatrn. Generic snfndan tretilen yntemlerde item parametresi Enqueueye kutulama gerektirmeyen bir deer tr olarak geirilir. Benzer biimde, Dequeue tarafndan dndrlen deer de kutulamasnn kaldrlmas gerekmeyen bir deer trdr. Generic bir snfn birden ok trde parametresinin olmas da olanakldr. rnein, generic System.Collections.Generic.Dictionary snf iki tr parametre bekler: bir tr anahtarlar iin ve bir tane de deerler iin. Aadaki tanm birden ok trde parametre belirtmeyi gsterir:
public class Dictionary<TKey, TValue>

Bir szlk, anahtar/tr iftlerinin bir koleksiyonunu salar. Deerleri (TValue tr) ilgili bir anahtarla (TKey tr) depolarsnz ve sonra aranacak anahtar belirterek alrsnz. Dictionary

Blm 18

Genericse Giri

337

(Szlk) snf, elere dizi gsterim biimini kullanarak erimenize olanak veren bir dizinleyici salar. Bu aadaki gibi tanmlanr:
public virtual TValue this[ TKey key ] { get; set; }

Dizinleyicinin, anahtar ya da TKey tr kullanarak TValue tr deerlere eritiine dikkat edin. string anahtarlaryla tanmlanan Person deerlerini ieren directory adl bir szlk yaratmak ve kullanmak iin aadaki kodu kullanabilirsiniz:
struct Person { ... } ... Dictionary<string, Person> directory = new Dictionary<string, Person>(); Person john = new Person(); directory[John] = john; ... Person author = directory[John];

Generic Queue snfnda olduu gibi, derleyici Person yaplar dndaki deerleri depolama giriimlerini yakalar ve anahtarn her zaman bir string tr olduunu garantiler. Dictionary snfyla ilgili ayrntl bilgi iin Visual Studio 2008 belgelerini okumalsnz. Not Generic snflarla ayn szdizimini kullanarak generic yap ve arabirimleri de tanmlayabilirsiniz.

Generics ve Genelletirilmi Snflar


Tr parametreleri kullanan generic bir snfn farkl trlere dntrlebilen parametreler alan generalized (genelletirilmi) bir snftan farkl olduunu bilmek nemlidir. rnein, System. Collections.Queue snf genelletirilmi bir snftr. Bu snfn tek bir uygulamas vardr ve yntemleri object parametreleri alp object trleri dndrr. Bu snf int, string ve dier birok trle kullanabilirsiniz, ancak bunlarn tm ayn snfn rnekleridir. Bunu System.Collections.Generic.Queue<T> snfyla karlatrn. Bu snf bir tr parametresiyle (Queue<int> ya da Queue<string> gibi) kullandnzda aslnda derleyicinin, ilevsellii generic snf tarafndan tanmlanan tamamen yeni bir snf yaratmasna neden olursunuz. Generic bir snf, istek zerine yeni tre zel snflar yaratmak iin derleyici tarafndan kullanlan bir ablonu tanmlayan bir snf olarak dnebilirsiniz. Generic snfn bu tre zel srmleri (Queue<int>, Queue<string> vb.) constructed types (yapl trler) olarak adlandrlr ve bu trleri belirgin biimde farkl trler olarak ele almalsnz (her ne kadar benzer yntemler ve zelliklere sahip olsalar da).

338

Ksm III

Bileenler Yaratmak

Generics ve Snrlamalar
Bazen generic bir snf tarafndan kullanlan tr parametresinin belirli yntemler salayan bir tr tanmladndan emin olmak isteyeceiniz durumlar olacaktr. rnein, bir PrintableCollection snf tanmlyorsanz, snf iinde depolanan tm nesnelerin bir Print yntemi olduundan emin olmak isteyebilirsiniz. Bu koulu bir constraint (snrlama) kullanarak belirtebilirsiniz. Bir snrlama kullanarak, bir generic snfn tr parametrelerini belirli arabirim kmeleri uygulayanlarla snrlandrabilir ve dolaysyla bu arabirimlerce tanmlanan yntemler salayabilirsiniz. rnein, IPrintable arabirimi Print yntemini ierirse PrintableCollection snfn aadaki gibi tanmlayabilirsiniz:
public class PrintableCollection<T> where T : IPrintable

Bir tr parametresi ile bu snf oluturduunuzda, derleyici T iin kullanlan trn gerekten IPrintable arabirimini kullandn denetleyecek ve kullanmyorsa bir derleme hatasyla duracaktr.

Bir Generic Snf Yaratmak


.NET Framework snf ktphanesi, kullanmnza hazr baz generic snflar ierir. Ayrca kendi generic snflarnz da tanmlayabilirsiniz. Bu blmde de bunu yapacaksnz. Bunu yapmadan nce, biraz arka plandaki teoriyi grelim.

kili Aalar Kuram


Aadaki altrmalarda, bir ikili aa gsteren bir snf tanmlayp kullanacaksnz. Bu ok pratik bir altrmadr nk bu snf System.Collections.Generic ad alannda eksik olan snftr. Bir ikili aa, veri iinde hzla sralama ve arama yapmak da dahil eitli ilemlerde kullanlan ok yararl bir veri yapsdr. kili aalarn incelikleri zerine yazlm ciltler dolusu kitap vardr, ancak ikili aalar ayrntl biimde anlatmak bu kitabn amac deildir. Bunun yerine, ilgili ayrntlara bakmakla yetineceiz. kili aa, ya bo olan ya da e ieren, recursive (zyinelemeli, kendi kendine bavuran) bir veri yapsdr: node (dm) olarak adlandrlan baz verilerle, kendileri de ikili aa olan iki alt aa. Bu iki alt aaca genel olarak left subtree (sol alt aa) ve right subtree (sa alt aa) denir nk bunlar srasyla dmn solunda ve sanda gsterilir. Her sol ya da sa alt aa ya botur ya da bir dmle baka alt aalar ierir. Kuramsal olarak, tm yap sonsuza dek srebilir. ekil 18-1 kk bir ikili aacn yapsn gstermektedir.

Blm 18

Genericse Giri

339

EKL 18-1 Bir ikili aa.

kili aalarn gerek gleri bunlar veri sralamak iin kullandnzda aa kmaktadr. Ayn trde srasz nesneler dizisiyle balarsanz, bunlar sral bir ikili aa oluturmak iin kullanabilir ve ardndan aata gezinerek her dm sral bir biimde ziyaret edebilirsiniz. Bir I esini sral bir T ikili aacna eklemek iin algoritma aada gsterilmitir:
T aac bo ise Then Dm olan yeni e I ile yeni aa Tyi kur ve sa ve sol altaalara boalt Else Aacn, T, geerli dmnn, N, deerini incele Nin deeri yeni yeni e Innkinden bykse Then Tnin sol altaac bosa Then Dm olan e I ile Tnin yeni sol altaacn kur ve sol ve sa altaalar boalt Else Tnin sol altaacna I ekle End If Else Tnin sa altaac bosa Then Dm olan e I ile Tnin yeni sa altaacn kur ve sol ve sa altaalar boalt Else Tnin sa altaacna I ekle End If End If End If

340

Ksm III

Bileenler Yaratmak

Algoritmann zyinelemeli olduuna dikkat edin; enin deerine ve aataki geerli dme bal olarak, eyi sol ya da sa aaca eklemek iin kendini arr. Not Byktr ifadesinin tanm e ve dmdeki veri trne baldr. Saysal veriler iin

byktr ifadesi basit bir aritmetik karlatrma olabilir; metin iin bu bir dize karlatrmas olabilir, ancak dier veri trlerine kendi karlatrma deerleri verilmelidir. Sonraki blmde, Generics Kullanarak Bir kili Aa Snf Oluturmak bal altnda bu konu ayrntl biimde anlatlmaktadr.

Bo bir ikili aa ve sralanmam bir nesneler dizisiyle balarsanz, sralanmam dizi boyunca yineleme yapabilir ve algoritmay kullanarak her birini ikili aaca ekleyebilir ve sral bir aa elde edebilirsiniz. ekil 18-2, be tamsaydan bir aa oluturma ilemindeki admlar gstermektedir.

EKL 18-2 Sral bir ikili aa oluturmak.

Sral bir ikili aa oluturduktan sonra, her dm srayla ziyaret ederek ve bulunan veriyi yazdrarak ieriini grntleyebilirsiniz. Bu grevi gerekletirmek iin gerekli algoritma da zyinelemelidir:
Sol altaa bo deilse Then Sol altaacn ieriini grntle End If Dmn deerini grntle Sa altaa bo deilse

Blm 18
Then Sa altaacn ieriini grntle End If

Genericse Giri

341

ekil 18-3 daha nce oluturulmu aacn ktsn alma ilemindeki admlar gstermektedir. Tamsaylarn imdi artan srayla grntlendiine dikkat edin.

EKL 18-3 Sral bir ikili aa yazdrmak.

Generics Kullanarak kili Aa Snf Oluturmak


Aadaki altrmada, hemen her tr veriyi tutabilen bir ikili aa snf tanmlamak iin generic kullanacaksnz. Tek kstlama, veri trnn farkl rnekler arasndaki deerleri karlatrmas iin bir yntem salamas gerektiidir. kili aa snf birok farkl uygulamada yararl bulacanz bir snftr. Bu yzden, bunu kendi iinde bir uygulama deil, bir snf kitapl olarak kullanacaksnz. Daha sonra bu snf, kaynak kodu kopyalamaya ve yeniden derlemeye gerek kalmadan baka yerlerde yeniden kullanabilirsiniz. Bir snf dosyas, derlenmi snflardan (yap ve temsilci gibi dier trlerden) oluan ve bir birleimde depolanan bir kmedir. Bir birletirme genellikle .dll sonekli bir dosyadr. Dier proje ve uygulamalar, snf kitaplnn birleimine bir bavuru ekleyerek ve ardndan using ifadeleriyle ad alanlarn kapsam iine alarak bu snftaki elerden yararlanabilir. kili aa snfn snarken bunu yapacaksnz.

342

Ksm III

Bileenler Yaratmak

System.IComparable ve System.IComparable<T> Arabirimleri


Deerleri birtakm doal (ve belki doal olmayan) sralamaya gre karlatrabilmenizi gerektiren bir snf yaratmanz gerekiyorsa, IComparable arabirimini kullanmalsnz. Bu arabirim CompareTo adl bir yntem ierir. Bu yntem, geerli rnekle karlatrlacak nesneyi belirten tek bir parametre alr ve aadaki tabloda grld gibi, karlatrmann sonucunu gsteren bir tamsay dndrr.
Deer
0dan kk 0 0dan byk

Anlam
Geerli rnek parametrenin deerinden kktr. Geerli rnek parametrenin deerine eittir. Geerli rnek parametrenin deerinden byktr.

rnek olarak, Blm 7de anlatlan ve aada yeniden gsterilen Circle snfn dnn:
class Circle { public Circle(int initialRadius) { radius = initialRadius; } public double Area() { return Math.PI * radius * radius; } private double radius; }

System.IComparable arabirimini kullanarak ve CompareTo yntemini salayarak Circle snfn karlatrlabilir klabilirsiniz. Gsterilen rnekte CompareTo yntemi Circle nesnelerini alanlarna gre karlatrr. Alan daha byk olan bir daire, alan daha kk olan bir daireden byktr.
class Circle : System.IComparable { ... public int CompareTo(object obj) { Circle circObj = (Circle)obj; // parametreyi gerek trne dntr if (this.Area() == circObj.Area()) return 0; if (this.Area() > circObj.Area()) return 1;

Blm 18
return -1; } }

Genericse Giri

343

System.IComparable arabirimini incelerseniz, parametresinin bir object olarak tanmlandn grrsnz. Ancak bu yaklam tr-gvenli deildir. Bunun neden byle olduunu anlamak iin Circle olmayan bir eyi CompareTo yntemine geirmeye altnzda olacaklar dnn. System.IComparable arabiriminin Area yntemine eriebilmesi bir dntrme kullanmn gerektirir. Parametre bir Circle deil baka tr bir nesneyse bu dntrme baarsz olur. Ancak, System ad alan ayrca aadaki yntemleri ieren generic IComparable<T> arabirimini tanmlar:
int CompareTo(T other); bool Equals(T other);

Bu arabirimde Equals adl ek bir yntem bulunduuna dikkat edin. Bu yntem, her iki rnek de eitse true, deilse false dndrmelidir. Ayrca bu yntemlerin bir nesne yerine bir tr parametresi (T) aldna ve bylece arabirimin generic olmayan srmnden ok daha gvenli olduuna dikkat edin. Aadaki kod bu arabirimi Circle snfnda nasl uygulayabileceinizi gstermektedir:
class Circle : System.IComparable<Circle> { ... public int CompareTo(Circle other) { if (this.Area() == other.Area()) return 0; if (this.Area() > other.Area()) return 1; return -1; } public bool Equals(Circle other) { return (this.CompareTo(other) == 0); } }

CompareTo ve Equals ynteminin parametreleri IComparable<Circle> arabiriminde belirtilen trle elemelidir. Genel olarak, System.IComparable<T> arabirimini System. IComparable arabirimine tercih etmeniz gerekir. Ayrca, .NET Frameworkteki birok trn yapt gibi her ikisini de uygulayabilirsiniz.

344

Ksm III

Bileenler Yaratmak

Tree<TItem> snfn yaratn


1. Visual Studio 2008i balatn. 2. Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, yeni bir snf ktphanesi projesi oluturmak iin aadaki grevleri gerekletirin: 2.1. File mensnde, New i iaret edin ve sonra Project i tklayn. 2.2. New Project iletiim kutusunda, Class Library ablonunu sein. 2.3. Name olarak BinaryTree ve Location olarak Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 18 klasrn atayn. 2.4. OK i tklayn. 3. Microsoft Visual C# 2008 Express Edition kullanyorsanz, yeni bir snf ktphanesi projesi oluturmak iin unlar yapn: 3.1. Tools mensnde Options tklayn. 3.2. Options iletiim kutusunda, sol blmedeki aa grnmnde Projects and Solutions tklayn. 3.3. Sa blmede, Visual Studio projects location metin kutusunda, konumu Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 18 klasr olarak atayn. 3.4. OKi tklayn. 3.5. File mensnde, New Projecti tklayn. 3.6. New Project iletiim kutusunda Class Library simgesini tklayn. 3.7. Name alanna BinaryTree yazn. 3.8. OKi tklayn. 4. Solution Explorerda, Class1.cs i farenin sa dmesiyle tklayn ve dosya adn Tree. cs olarak deitirin. Visual Studionun istendiinde dosya adnn yan sra snf adn da deitirmesine izin verin. 5. Code and Text Editor penceresinde, Tree snfnn tanmn aada gsterildii gibi Tree<TItem> olarak deitirin:
public class Tree<TItem> { }

Blm 18

Genericse Giri

345

6. Code and Text Editor penceresinde Tree<TItem> snfnn tanmn, TItem tr parametresinin generic IComparable<TItem> arabirimini kullanan bir tr gstermesi gerektiini belirtecek biimde deitirin. Tree<TItem> snfnn deitirilen tanm aadaki gibi grnr:
public class Tree<TItem> where TItem : IComparable<TItem> { }

7. Tree<TItem> snfna zel, otomatik zellik ekleyin; NodeData adl bir TItem zellii ile LeftTree ve RightTree adl iki Tree<TItem> zellii:
public class Tree<TItem> where TItem : IComparable<TItem> { public TItem NodeData { get; set; } public Tree<TItem> LeftTree { get; set; } public Tree<TItem> RightTree { get; set; } }

8. Tree<TItem> snfna nodeValue adl tek bir TItem parametresi alan bir kurucu ekleyin. Aada gsterildii gibi, kurucuda NodeData zelliini nodeValue olarak ayarlayp LeftTree ve RightTree zelliklerini null olarak atayn:
public class Tree<TItem> where TItem : IComparable<TItem> { public Tree(TItem nodeValue) { this.NodeData = nodeValue; this.LeftTree = null; this.RightTree = null; } ... }

Not Kurucunun tr parametresi iermediine dikkat edin; Tree<TItem> deil Tree olarak adlandrlr. 9. Aada gsterildii gibi, Tree<TItem> snfna Insert adl genel bir yntem ekleyin. Bu yntem, aaca TItem deerini ekleyecektir. Yntem tanm u ekilde olmaldr:
public class Tree<TItem> where TItem: IComparable<TItem> { ... public void Insert(TItem newItem) { } ... }

346

Ksm III

Bileenler Yaratmak

Insert yntemi, sral ikili aa oluturmak iin daha nce anlatlan zyinelemeli algoritmay izler. Programc ilk dm aaca eklemek iin kurucuyu kullanr (varsaylan kurucu yoktur); bylece Insert yntemi aacn bo olmadn varsayabilir. Sonraki admlarda yazacanz kodu anlamanza yardmc olmak iin algoritmann, aacn bo olup olmadn denetleyen ksmndan sonraki blm aada yeniden verilmitir.
... Examine the value of the node, N, of the tree, T If the value of N is greater than that of the new item, I Then If the left subtree of T is empty Then Construct a new left subtree of T with the item I as the node, and empty left and right subtrees Else Insert I into the left subtree of T End If ...

10. Insert ynteminde, currentNodeValue adl TItem tr bir yerel deiken bildiren bir ifade ekleyin. Aada gsterildii gibi, bu deikeni ikili aacn NodeData zelliinin deerine atayn:
public void Insert(TItem newItem) { TItem currentNodeValue = this.NodeData; }

11. Aadaki if-else ifadesini Insert yntemine, currentNodeValue deikeninin tanmndan sonra ekleyin. Bu ifade, geerli dmn deerinin yeni eden byk olup olmadn belirlemek iin IComprable <T> arabiriminin CompareTo yntemini kullanr:
public void Insert(TItem newItem) { TItem currentNodeValue = this.NodeData; if (currentNodeValue.CompareTo(newItem) > 0) { // Insert the new item into the left subtree } else { // Insert the new item into the right subtree } }

12. // Insert the new item into the left subtree aklamasn aadaki kod blouyla deitirin:
if (this.LeftTree == null) {

Blm 18
this.LeftTree = new Tree<TItem>(newItem); } else { this.LeftTree.Insert(newItem); }

Genericse Giri

347

Bu ifadeler sol alt aacn bo olup olmadn denetler. Bosa, yeni bir e kullanlarak yeni bir sol alt aa yaratlr; bo deilse yeni e Insert yntemini zyinelemeli olarak arp var olan sol alt aaca eklenir. 13. // Insert the new item into the right subtree aklamasn yeni dm sa alt aaca ekleyen edeer kodla deitirin:
if (this.RightTree == null) { this.RightTree = new Tree<TItem>(newItem); } else { this.RightTree.Insert(newItem); }

14. Tree<TItem> snfna, Insert ynteminden sonra, WalkTree adl baka bir genel yntem ekleyin. Bu yntem aa boyunca ilerler, her dm srayla ziyaret eder ve deerini yazdrr. Yntem tanm aadaki gibi grnr:
public void WalkTree() { }

15. Aadaki ifadeleri WalkTree yntemine ekleyin. Bu ifadeler bir ikili aacn ieriini yazdrmak iin daha nce aklanan algoritmay kullanr:
if (this.LeftTree != null) { this.LeftTree.WalkTree(); } Console.WriteLine(this.NodeData.ToString()); if (this.RightTree != null) { this.RightTree.WalkTree(); }

16. Build mensnde Build Solution tklayn. Snf sorunsuz olarak derlenmelidir, varsa bildirilen hatalar dzeltin ve gerekirse zm yeniden oluturun.

348

Ksm III

Bileenler Yaratmak

17. Visual C# 2008 Express Edition kullanyorsanz, File mensnde Save All tklayn. Save Project iletiim kutusu belirirse Savei tklayn. Sonraki altrmada, tamsay ve dize ikili aalar yaratarak Tree<TItem> snfn test edeceksiniz.

Tree<TItem> snfn test edin


1. Solution Explorerda, BinaryTree zmn farenin sa dmesiyle tklayn, Addi iaret edin ve sonra New Projecti tklayn. Not BinaryTree projesini deil, BinaryTree zmn farenin sa dmesiyle
tkladnzdan emin olun.

2. Console Application ablonunu kullanarak yeni bir proje ekleyin. Projeyi BinaryTreeTest olarak adlandrn. Locationa, Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 18 klasrn atayn ve OKi tklayn. Not Bir Visual Studio 2008 zmnn birden ok proje ierebileceini hatrlayn.

Tree<TItem> snfn snamak iin BinaryTree zmne ikinci bir proje eklemek iin bu zellii kullanyorsunuz. Bu, snf kitaplklarn snamak iin nerilen yoldur.

3. Solution Explorerda BinaryTreeTest projesinin seili olduundan emin olun. Project mensnden Set as Startup Projecti tklayn. Solution Explorerda BinaryTestTree projesi vurgulanr. Uygulamay altrdnzda, altrlacak olan asl proje budur. 4. Solution Explorerda BinaryTestTree projesinin hala seili olduundan emin olun. Project mensnde Add Referencei tklayn. Add Reference iletiim kutusundaki Projects sekmesini tklayn. BinaryTree projesini sein ve ardndan OKi tklayn. BinaryTree birleimi, Solution Explorerda BinaryTreeTest iin olan bavurular listesinde grnr. imdi BinaryTreeTest projesinde Tree<TItem> nesneleri yaratabilirsiniz. Not Snf kitapl projesi bunu kullanan proje ile ayn zmn bir paras deilse, snf

kitapl projesine deil, birleime (.dll dosyas) bir bavuru eklemeniz gerekir. Bunu, Add Reference iletiim kutusundaki Browse sekmesinden birleimi seerek yaparsnz. Bu teknii bu blmdeki son altrmalarda kullanacaksnz.

Blm 18

Genericse Giri

349

5. Program snfn grntleyen Code and Text Editor penceresinde aadaki using ynergesini snfn stndeki listeye ekleyin:
using BinaryTree;

6. Aada koyu harflerle gsterilen ifadeleri Main yntemine ekleyin:


static void Main(string[] args) { Tree<int> tree1 = new Tree<int>(10); tree1.Insert(5); tree1.Insert(11); tree1.Insert(5); tree1.Insert(-12); tree1.Insert(15); tree1.Insert(0); tree1.Insert(14); tree1.Insert(-8); tree1.Insert(10); tree1.Insert(8); tree1.Insert(8); tree1.WalkTree(); }

Bu ifadeler intleri tutmak iin yeni bir ikili aa yaratr. Kurucu, 10 deerini ieren bir ilk dm yaratr. Insert ifadeleri dmleri aaca ekler ve WalkTree yntemi aacn ieriini artan biimde sral olarak yazdrr. Not C#ta int anahtar szcnn System.Int32 tr iin yalnzca bir dier ad olduunu unutmayn; bir int deikeni bildirdiinizde aslnda System.Int32 tr bir yap deikeni bildirirsiniz. System.Int32 tr IComparable ve IComparable<T> arabirimlerini uygular, bu nedenle Tree<int> deikenleri yaratabilirsiniz. Benzer biimde, string anahtar szc System.String iin bir dier addr ve bu da IComparable ve IComparable<T> arabirimlerini uygular. 7. Build mensnde Build Solution tklayn. zmn derlendiini dorulayn ve varsa hatalar dzeltin. 8. Projeyi kaydedin ve daha sonra Debug mensnde Start Without Debugging i tklayn. Program alr ve aadaki srada deerleri grntler: 12, 8, 0, 5, 5, 8, 8, 10, 10, 11, 14, 15 9. Visual Studio 2008e dnmek iin Entera basn. 10. Aadaki ifadeleri, Program snfnda Main ynteminin sonuna, var olan koddan sonra yazn:
static void Main(string[] args) { ...

350

Ksm III

Bileenler Yaratmak
Tree<string> tree2 = new Tree<string>(Hello); tree2.Insert(World); tree2.Insert(How); tree2.Insert(Are); tree2.Insert(You); tree2.Insert(Today); tree2.Insert(I); tree2.Insert(Hope); tree2.Insert(You); tree2.Insert(Are); tree2.Insert(Feeling); tree2.Insert(Well); tree2.Insert(!); tree2.WalkTree();

Bu ifadeler dizeleri tutmak iin baka bir ikili aa yaratr, onu baz snama verileriyle doldurur ve ardndan aac yazdrr. Bu kez veri alfabetik olarak sralanr. 11. Build mensnde Build Solution tklayn. zmn derlendiini dorulayn ve varsa hatalar dzeltin. 12. Debug mensnde Start Without Debugging i tklayn. Program alnca tamsay deerleri nceki gibi grntlenir ve ardndan dizeler aadaki srada grnr: !, Are, Are, Feeling, Hello, Hope, How, I, Today, Well, World, You, You 13. Visual Studio 2008e dnmek iin Enter tuuna basn.

Bir Generic Yntem Yaratmak


Generic snflar tanmlamann yan sra .NET Framework generic yntemler yaratmak iin de kullanabilirsiniz. Bir generic yntem ile tr parametresini bir generic snf tanmlarken kullanlana benzer bir ekilde kullanarak parametreler ve dn tr belirtebilirsiniz. Bu ekilde tr gvenli genelletirilmi yntemler tanmlayabilir ve dntrme (ve baz durumlarda kutulama) zahmetinden kurtulabilirsiniz. Generic yntemler genellikle generic snflarla birlikte kullanlr (bunlara parametre olarak generic bir snf alan yntemler ya da dn tr generic bir snf olan yntemler iin gerek duyarsnz). Generic yntemleri, generic snflar tanmlarken kullandnz trde parametre szdizimini kullanarak tanmlarsnz (ayrca snrlamalar da tanmlayabilirsiniz). rnein, aada gsterilen generic Swap<T> yntemi, parametrelerdeki deerleri dei toku etmek iin kullanlabilir. Takas edilen veri trne baklmakszn, bu ilevsellik yararl olduundan onu generic bir yntem olarak tanmlamak iyi olur:
static void Swap<T>(ref T first, ref T second) {

Blm 18
T temp = first; first = second; second = temp; }

Genericse Giri

351

Yntemi balatmak iin tr parametresi iin uygun tr belirtirsiniz. Aadaki rnekler iki inti ve iki stringi dei toku etmek iin Swap<T>yi nasl kullanacanz gstermektedir:
int a = 1, b = 2; Swap<int>(ref a, ref b); ... string s1 = Hello, s2 = World; Swap<string>(ref s1, ref s2);

Not Bir generic snf farkl tr parametrelerle gstermenin derleyicinin farkl trler oluturmasna neden olmas gibi, Swap<T> ynteminin her farkl kullanm derleyicinin, yntemin farkl bir srmn oluturmasna neden olur. Swap<int> ile Swap<string> ayn yntem deildir; her iki yntem de ayn generic yntem tarafndan oluturulmu olduundan ayn davran gsterirler, ama farkl trler zerinde.

kili Aa Oluturmak in Bir Generic Yntem Tanmlamak


nceki rnekte bir ikili aac uygulamak iin bir generic snfn nasl yaratld gsterilmiti. Tree<TItem> snf veri elerini aaca eklemek iin Insert yntemini salar. Ancak, ok sayda e eklemek isterseniz Insert yntemine yaplan tekrarlayan arlar ok uygun deildir. Aadaki altrmada, bir veri eleri listesinden yeni bir ikili aa yaratmanza olanak veren InsertIntoTree adl bir generic yntem tanmlayacaksnz. Bu yntemi, bir karakterler aacna karakterler listesi eklemek iin kullanarak snayacaksnz.

InsertIntoTree yntemini yazn


1. Visual Studio 2008de Console Application ablonunu kullanarak yeni bir proje yaratn. New Project iletiim kutusunda, projeye BuildTree adn verin. Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, Locationa Belgeler klasrnz altndaki \Microsoft Press\Visual CSharp Step By Step\ Chapter 18 klasrn atayn ve Solution alr listesinden Create a new Solution seeneini sein. 2. Project mensnde Add Reference tklayn. Add Reference iletiim kutusunda Browse sekmesini tklayn. \Microsoft Press\Visual CSharp Step By Step\Chapter 18 \BinaryTree\ BinaryTree\bin\Debug klasrne gidin, BinaryTree.dlli ve ardndan OKi tklayn. BinaryTree birleimi Solution Explorerda gsterilen bavuru listesine eklenir. 3. Program.cs dosyasn gsteren Code and Text Editor penceresinde, aadaki using ynergesini Program.cs dosyasnn en stne ekleyin:

352

Ksm III

Bileenler Yaratmak

using BinaryTree;

Bu ad alan Tree<TItem> snfn ierir. 4. Program snfna, Main ynteminden sonra, InsertIntoTree adl bir yntem ekleyin. Bu, data adnda TItem elerinden oluan bir params dizisi ve bir Tree<TItem> deikeni alan bir static yntem olmaldr. Yntem tanm aadaki gibi grnr:
static void InsertIntoTree<TItem>(Tree<TItem> tree, params TItem[] data) { }

pucu Bu yntemi uygulamann alternatif bir yolu, Tree<TItem> parametresinin nne this
anahtar szcn ekleyerek ve InsertIntoTree yntemini bir statik snfta tanmlayarak, Tree<TItem> snfnn geniletilmi bir yntemini yaratmaktr:

public static class TreeMethods { public static void InsertIntoTree<TItem>(this Tree<TItem> tree, params TItem[] data) { ... } ... }

Bu yaklamn balca avantaj, Tree<TItem> nesnesini parametre olarak geirmek yerine, Tree<TItem> zerinde dorudan InsertIntoTree yntemini arabilmenizdir. Ancak, bu altrma iin baz eyleri basit tutacaz.

5. kili aac oluturmak iin kullanlan TItem tr, IComparable<TItem> arabirimini kullanmaldr. InsertIntoTree ynteminin tanmn deitirin ve uygun where yantmcesini ekleyin. Yntemin gncelletirilmi tanm aadaki gibi grnr:
static void InsertIntoTree<TItem>(Tree<TItem> tree, params TItem[] data) where TItem : IComparable<TItem> { }

6. Aada gsterilen ifadeleri InsertIntoTree yntemine ekleyin. Bu ifadeler, kullancnn gerekten ynteme baz parametreler saladn denetler (data dizisi bo olabilir), ardndan params listesi boyunca yineleme yapar ve Insert yntemini kullanarak her eyi aaca ekler. Aa, dn deeri olarak geri dndrlr:
static void InsertIntoTree<TItem>(Tree<TItem> tree, params TItem[] data) where TItem : IComparable<TItem>

Blm 18
{ if (data.Length == 0) throw new ArgumentException(Must provide at least one data value); foreach (TItem datum in data) { tree.Insert(datum); } }

Genericse Giri

353

InsertIntoTree yntemini test edin


1. Program snfnn Main ynteminde, karakter verisini tutmak iin yeni bir Tree yaratan, InsertIntoTree yntemini kullanarak bunu baz rnek verilerle dolduran ve ardndan Treenin WalkTree yntemini kullanarak grntleyen aadaki ifadeleri ekleyin.
static void Main(string[] args) { Tree<char> charTree = new Tree<char>(M); InsertIntoTree<char>(charTree, X, A, M, Z, Z, N); charTree.WalkTree(); }

2. Build mensnde Build Solution tklayn. zmn derlendiini dorulayn ve varsa hatalar dzeltin. 3. Debug mensnde Start Without Debugging tklayn. Program alr ve aadaki srada karakter deerlerini gsterir: A, M, M, N, X, Z, Z 4. Visual Studio 2008e dnmek iin Enter tuuna basn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i alr durumda brakn ve Blm 19a gein.
n

Visual Studio 2008den imdi kmak istiyorsanz

354

Ksm III

Bileenler Yaratmak

File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 18 Hzl Bavuru


Bunun in
Bir generic tr kullanarak bir nesneyi gstermek Yeni bir generic tr yaratmak

unu Yapn
Uygun tr parametresini belirtin. rnein:
Queue<int> myQueue = new Queue<int>();

Bir tr parametresi kullanarak snf tanmlayn. rnein:


public class Tree<TItem> { ... }

Generic tr parametresinin yerini alabilecek tr snrlandrmak

Snf tanmlarken bir where yan tmcesi kullanarak bir kstlama belirtin. rnein:
public class Tree<TItem> where TItem : IComparable<TItem> { ... }

Bir generic yntem tanmlamak

Tr parametreleri kullanarak yntemi tanmlayn. rnein:


static void InsertIntoTree<TItem> (Tree<TItem> tree, params TItem[] data) { ... }

Bir generic yntem tanmlamak

Tr parametrelerinin her biri iin trler salayn. rnein:


InsertIntoTree<char>(charTree, Z, X);

Blm 19

Koleksiyonlar Numaralandrmak
Bu blm tamamladktan sonra renecekleriniz:
n

Bir koleksiyondaki eler boyunca yineleme yapmak iin kullanlabilen bir numaralandrcy elle tanmlamak. Bir yineleyici yaratarak bir numaralandrcy otomatik olarak uygulamak. Farkl dizilerdeki koleksiyon elerinin iine girebilen ek yineleyiciler salamak.

n n

Blm 10da veri dizileri ya da kmelerini tutmak iin kullanlan dizi ve koleksiyon snflarn rendiniz. Blm 10da ayrca bir koleksiyondaki elerin iine girmek ya da bu elerde yineleme yapmak iin kullanlan foreach ifadesini de grdnz. Orada, foreach ifadesini yalnzca bir koleksiyonun ieriine erimek iin hzl ve uygun bir yntem olarak kullandnz, ancak artk bu ifadenin gerekten nasl alt konusunda biraz daha bilgi edinmenin zamandr. Kendi koleksiyon snflarnz tanmlamaya baladnzda bu konu nem kazanr. Neyse ki, C#, bu srecin ounun otomatik olarak yaplmasna yardmc olan yineleyiciler salar.

Koleksiyondaki eleri Numaralandrmak


Blm 10da, eleri basit bir dizide listelemek iin foreach ifadesini kullanmann bir rneini grdnz. Kod aadakine benzemekteydi:
int[] pins = { 9, 3, 7, 2 }; foreach (int pin in pins) { Console.WriteLine(pin); }

foreach yaps, yazmanz gereken kodu basitletiren k bir dzenek salar, ancak bu yalnzca belirli koullar altnda yaplabilir (foreach yalnzca numaralandrlabilir bir koleksiyonun iine girmek iin kullanlabilir). Peki, numaralandrlabilir koleksiyon tam olarak nedir? Bunun bir yant, System.Collections.IEnumerable arabirimini kullanan bir koleksiyon olduudur. Not C#taki tm dizilerin aslnda System.Array snfnn rnekleri olduunu unutmayn. System.
Array snf, IEnumerable arabirimini kullanan bir koleksiyon snfdr.

355

356

Ksm III

Bileenler Yaratmak

IEnumerable arabirimi GetEnumerator adl tek bir yntem ierir:


IEnumerator GetEnumerator();

GetEnumerator yntemi, System.Collections.IEnumerator arabirimini kullanan bir numaralandrc nesnesi dndrmelidir. Numaralandrc nesne koleksiyon nesnelerini admlamak (numaralandrmak) iin kullanlr. IEnumerator arabirimi, aadaki zellik ve yntemleri belirtir:
object Current { get; } bool MoveNext(); void Reset();

Numaralandrcy, bir listedeki eleri gsteren bir iareti gibi dnn. Bata iareti ilk eden ncesini gsterir. aretiyi aaya, listede sonraki (ilk) eye tamak iin MoveNext yntemini arrsnz; MoveNext yntemi, baka bir e varsa true, yoksa false dndrr. aret edilmekte olan eye erimek iin Current zelliini, iaretiyi listedeki ilk enin ncesine geri dndrmek iinse Reset yntemini kullanrsnz. Bir koleksiyonun GetEnumerator yntemini kullanp bir numaralandrc yaratarak ve numaralandrcy kullanp art arda MoveNext yntemini ararak ve Current zelliinin deerini alarak koleksiyondaki eler arasnda tek tek ilerleyebilirsiniz. foreach ifadesi tam olarak bunu yapar. Dolaysyla, kendi numaralandrlabilir koleksiyon snfnz yaratmak istiyorsanz, koleksiyon snfnzda IEnumerable arabirimini kullanmanz ve ayrca koleksiyon snfnn GetEnumerator yntemi tarafndan dndrlecek IEnumerator arabiriminin bir uygulamasn salamanz gerekir. nemli lk bakta, ad benzerliklerinden dolay, IEnumerable<T> ve IEnumerator<T> arabirimlerini kartrmak ok kolaydr. Birbirine kartrmayn. yi bir gzlemciyseniz, IEnumerator arabiriminin Current zelliinin tr gvenli olmayan bir davran sergilediini, nk belirli bir tr yerine bir nesne dndrdn fark etmisinizdir. Ancak, .NET Framework snf kitaplnn da generic IEnumerator<T> arabirimini ve T dndren bir Current zellii saladn bilmek sizi memnun edecektir. Benzer biimde, bir Enumerator<T> nesnesi dndren bir GetEnumerator yntemi ieren IEnumerable<T> arabirimi vardr. .NET Framework 2.0 iin uygulama gelitiriyorsanz numaralandrlabilir koleksiyonlar tanmlarken generic olmayan tanmlar kullanmak yerine bu generic arabirimlerden yararlanmalsnz. Not IEnumerator<T> arabiriminin IEnumerator arabiriminden baz baka farklar da vardr; bir
Reset yntemi iermez, ancak IDisposable arabirimini geniletir.

Blm 19

Koleksiyonlar Numaralandrmak

357

Bir Numaralandrcy Elle Uygulamak


Sonraki altrmada, generic IEnumerator<T> arabirimini kullanan bir snf tanmlayacak ve Blm 17de oluturduunuz ikili aa snf iin bir numaralandrc yaratacaksnz. Blm 17de bir ikili aata gezinip ieriini grntlemenin ne kadar kolay olduunu grdnz. Dolaysyla, bir ikili aataki her eyi ayn srada alan bir numaralandrcy tanmlamann basit bir i olduunu dnebilirsiniz. Ne yazk ki, yanlrsnz. Asl sorun bir numaralandrcy tanmlarken yapnn neresinde olduunuzu anmsamanz gerektiidir. Bylece, MoveNext yntemine yaplan sonraki arlar durumu uygun biimde gncelletirebilir. Bir ikili aata dolarken kullanlanlar gibi zyinelemeli algoritmalar (recursive algorithms) yntem arlar arasnda durum bilgisini kolaylkla eriilebilir bir biimde tutmaya uygun deildir. Bu nedenle, ncelikle ikili aataki bilgiyi daha yant verici bir veri yapsna (bir queue) dntrmek iin n ilemeden geirmeli ve onun yerine bu veri yapsn numaralandrmalsnz. Kukusuz, bu dolambal durum ikili aacn elerinde yineleme yapan kullancdan gizlenir!

TreeEnumerator snfn yaratn


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\Chapter 19\ BinaryTree klasrndeki BinaryTree zmn an. Bu zm, Blm 8de yarattnz BinaryTree projesinin alan bir kopyasn ierir. 3. Projeye yeni bir snf ekleyin: Project mensnde Add Class tklayn, Class ablonunu sein ve Name iin TreeEnumerator.cs yazp Add komutunu tklayn. 4. TreeEnumerator snf bir Tree<TItem> nesnesi iin bir numaralandrc oluturur. Snfn tr gvenli olduundan emin olmak iin bir tr parametresi salamak ve IEnumerator<T> arabirimini uygulamak zorunludur. Ayrca, tr parametresi snfn numaralandrd Tree<TItem> nesnesi iin geerli bir tr olmaldr. Dolaysyla, IComparable<TItem> arabirimini uygulama ile kstlanmaldr. Bu gereksinimleri karlamak iin, TreeEnumerator.cs dosyasn gsteren Code and Text Editor penceresinde, TreeEnumerator snf tanmn deitirin. Aadaki gibi grnmelidir:
class TreeEnumerator<TItem> : IEnumerator<TItem> where TItem : IComparable<TItem> { }

358

Ksm III

Bileenler Yaratmak

5. Aadaki zel deikeni TreeEnumerator<TItem> snfna ekleyin:


class TreeEnumerator<TItem> : IEnumerator<TItem> where TItem : IComparable<TItem> { private Tree<TItem> currentData = null; private TItem currentItem = default(TItem); private Queue<TItem> enumData = null; }

currentData deikeni numaralandrlmakta olan aaca yaplan bir bavuruyu tutmak iin kullanlr ve currentltem deikeni Current zellii tarafndan dndrlen deeri tutar . enumData kuyruunu aataki dmlerden alnan deerlerle dolduracaksnz. MoveNext yntemi her eyi bu kuyruktan srayla dndrr. default anahtar szc, Bir Tr Parametresi ile Tanmlanan Bir Deiken Balatmak balkl blmde aklanmtr. 6. data adl tek bir Tree<TItem> parametresi alan bir TreeEnumerator kurucusu ekleyin. Kurucunun gvdesinde currentData deikenine balang deeri olarak data atayan bir ifade ekleyin:
class TreeEnumerator<TItem> : IEnumerator<TItem> where TItem : IComparable<TItem> { public TreeEnumerator(Tree<TItem> data) { this.currentData = data; } ... }

7. Aadaki populate adl zel yntemi, TreeEnumerator<TItem> snfna, kurucudan sonra ekleyin:
private void populate(Queue<TItem> enumQueue, Tree<TItem> tree) { if (tree.LeftTree != null) { populate(enumQueue, tree.LeftTree); } enumQueue.Enqueue(tree.NodeData); if (tree.RightTree != null) { populate(enumQueue, tree.RightTree); } }

Bu yntem bir ikili aata gezinirken ierdii veriyi kuyrua ekler. Kullanlan algoritma Blm 18de anlatlan ve Tree<TItem> snfndaki WalkTree yntemi tarafndan kullanlana ok benzer. Temel fark olarak, NodeData deerleri ekrana yazdrlmak yerine kuyrukta depolanr.

Blm 19

Koleksiyonlar Numaralandrmak

359

8. TreeEnumerator<TItem> snfnn tanmna dnn. Snf bildirimindeki IEnumerator<TItem> arabiriminde herhangi bir yeri farenin sa dmesiyle tklayn, Implement Interfacei iaret edin ve ardndan Implement Interface Explicitly seeneini tklayn. Bu hareket, IEnumerator<TItem> ve IEnumerator arabirimlerinin yntemleri iin bilgi yordamlar retir ve bunlar snfn sonuna ekler. Ayrca, IDisposable arabirimi iin Dispose yntemini oluturur. Not IEnumerator<TItem> arabirimi lEnumerator ve IDisposable arabirimlerinden kaltm yoluyla alr. Bu yzden, bunlarn yntemleri de grnr. Aslnda, IEnumerator<TItem> arabirimine ait tek e generic Current zelliidir. MoveNext ve Reset yntemleri generic olmayan lEnumerator arabirimine aittir. IDisposable arabirimi Blm 14te anlatlmtr. 9. Oluturulan kodu inceleyin. zelliklerin ve yntemlerin gvdeleri, NotImplementedException zel durumunu oluturan bir varsaylan uygulama ierir. lerideki admlarda bu kodu gerek bir uygulamayla deitireceksiniz. 10. MoveNext ynteminin gvdesini aada koyu harflerle gsterilen kodla deitirin:
bool System.Collections.IEnumerator.MoveNext() { if (this.enumData == null) { this.enumData = new Queue<TItem>(); populate(this.enumData, this.currentData); } if (this.enumData.Count > 0) { this.currentItem = this.enumData.Dequeue(); return true; } return false; }

Bir numaralandrcnn MoveNext ynteminin aslnda iki amac vardr. lk arldnda, numaralandrc tarafndan kullanlan veriyi balatmal ve dndrlecek ilk veri parasna atamaldr. (MoveNexti ilk kez armadan nce Current zellii tarafndan dndrlen deer tanmlanmamtr ve bir zel durum oluturmaldr). Bu durumda, balatma ilemi, kuyruu gsterme ve veriyi aatan alp kuyruu doldurmada kullanmak iin populate yntemini armaktan ibarettir. MoveNext yntemine yaplan sonraki arlar hibir e kalmayana dek veri eleri arasnda hareket etmeli; bu rnekte, kuyruk boalana kadar eleri kuyruktan karmaldr. MoveNextin aslnda veri eleri dndrmediine dikkat etmek nemlidir; bu, Current zelliinin amacdr. MoveNextin tm yapt, numaralandrcdaki i

360

Ksm III

Bileenler Yaratmak

durumu Current zelliinin kullanm iin gncelletirmek ve bir sonraki deer varsa true, yoksa false dndrmektir (currentltem deikeninin deeri kuyruktan alnan veri esine ayarlanr). 11. Generic Current zelliinin get eriimcisinin tanmn aadaki gibi deitirin:
TItem IEnumerator<TItem>.Current { get { if (this.enumData == null) throw new InvalidOperationException (Use MoveNext before calling Current); return this.currentItem; } }

nemli Current zelliinin doru uygulamasna kodu eklediinizden emin olun. Generic olmayan srm, System.Collections.IEnumerator.Current, varsaylan uygulamas ile brakn. Current zellii, MoveNext ynteminin arldndan emin olmak iin enumData deikenini inceler (bu deiken MoveNext e yaplan ilk ardan nce nulldur). Durum bu deilse, zellik bir InvalidOperationException zel durumu oluturur (Bu, ilemin bu durumda gereklemeyeceini gstermek iin .NET Framework uygulamalar tarafndan kullanlan geleneksel dzenektir). MoveNext daha nce arlmsa, currentltem deikenini gncelletirir; bylece, Current zelliinin yapmas gereken tek ey bu deikendeki deeri dndrmektir. 12. IDisposable.Dispose yntemini bulun. throw new NotImplementedException(); ifadesini, aada koyu harflerle gsterildii gibi aklama satr haline getirin. Numaralandrc ak brakma gerektiren hibir kaynak kullanmadndan bu yntemin bir ey yapmas gerekmez. Ancak, yine de bulundurulmaldr. Dispose yntemiyle ilgili ayrntl bilgi iin Blm 14e bakn.
void IDisposable.Dispose() { // throw new NotImplementedException(); }

13. zm oluturun ve varsa bildirilen hatalar dzeltin.

Blm 19

Koleksiyonlar Numaralandrmak

361

Bir Tr Parametresiyle Tanmlanan Bir Deiken Balatmak


currentltem deikenini tanmlayan ve balatan ifadenin default anahtar szcn kullandn fark etmi olmalsnz. currentltem deikeni TItem parametresi kullanlarak tanmlanr. Program yazlp derlenince, TItem yerini alacak gerek tr bilinmiyor olabilir (bu sorun yalnzca kod altrlnca zlr). Bu, deikenin balatlma biimini belirtmeyi zorlatrr. Buradaki eilim bunu null olarak ayarlamaktr. Bununla birlikte, TItem yerini alan tr bir deer tryse bu geersiz bir atama olur (deer trlerini null olarak ayarlayamazsnz, yalnzca bavuru trlerini atayabilirsiniz). Benzer biimde, trn bir say olacan dnerek bunu 0 olarak ayarlarsanz, tr gerekte bir bavuru tr olduunda bu da geersiz olur. Baka olaslklar da vardr: rnein, TItem bir boolean olabilir. default anahtar szc bu sorunu zer. Deikeni balatmak iin kullanlan deer, ifade altrldnda belirlenir; TItem bir bavuru tryse default(TItem) null dndrr, TItem bir sayysa default(TItem) 0 dndrr ve TItem bir boolean ise default(TItem) false dndrr. TItem bir struct ise, yapdaki bamsz alanlar ayn biimde balatlr (bavuru alanlar null, saysal alanlar 0 ve boolean alanlar false olarak ayarlanr).

IEnumerable Arabirimini Uygulamak


Aadaki altrmada IEnumerable arabirimini uygulamak iin ikili aa snfn deitireceksiniz. GetEnumerator yntemi bir TreeEnumerator<TItem> nesnesi dndrr.

Tree<TItem> snfndaki IEnumerable<TItem> arabirimini uygulayn


1. Solution Explorerda, Tree<TItem> snfn Code and Text Editor penceresinde grntlemek iin Tree.cs dosyasn ift tklayn. 2. Aadaki gibi, Tree<TItem> snfnn tanmn IEnumerable<TItem> arabirimini balatacak biimde deitirin:
public class Tree<TItem> : IEnumerable<TItem> where TItem : IComparable<TItem>

Snrlayclarn her zaman snf tanmnn sonuna yerletirildiine dikkat edin. 3. Snf tanmndaki IEnumerable<TItem> arabirimini farenin sa dmesiyle tklayn, Implement Interfacei iaret edip Implement Interface Explicitly seeneini tklayn. Bu ilem IEnumerable<TItem>.GetEnumerator ve IEnumerable.GetEnumerator yntemlerinin uygulamalarn oluturur ve bunlar snfa ekler. Generic olmayan IEnumerable arabirim yntemi uygulanr, nk IEnumerable<TItem> arabirimi IEnumerabledan kaltmla alr.

362

Ksm III

Bileenler Yaratmak

4. Snfn sonuna yakn bir yerde IEnumerable<TItem>.GetEnumerator yntemini bulun. GetEnumerator() ynteminin gvdesinde var olan throw ifadesini aadaki ekilde deitirin:
IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator() { return new TreeEnumerator<TItem>(this); }

GetEnumerator ynteminin amac koleksiyon boyunca yineleme yapmas iin bir numaralandrc nesne oluturmaktr. Bu durumda yapmamz gereken tek ey, aataki veriyi kullanarak yeni bir TreeEnumerator<TItem>nesnesi oluturmaktr. 5. zm oluturun. Proje sorunsuz derlenmelidir; varsa bildirilen hatalar dzeltin ve gerekirse zm yeniden oluturun. imdi, ikili bir aacn ieriini grntlemek iin bir foreach ifadesi kullanarak deitirilmi Tree<TItem> snfn test edeceksiniz.

Numaralandrcy test edin


1. Solution Explorerda, BinaryTree zmn farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra New Projecti tklayn. Console Application ablonunu kullanarak yeni bir proje ekleyin. Projeyi EnumeratorTest olarak adlandrn, Location olarak Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 19 klasrn atayn ve daha sonra OKi tklayn. 2. Solution Explorerda, EnumeratorTest projesini farenin sa dmesiyle tklayn ve sonra Set as Startup Projecti tklayn. 3. Project mensnden Add Reference tklayn. Add Reference iletiim kutusunda Projects sekmesini tklayn. nce BinaryTree projesini ve ardndan OKi tklayn. BinaryTree birleimi, Solution Explorerda EnumeratorTest projesinin bavurular listesinde grnr. 4. Program snfn grntleyen Code and Text Editor penceresinde, aadaki using ynergesini dosyann stndeki listeye ekleyin:
using BinaryTree;

Blm 19

Koleksiyonlar Numaralandrmak

363

5. Tamsaylardan oluan bir ikili aac yaratp dolduran aadaki ifadeleri Main yntemine ekleyin:
static void Main(string[] args) { Tree<int> tree1 = new Tree<int>(10); tree1.Insert(5); tree1.Insert(11); tree1.Insert(5); tree1.Insert(-12); tree1.Insert(15); tree1.Insert(0); tree1.Insert(14); tree1.Insert(-8); tree1.Insert(10); }

6. Aacn ieriini numaralandran ve sonular grntleyen bir foreach ifadesi ekleyin:


static void Main(string[] args) { ... foreach (int item in tree1) Console.WriteLine(item); }

7. zm oluturun ve varsa hatalar dzeltin. 8. Debug mensnde Start Without Debuggingi tklayn. Program alnca deerler aadaki srayla grntlenir: 12, 8, 0, 5, 5, 10, 10, 11, 14, 15 9. Visual Studio 2008e dnmek iin Enter tuuna basn.

Bir Yineleyici Kullanarak Numaralandrc Uygulamak


Grdnz gibi, bir koleksiyonu numaralandrlabilir yapmak karmak ve hatalara ak bir sre olabilir. Hayat kolaylatrmak iin C#, bu srecin byk bir blmn otomatikletiren yineleyiciler ierir. Yineleyici, sral bir deer dizisi veren bir kod bloudur. Buna ek olarak, yineleyici aslnda numaralandrlabilir snfn bir yesi deildir. Numaralandrcnn deer dndrmek iin kulland diziyi belirtir. Baka bir deyile, bir yineleyici, C# derleyicisinin kendi numaralandrcsn yaratmak iin kullanabildii numaralandrma dizisinin bir betimlemesidir

364

Ksm III

Bileenler Yaratmak

yalnzca. Bu kavram dzgn biimde anlamak biraz dnmeyi gerektirdiinden ikili aalara ve zyinelemeye dnmeden nce temel bir rnei ele alalm.

Basit Bir Yineleyici


Aada gsterilen BasicCollection<T> snf, bir yineleyici uygulamann temel ilkelerini gstermektedir. Snf, veri tutmak iin bir List<T> kullanr ve bu listeyi doldurmak iin FillList yntemini kullanr. BasicCollection<T> snfnn IEnumerable<T> arabirimini uyguladna da dikkat edin. GetEnumerator yntemi bir yineleyici kullanlarak uygulanr:
using System; using System.Collections.Generic; using System.Collections; class BasicCollection<T> : IEnumerable<T> { private List<T> data = new List<T>(); public void FillList(params T [] items) { foreach (var datum in items) data.Add(datum); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { foreach (var datum in data) yield return datum; } IEnumerator IEnumerable.GetEnumerator() { // Bu rnekte uygulanmaz } }

GetEnumerator yntemi olduka ak grnmektedir, ancak daha yakndan bakmay gerektirir. Dikkat etmeniz gereken ilk ey bir IEnumerator<T> trn dndrmediidir. Bunun yerine, data dizisindeki eler iinde dner. Ve her eyi srayla dndrr. nemli nokta, yield anahtar szcnn kullanmdr. yield anahtar szc her yinelemenin dndrmesi gereken deeri gsterir. yield ifadesini yntemi geici olarak durduran ve arana bir deer geiren bir ar gibi dnebilirsiniz. aran sonraki deeri istediinde GetEnumerator yntemi yieldin brakt yerden devam eder ve dngye girerek sonraki deeri verir. Sonuta, veri tkenir, dng durur ve GetEnumerator yntemi sonlanr. Bu noktada yineleme tamamlanmtr.

Blm 19

Koleksiyonlar Numaralandrmak

365

Bu genel anlamyla normal bir yntem deildir. GetEnumerator yntemindeki kod bir iterator (yineleyici) tanmlar. Derleyici, bu kodu bir Current ve bir MoveNext yntemi ieren IEnumerator<T> snfnn bir uygulamasn oluturmak iin kullanr. Bu uygulama GetEnumerator yntemi tarafndan belirtilen ilevsellikle tam olarak eleir. Aslnda oluturulan bu kodu grmezsiniz (derlenmi kodu ieren birleimin derlemesini kaldrmadnz srece), ancak yazmanz gereken kodun salad rahatl ve kodun ksaln dnnce bu dediiniz kk bir bedeldir. Aadaki kod blounda grld gibi, yineleyici tarafndan oluturulan numaralandrcy her zamanki gibi balatabilirsiniz:
BasicCollection<string> bc = new BasicCollection<string>(); bc.FillList(Twas, brillig, and, the, slithy, toves); foreach (string word in bc) Console.WriteLine(word);

Bu kod bc nesnesinin ieriini aadaki srada yazdrr: Twas, brillig, and, the, slithy, toves Veriyi farkl srada sunacak alternatif yineleme dzenekleri salamak isterseniz IEnumerable arabirimini uygulayan ve veri dndrmek iin bir yineleyici kullanan ek zellikler kullanabilirsiniz. rnein, aada gsterilen BasicCollection<T> snfnn Reverse zellii listedeki veriyi ters srada sunar:
public IEnumerable<T> Reverse { get { for (int i = data.Count - 1; i >= 0; i--) yield return data[i]; } }

Bu zellii aadaki gibi balatabilirsiniz:


BasicCollection<string> bc = new BasicCollection<string>(); bc.FillList(Twas, brillig, and, the, slithy, toves); foreach (string word in bc.Reverse) Console.WriteLine(word);

Bu kod bc nesnesinin ieriini ters srada yazdrr: toves, slithy, the, and, brillig, Twas

366

Ksm III

Bileenler Yaratmak

Bir Yineleyici Kullanarak Tree<TItem> Snf in Bir Numaralandrc Tanmlamak


Sonraki altrmada bir yineleyici kullanarak Tree<TItem> snf iin bir numaralandrc uygulayacaksnz. MoveNext yntemi tarafndan aataki verinin bir kuyrua nceden ilenmesinin gerektii nceki altrmalarn aksine, Blm 17de aklanan WalkTree yntemine benzeyen daha doal zyinelemeli dzenei kullanarak aa boyunca ilerleyen bir yineleyici tanmlayabilirsiniz.

Tree<TItem> snfna bir numaralandrc ekleyin


1. Visual Studio 2008i kullanarak, Belgeler klasrnzdeki \Microsoft Press \Visual CSharp Step by Step\Chapter 19\IterarorBinaryTree klasrnde yer alan BinaryTree zmn an. Bu zm, Blm 18de oluturduunuz BinaryTree projesinin bir baka kopyasn ierir. 2. Code and Text Editor penceresinde Tree.cs dosyasn grntleyin. Tree<TItem> snfnn tanmn IEnumerable<TItem> arabirimini gelitirecek biimde deitirin:
public class Tree<TItem> : IEnumerable<TItem> where TItem : IComparable<TItem> { ... }

3. Snf tanmndaki IEnumerable<TItem> arabirimini farenin sa dmesiyle tklayn, Implement Interfacei iaret edin ve ardndan Implement Interface Explicitly seeneini tklayn. IEnumerable<TItem>.GetEnumerator ve IEnumerable.GetEnumerator yntemleri snfa eklenir. 4. IEnumerable<TItem>.GetEnumerator yntemini bulun. GetEnumerator ynteminin ieriini aada grdnz gibi deitirin:
IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator() { if (this.LeftTree != null) { foreach (TItem item in this.LeftTree) { yield return item; } } yield return this.NodeData;

Blm 19
if (this.RightTree != null) { foreach (TItem item in this.RightTree) { yield return item; } } }

Koleksiyonlar Numaralandrmak

367

lk bakta yle deilmi gibi grnebilir, ancak bu kod zyinelemelidir. LeftTree bo deilse ilk foreach ifadesi GetEnumerator yntemini (u anda tanmladnz) dolayl olarak onun zerinden arr. Bu ilem, hi sol alt aac kalmayan bir dm bulunana dek srer. Bu noktada, NodeData zelliindeki deer verilir ve sa alt aa ayn biimde incelenir. Sa alt aa tkenince bu ilem, NodeData zelliini yazdrarak ve sa alt aacn inceleyerek st dme geri dner. Bu ilem dngs tm aa numaralandrlncaya ve tm dmler yazdrlana kadar devam eder.

Yeni numaralandrcy test edin


1. Solution Explorerda, BinaryTree zmn farenin sa dmesiyle tklayn, Addi iaret edin ve sonra Existing Projecti tklayn. Add Existing Project iletiim kutusunda, \Microsoft Press\Visual CSharp Step By Step\Chapter 19\EnumeratorTest klasrn bulun, EnumeratorTest proje dosyasn sein ve Open tklayn. Bu, daha nce elle oluturduunuz numaralandrcy snamak iin yarattnz projedir. 2. Solution Explorerda EnumeratorTest projesini farenin sa dmesiyle tklayn ve ardndan Set as Startup Projecti tklayn. 3. Solution Explorerda EnumeratorTest projesinin References dmn geniletin. BinaryTree birleimini farenin sa dmesiyle tkladktan sonra Remove komutunu tklayn. Bu eylem BinaryTree birleimine yaplan bavuruyu (Blm 18den) projeden kaldrr. 4. Project mensnde Add Reference tklayn. Add Reference iletiim kutusunda Projects sekmesini tklayn. BinaryTree projesini sein ve ardndan OKi tklayn. Yeni BinaryTree birleimi Solution Explorerda EnumeratorTest projesinin bavurular listesinde grnr. Not Bu iki adm EnumeratorTest projesinin BinaryTree birleiminin nceki srme deil,
numaralandrcsn oluturmak iin yineleyiciyi kullanan srmne bavurduunu garantiler.

368

Ksm III

Bileenler Yaratmak

5. EnumeratorTest projesi iin Program.cs dosyasn Code and Text Editor penceresinde grntleyin. Program.cs dosyasndaki Main yntemini gzden geirin. Bu yntemin bir Tree<int> nesnesi gsterdiini, bunu baz verilerle doldurduunu ve ardndan ieriini grntlemek iin bir foreach ifadesi kullandn hatrlayn. 6. zm oluturun ve varsa hatalar dzeltin. 7. Debug mensnde Start Without Debuggingi tklayn. Program alnca deerler ncekiyle ayn srada grntlenir: 12, 8, 0, 5, 5, 10, 10, 11, 14, 15 8. Visual Studio 2008e dnmek iin Entera basn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 20ye gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 19 Hzl Bavuru


Bunun in
foreach yapsn desteklemesini salamak iin bir snf numaralandrlabilir yapmak

unu Yapn
IEnumerable arabirimini uygulayn ve bir IEnumerator nesnesi dndren bir GetEnumerator yntemi salayn. rnein:
public class Tree<TItem> : IEnumerable<TItem> { ... IEnumerator<TItem> GetEnumerator() { ... } }

Blm 19

Koleksiyonlar Numaralandrmak

369

Bir yineleyici kullanmadan bir numaralandrc uygulamak

IEnumerator arabirimini uygulayan ve Current zellii ile MoveNext (ve Reset ) yntemlerini salayan bir numaralandrc snf tanmlayn. rnein:
public class TreeEnumerator<TItem> : IEnumerator<TItem> { ... TItem Current { get { ... } } bool MoveNext() { ... } }

Bir yineleyici kullanarak bir numaralandrc tanmlamak

Hangi enin hangi srayla dndrleceini (yield ifadesini kullanarak) gstermek iin numaralandrcy uygulayn. rnein:
IEnumerator<TItem> GetEnumerator() { for (...) yield return ... }

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak


Bu blm tamamladktan sonra renecekleriniz :
n

Numaralandrlabilir koleksiyonlarn ieriini incelemek iin Language Integrated Query (LINQ) (Tmleik Sorgu Dili) sorgular tanmlamak. LINQ geniletilmi yntemler ve sorgu ileleri kullanmak. LINQnun bir sorguyu ertelemesini ve hemen uygulanmasn nasl salayacanz, bir LINQ sorgusunun sonularn nbellee nasl alabileceinizi aklamak.

n n

C# dilinin birok zelliini grdnz. Bununla birlikte, birok uygulama tarafndan kullanlabilen nemli bir yaklamdan, C#n veri sorgulama iin salad destekten bahsetmedik. Veriyi modellemek iin yaplar ve snflar tanmlayabileceinizi ve veriyi geici olarak bellekte saklamak iin koleksiyonlar ve diziler kullanabileceinizi grdnz. Ancak, belirli kriterlerle eleen bir koleksiyondaki eleri aramak gibi yaygn grevleri nasl yerine getirirsiniz? rnein, Customer nesnelerinin bir koleksiyonuna sahipseniz, Londrada bulunan mterileri ya da mterilerinizin ounun hangi ehirde olduunu nasl bulursunuz? Bir koleksiyon zerinde yinelemek ve her nesnedeki alanlar incelemek iin kendiniz kod yazabilirsiniz fakat bu tr grevler ok sk gerektiinden C# tasarmclar, yazmak zorunda olduunuz kod miktarn en az tutmak iin, C#n baz zellikler iermesine karar vermilerdir. Bu blmde, veri sorgulama ve ileme iin, C# dilinin bu ileri seviye zelliklerini nasl kullanacanz reneceksiniz.

Tmleik Sorgu Dili (LINQ) Nedir?


Tm uygulamalarn veri ilemesi gerekir. Tarihsel olarak, birok uygulama bu ilemleri gerekletirmek iin kendi mantna sahiptir. Bununla birlikte, bu strateji, bir uygulamadaki kodun ilenen verinin yapsna olduka sk bal hale gelmesine neden olabilir. Veri yaps deiirse, veriyi ileyen kodda da ok sayda deiiklik yapmanz gerekebilir. Microsoft .NET Framework tasarmclar, bu konularda uzun sure dndler ve bir uygulamann veriyi kodun kendisinden sorgulamas iin kullanaca baz zellikler salayarak, uygulama gelitirme srecini kolaylatrmaya karar verdiler. Bu zellikler, Tmleik Sorgu Dili (Language Integrated Query ya da LINQ) olarak adlandrlr.

371

372

Ksm III

Bileenler Yaratmak

LINQ dili tasarmclar, Microsoft SQL Server gibi ilikisel veritaban ynetim sistemlerini ele alarak, veritabann sorgulamak iin kullanlan dili, veritabanndaki verinin isel biiminden ayrr. Bir SQL Server veritabanna erien yazlm gelitiriciler, Yapsal Sorgu Dili (Structured Query Language, SQL) ifadelerini veritaban ynetim sistemine datrlar. SQL, yazlm gelitiricinin veritabanndan almak istedii, fakat veritaban ynetim sisteminden nasl alacan tam olarak bilmedii verinin, ileri seviye tanmn salar. Bu ayrntlar veritaban ynetim sisteminin kendisi tarafndan denetlenir. Bu nedenle, SQL ifadeleri aran bir uygulama veritabannn veriyi nasl depolad ya da veriyi nasl bulduu ile ilgilenmez. Veritaban ynetim sistemi tarafndan kullanlan biim deiebilir (rnein, yeni bir srm yaynlandnda), fakat yazlm gelitiricinin uygulama tarafndan kullanlan SQL ifadelerini deitirmesi gerekmez. LINQ, szdizimi ve anlambilimi bakmndan SQLe olduka benzer ve ayn avantajlar salar. Sorgulama ilemlerini gerekletiren kodu deitirmeniz gerekmeden, sorgulanan verinin temel yapsn deitirebilirsiniz. LINQ dili SQLe olduka benzer olmakla birlikte, daha esnektir ve daha fazla eitte mantksal veri yaplarn ileyebilir. rnein, LINQ, bir XML belgesinde bulunan veri gibi hiyerarik olarak organize edilmi veriyi ileyebilir. Bununla birlikte, bu blmde ilikisel anlamda LINQ kullanmna younlalmtr.

Bir C# Uygulamasnda LINQ Kullanmak


LINQyu destekleyen C# zelliklerini nasl kullanacanz aklamann en basit yolu aadaki mteri adlar ve adres bilgilerine dayal basit rnekler zerinden almak olacaktr: Mteri Bilgisi
CustomerID
1 2 3 4 5 6 7 8 9 10

FirstName
Orlando Keith Donna Janet Lucy David Donald Jackie Elsa Eric

LastName
Gee Harris Carreras Gates Harrington Liu Blanton Blackwell Leavitt Lang

CompanyName
A Bike Store Bike World A Bike Store Fitness Hotel Grand Industries Bike World Grand Industries Fitness Hotel Grand Industries Distant Inn

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

373

Adres Bilgisi
CompanyName
A Bike Store Bike World Fitness Hotel Grand Industries Distant Inn

City
New York Chicago Ottawa London Tetbury

Country
United States United States Canada United Kingdom United Kingdom

LINQ verinin, Blm 19da akland gibi, IEnumerable arabirimini gelitiren bir veri yapsnda saklanmasn ister. Numaralandrlabilir olduu srece ne tr yap (bir dizi, HashTable, Queue ya da baka bir koleksiyon tr ve hatta kendi tanmladnz bir tr) kullandnz nemli deildir. Ancak, bu blmdeki rnekler, aadaki kod rneinde gsterildii gibi, mteri ve adres bilgisinin customers ve addresses dizilerinde tutulduunu varsayar. Not Gerek dnya uygulamasnda, veriyi bir dosya ya da veritabanndan okuyarak bu dizileri

yerletireceksiniz. Veriyi Ynetmek balkl Ksm Vte, bir veritabanndan bilgiyi elde etmek iin . NET Framework tarafndan salanan zellikler hakknda daha fazlasn reneceksiniz.

var customers = new[] { new { CustomerID = 1, FirstName = Orlando, LastName = Gee, CompanyName = A Bike Store }, new { CustomerID = 2, FirstName = Keith, LastName = Harris, CompanyName = Bike World }, new { CustomerID = 3, FirstName = Donna, LastName = Carreras, CompanyName = A Bike Store }, new { CustomerID = 4, FirstName = Janet, LastName = Gates, CompanyName = Fitness Hotel }, new { CustomerID = 5, FirstName = Lucy, LastName = Harrington, CompanyName = Grand Industries }, new { CustomerID = 6, FirstName = David, LastName = Liu, CompanyName = Bike World }, new { CustomerID = 7, FirstName = Donald, LastName = Blanton, CompanyName = Grand Industries }, new { CustomerID = 8, FirstName = Jackie, LastName = Blackwell, CompanyName = Fitness Hotel }, new { CustomerID = 9, FirstName = Elsa, LastName = Leavitt, CompanyName = Grand Industries }, new { CustomerID = 10, FirstName = Eric, LastName = Lang, CompanyName = Distant Inn } };

374

Ksm III

Bileenler Yaratmak

var addresses = new[] { new { CompanyName = A Bike Store, City = New York, Country = United States}, new { CompanyName = Bike World, City = Chicago, Country = United States}, new { CompanyName = Fitness Hotel, City = Ottawa, Country = Canada}, new { CompanyName = Grand Industries, City = London, Country = United Kingdom}, new { CompanyName = Distant Inn, City = Tetbury, Country = United Kingdom} };

Not Veriyi Semek, Veriyi Filtrelemek, Veriyi Sralamak, Gruplamak ve Toplamak ve Veriyi Birletirmek balkl aadaki blmler, LINQ yntemlerini kullanarak veriyi sorgulamak iin baz zellikleri ve szdizimini gsterir. Szdizimi biraz karmak gelebilir. Sorgu lelerini Kullanmak balkl blmde szdiziminin nasl altn tmyle bilmenizin gerekten gerekli olmadn greceksiniz. Bununla birlikte, C# tarafndan salanan sorgu ilelerinin grevlerini nasl gerekletirdiini tam olarak anlamak iin aadaki blmlere en azndan gz atmanz yararl olacaktr.

Veriyi Semek
customers dizisindeki her mterinin ilk adn kapsayan bir listeyi grntlemek istediinizi varsayn. Aadaki kod ile bu grevi gerekletirebilirsiniz:
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName); foreach (string name in customerFirstNames) { Console.WriteLine(name); }

Bu kod blou olduka ksa olmakla birlikte, customers dizisinin Select ynteminin kullanmndan balayarak ok sayda aklama gerektirir. Select yntemi, diziden belirli bir veriyi bulmanz salar (bu rnekte, sadece dizideki her enin FirstName alanndaki deeri). Nasl alr? Select ynteminin parametresi, customers dizisinden bir satr alarak, o satrdan seilen veriyi dndren bir baka yntemdir. Bu grevi gerekletirmek iin kendi ynteminizi tanmlayabilirsiniz, fakat en basit mekanizma, nceki rnekte gsterildii gibi bir anonim yntem tanmlamak iin bir lambda deyimi kullanmaktr. u nemli noktay iyi anlamalsnz:
n

cust tr, ynteme geirilen parametrenin trdr. cust trn, customers dizisindeki her satrn tr iin bir takma ad olarak dnebilirsiniz. Derleyici, bunu customers dizisi zerinde Select yntemini armanz gereinden ortaya karr. cust yerine herhangi bir geerli C# tanmlaycy kullanabilirsiniz.

Blm 20
n

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

375

Select yntemi bu defa veriyi gerekten bulmaz; daha sonra zerinden yineleme yapacanz, Select yntemi tarafndan tanmlanan veriyi bulup getirecek olan bir numaralandrlabilir nesne dndrr. Bu yaklam, LINQ ve Ertelenmi Deerlendirme balkl blmde ele alacaz. Select yntemi, gerekte bir Array tr yntemi deildir. Enumerable snfnn geniletilmi yntemidir. Enumerable snf, System.Linq ad alannda yer alr ve generic IEnumerable<T> arabirimini uygulayan sorgu nesnelerinin statik yntemlerinin nemli bir kmesini salar.

nceki rnek, customerFirstNames adnda bir IEnumerable<string> (Select yntemi, string trndeki mterilerin ilk adlarnn numaralandrlabilir koleksiyonunu dndrdnden IEnumerable<string> trndedir.) nesnesi retmek iin customers dizisinin Select yntemini kullanr. foreach ifadesi bu dize koleksiyon zerinden yinelenir, aadaki srada mterilerin ilk adlarnn ktsn verir:
Orlando Keith Donna Janet Lucy David Donald Jackie Elsa Eric

imdi her mterinin ilk adn grntleyebilirsiniz. Her mterinin ilk adn ve soyadn nasl elde edersiniz? Bu, biraz ince bir itir. Microsoft Visual Studio 2008 tarafndan salanan belgelerdeki System.Linq ad alannda Enumerable.Select ynteminin tanmn incelerseniz, aadaki gibi olduunu grrsnz:
public static IEnumerable<TResult> Select<TSource, TResult> ( IEnumerable<TSource> source, Func<TSource, TResult> selector )

Bu tanmlamann tam olarak syledii, Select ynteminin bir generic yntem olduu ve source ve selector adnda iki sradan parametrenin yansra, TSource ve TResult adnda iki tr parametresi alddr. TSource, bir numaralandrlabilir sonu kmesi iin rettiiniz koleksiyonun trdr (rneimizde, customer nesneleri) ve TResult da, numaralandrlabilir sonu kmesindeki verinin trdr (rneimizde, string nesneleri). Select ynteminin geniletilmi yntem olduunu hatrlayn, yani source parametresi gerekte geniletilen tre bir bavurudur (rneimizde IEnumerable arabirimini uygulayan customer nesnelerinin generic koleksiyonu). selector parametresi, bulunan alanlar tanmlayan bir generic yntemi belirtir. (Func, bir generic yntemi kapsllemek iin kullanabileceiniz, .NET Frameworkdeki bir generic temsilci trnn addr.) selector parametresi tarafndan bavurulan yntem,

376

Ksm III

Bileenler Yaratmak

TSource (bu rnekte, customer) parametresi alr ve TResult (bu rnekte, string) nesnelerinin bir koleksiyonunu verir. Select yntemi tarafndan dndrlen deer, TResult (yine, string) nesnelerinin numaralandrlabilir koleksiyonudur. Not Geniletilmi yntemlerin nasl altn ve ilk parametrenin geniletilmi ynteme etkisini
yeniden gzden geirmeniz gerekirse, Blm 12ye tekrar bakn.

nceki paragrafta anlalmas gereken nemli bir nokta, Select ynteminin, tek bir tre dayal numaralandrlabilir bir koleksiyon dndrddr. Numaralandrcnn, her mterinin ilk ad ve soyad gibi birden fazla veri esi dndrmesini istiyorsanz, bunun iin en az iki seeneiniz var:
n

lk ad ve soyadlar aadaki gibi, Select ynteminde tek bir dize iinde birletirebilirsiniz:
IEnumerable<string> customerFullName = customers.Select(cust => cust.FirstName + " " + cust.LastName);

Aadaki gibi, ilk ad ve soyadlar paketleyen yeni bir tr tanmlayabilir ve bu trn rneklerini oluturmak iin Select yntemini kullanabilirsiniz:
class Names { public string FirstName{ get; set; } public string LastName{ get; set; } } ... IEnumerable<Names> customerName = customers.Select(cust => new Names { FirstName = cust.FirstName, LastName = cust.LastName } );

kinci seenek tercih edilir fakat buras uygulamanzn Names trn kulland tek yer ise, tek bir ilem iin yeni bir tr tanmlamak yerine bir anonim tr kullanmay tercih edebilirsiniz:
var customerName = customers.Select(cust => new { FirstName = cust.FirstName, LastName = cust.LastName } );

Numaralandrlabilir koleksiyon trn tanmlamak iin var anahtar szc kullanmna dikkat edin. Koleksiyondaki nesnelerin tr anonimdir, yani koleksiyondaki nesneler iin zel bir tr belirleyemezsiniz.

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

377

Veriyi Filtrelemek
Select yntemi, numaralandrlabilir koleksiyonda iermek istediiniz alanlar belirlemenize ya da planlamanza imkan salar. Bununla birlikte, ayrca numaralandrlabilir koleksiyonun ierdii satrlar kstlamak isteyebilirsiniz. rnein, sadece United Statesde bulunan addresses dizisindeki irketlerin adlarn listelemek istediinizi varsayn. Bunun iin, aadaki gibi Where yntemini kullanabilirsiniz:
IEnumerable<string> usCompanies = addresses.Where(addr => String.Equals(addr.Country, United States)) .Select(usComp => usComp.CompanyName); foreach (string name in usCompanies) { Console.WriteLine(name); }

Szdizimi asndan, Where yntemi Select yntemine benzer. Belirlediiniz lte uygun olarak veriyi filtreleyen bir yntem tanmlayan bir parametre alr. Bu, lambda deyiminin kullanmnn baka bir rneidir. addr tr, addresses dizisindeki satrn bir baka addr ve lambda deyimi, Country alannn United States dizesi ile eletii tm satrlar dndrr. Where yntemi, orijinal koleksiyondan her alan ieren satrlarn numaralandrlabilir koleksiyonunu dndrr. string nesnelerinin baka bir numaralandrlabilir koleksiyonunu dndrmek iin, daha sonra bu satrlara numaralandrlabilir koleksiyondan sadece CompanyName alann almak iin Select yntemi uygulanr. (usComp tr, Where yntemi tarafndan dndrlen numaralandrlabilir koleksiyondaki her satrn trnn bir baka addr.) Bu nedenle, bu tam deyimin sonucunun tr IEnumerable<string>dir. lemlerin bu srasn anlamak gerekir; Where yntemi ilk olarak satrlar filtrelemek iin uygulanr, ardndan bu alanlar belirtmek iin Select yntemi uygulanr. Bu koleksiyon zerinden tekrarlanan foreach ifadesi, aadaki irketleri grntler:
A Bike Store Bike World

Veriyi Sralamak, Gruplamak ve Toplamak


SQL dilini biliyorsanz, SQLin basit planlama ve filtrelemeden baka geni eitlilikte ilikisel ilemler gerekletirmenize olanak tandn da biliyorsunuzdur. rnein, verinin belirli bir srada dnmesini istediinizi belirleyebilir, bir ya da daha fazla anahtar alana uygun dnen satrlar gruplayabilir ve her gruptaki satrlara dayal zet deerleri hesaplayabilirsiniz. LINQ da benzer ilevsellii salar. Veriyi belirli bir srada almak iin, OrderBy yntemini kullanabilirsiniz. Select ve Where yntemleri gibi, OrderBy yntemi de bamsz deiken olarak bir yntem alr. Bu yntem,

378

Ksm III

Bileenler Yaratmak

veriyi sralamak iin kullanmak isteyeceiniz deyimi tanmlar. rnein, aadaki gibi, addresses dizisindeki her irketin adn artan bir srada grntleyebilirsiniz:
IEnumerable<string> companyNames = addresses.OrderBy(addr => addr.CompanyName).Select(comp => comp.CompanyName); foreach (string name in companyNames) { Console.WriteLine(name); }

Bu kod blou, adres tablosundaki irketleri alfabetik srada grntler:


A Bike Store Bike World Distant Inn Fitness Hotel Grand Industries

Veriyi azalan srada numaralandrmak isterseniz, OrderByDescending yntemini kullanabilirsiniz. Birden fazla anahtar deeri sralamak isterseniz, OrderBy ya da OrderByDescending ynteminden sonra ThenBy ya da ThenByDescending yntemini kullanabilirsiniz. Bir ya da daha fazla alandaki ortak deerlere uygun veriyi gruplamak iin, GroupBy yntemini kullanabilirsiniz. Sonraki rnek, addresses dizisindeki irketleri lkeye gre nasl gruplayacanz gsterir:
var companiesGroupedByCountry = addresses.GroupBy(addrs => addrs.Country); foreach (var companiesPerCountry in companiesGroupedByCountry) { Console.WriteLine(Country: {0}\t{1} companies, companiesPerCountry.Key, companiesPerCountry.Count()); foreach (var companies in companiesPerCountry) { Console.WriteLine(\t{0}, companies.CompanyName); } }

imdiye kadar, modeli anlam olmalsnz! GroupBy yntemi, veriyi gruplamak iin alanlar belirleyen bir yntem ierir. GroupBy yntemi ile imdiye kadar grdnz dier yntemler arasnda baz ince farklar vardr. En nemlisi, sonucu oluturan alanlar semek iin Select yntemini kullanmanz gerekmemesidir. GroupBy yntemi tarafndan dndrlen numaralandrlabilir kme, orijinal kaynak koleksiyondaki tm alanlar ierir fakat satrlar, GroupBy tarafndan belirlenen yntem tarafndan tanmlanan alana bal bir numaralandrlabilir koleksiyon kmesinde sralanmtr. Dier bir deyile, GroupBy ynteminin sonucu, her biri bir numaralandrlabilir satr kmesi olan gruplarn numaralandrlabilir kmesidir. Biraz nce gsterilen rnekte, numaralandrlabilir kme

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

379

companiesGroupedByCountry, lkelerin bir kmesidir. Bu kmedeki eler, srayla her lke iin irketleri ieren numaralandrlabilir koleksiyonlardr. Her lkedeki irketi gsteren kod, srayla her lkeyi grntlemek iin companiesGroupedByCountry kmesi zerinden tekrarlanan bir foreach dngs ve bu dng iinde yuvalanm, her lkedeki irketler zerinden tekrarlanan bir baka foreach dngs kullanr. Dardaki foreach dngsnde, her enin Key alann kullanarak grupladnz deere eriebildiinize ve ayrca Count, Max, Min gibi yntemleri kullanarak her grup iin zet veriyi hesaplayabildiinize dikkat edin. rnek kod tarafndan retilen kt u ekilde grnr:
Country: United States 2 companies A Bike Store Bike World Country: Canada 1 companies Fitness Hotel Country: United Kingdom 2 companies Grand Industries Distant Inn

Select ynteminin sonular zerinden dorudan Count, Max ve Min gibi hesaplama yntemlerinin birounu kullanabilirsiniz. addresses dizisinde ka adet irket olduunu bilmek isterseniz, aadaki gibi bir kod blounu kullanabilirsiniz:
int numberOfCompanies = addresses.Select(addr => addr.CompanyName).Count(); Console.WriteLine(Number of companies: {0}, numberOfCompanies);

Bu yntemlerin sonucunun, numaralandrlabilir koleksiyon deil, tek bir saysal deer olduuna dikkat edin. Bu kod blounun sonucu u ekilde olur:
Number of companies: 5

Burada bir noktay vurgulamalyz. Bu hesaplama yntemleri, satrlarda yinelenen deerleri ayrt etmez. Bunun anlam udur: nceki rnek, size sadece addresses dizisinde ka adet satrn CompanyName alannda bir deer olduunu gsterir. Bu tabloda ka farkl lkenin bulunduunu bilmek isterseniz, unu denemelisiniz:
int numberOfCountries = addresses.Select(addr => addr.Country).Count(); Console.WriteLine(Number of countries: {0}, numberOfCountries);

Sonu u ekilde grnr:


Number of countries: 5

Aslnda, addresses dizisinde sadece farkl lke vardr, United States ve United Kingdom iki defa gemektedir. Aadaki gibi, Distinct yntemi kullanarak hesaplamadan tekrarlar karabilirsiniz:
int numberOfCountries = addresses.Select(addr => addr.Country).Distinct().Count();

380

Ksm III

Bileenler Yaratmak

Console.WriteLine ifadesi imdi istenilen sonucu verecektir:


Number of countries: 3

Verileri Birletirmek
SQLde olduu gibi, LINQ da birden fazla veri kmesini, bir ya da birden fazla ortak anahtar alan zerinde birletirmenize imkan tanr. Aadaki rnek, her mterinin ilk ad ve soyadn, bulunduklar lke ad ile birlikte nasl grntleyeceinizi gsterir:
var citiesAndCustomers = customers .Select(c => new { c.FirstName, c.LastName, c.CompanyName }) .Join(addresses, custs => custs.CompanyName, addrs => addrs.CompanyName, (custs, addrs) => new {custs.FirstName, custs.LastName, addrs.Country }); foreach (var row in citiesAndCustomers) { Console.WriteLine(row); }

Mterilerin ilk ad ve soyad customers dizisinde mevcuttur fakat mterilerin alt irketlerin bulunduu lke, addresses dizisinde saklanr. customers dizisi ve addresses dizisi arasndaki ortak anahtar irket addr. Select yntemi, customers dizisinde ilgilenilen alanlar (FirstName ve LastName), ortak anahtar ieren alan (CompanyName) ile birlikte belirtir. Baka bir numaralandrlabilir koleksiyon ile Select yntemi tarafndan tanmlanan veriyi birletirmek iin Join yntemini kullanrsnz. Join yntemi parametreleri unlardr:
n n

Birletirilecek numaralandrlabilir koleksiyon. Select yntemi tarafndan tanmlanm verideki ortak anahtar alanlar tanmlayan bir yntem. Seilen veriyi birletirmek iin ortak anahtar alanlar tanmlayan bir yntem. Join yntemi tarafndan dndrlen numaralandrlabilir sonu kmesinde istediiniz stunlar belirleyen bir yntem.

n n

Bu rnekte, Join yntemi, customers dizisindeki FirstName, LastName ve CompanyName alanlarn ieren numaralandrlabilir koleksiyonu, addresses dizisindeki satrlarla birletirir. customers dizisinin CompanyName alanndaki veri ile addresses dizisinin CompanyName alanndaki veri eletiinde, iki veri kmesi birletirilir. Sonu kmesi, customers dizisinin FirstName ve LastName alanlar ile addresses dizisinin Country alann ieren satrlardan meydana gelir. citiesAndCustomers koleksiyonundaki veri ktsn veren kod, aadaki bilgiyi grntler:
{ FirstName = Orlando, LastName = Gee, Country = United States } { FirstName = Keith, LastName = Harris, Country = United States }

Blm 20
{ { { { { { { { FirstName FirstName FirstName FirstName FirstName FirstName FirstName FirstName = = = = = = = =

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

381

Donna, LastName = Carreras, Country = United States } Janet, LastName = Gates, Country = Canada } Lucy, LastName = Harrington, Country = United Kingdom } David, LastName = Liu, Country = United States } Donald, LastName = Blanton, Country = United Kingdom } Jackie, LastName = Blackwell, Country = Canada } Elsa, LastName = Leavitt, Country = United Kingdom } Eric, LastName = Lang, Country = United Kingdom }

Not Bellekteki koleksiyonlarn ilikisel veritabanndaki tablolarla ayn olmadn ve koleksiyonlarn ierdii verinin ayn veri btnl kstlamalarna bal olmadn unutmayn. likisel veritabannda, her mterinin uygun irkete sahip olduu ve her irketin de benzersiz bir adrese sahip olduu varsaylabilir. Koleksiyonlar ayn seviyede veri btnl salamaz, yani addresses dizisinde var olmayan bir irket mterisine sahip olabilirsiniz ve hatta bir irket addresses dizisinde birden fazla adresde yer alabilir. Bu durumlarda, elde ettiiniz sonu kesin fakat beklenmeyen bir sonu olabilir. Birletirme ilemleri en iyi ekilde, birletirdiiniz veri arasndaki ilikileri tam olarak anladnzda alr.

Sorgu lelerini Kullanmak


nceki blmlerde, System.Linq ad alannda tanmlanan Enumerable snf iin geniletilmi yntemler kullanarak bellekteki veriyi sorgulamak iin kullanlan birok zellik gsterildi. Szdizimi, birka ileri seviye C# dili zelliklerini kullanlr hale getirmitir ve sonu olarak bazen kodun anlalmas ve bakm olduka zor olabilir. Sizi bu skntdan kurtarmak iin, C# tasarmclar, SQLe ok benzeyen bir szdizimi kullanarak LINQ zelliklerini kullanmanz salayabilmek iin C# diline sorgu ileleri eklediler. Bu blmde nceki rneklerde grdnz gibi, her mterinin ilk adn elde edebilirsiniz:
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);

Bu ifadeyi, from ve select sorgu ilelerini kullanarak, aadaki gibi baka bir ekilde ifade edebilirsiniz:
var customerFirstNames = from cust in customers select cust.FirstName;

Derleme zamannda, C# derleyicisi, deyimi uygun Select yntemine dntrr. from ileci kaynak koleksiyon iin bir baka ad tanmlar ve select ileci bu takma ad kullanarak elde edecek ekilde alanlar belirler. Sonu, mteri ilk adlarnn numaralandrlabilir koleksiyonudur. SQL biliyorsanz, from ilecinin select ilecinden nce gerekletiine dikkat edin.

382

Ksm III

Bileenler Yaratmak

Her mterinin ilk adn ve soyadn elde etmek iin aadaki ifadeyi kullanabilirsiniz. (Ayn ifadenin Select geniletme yntemine dayal nceki rneine bavurmak isteyebilirsiniz. )
var customerNames = from c in customers select new { c.FirstName, c.LastName };

Veriyi filtrelemek iin where ileci kullanrsnz. Aadaki rnek, addresses dizisinden United Statesde bulunan irketlerin adn nasl elde edeceinizi gsterir:
var usCompanies = from a in addresses where String.Equals(a.Country, United States) select a.CompanyName;

Veriyi sralamak iin, aadaki gibi orderby ilecini kullann:


var companyNames = from a in addresses orderby a.CompanyName select a.CompanyName;

group ilecini kullanarak veriyi gruplayabilirsiniz:


var companiesGroupedByCountry = from a in addresses group a by a.Country;

Veriyi nasl gruplayacanz gsteren nceki rnekte olduu gibi, select ileci salamadan, nceki rnekteki kodun aynsn kullanarak sonular zerinden yineleme yapabilirsiniz:
foreach (var companiesPerCountry in companiesGroupedByCountry) { Console.WriteLine(Country: {0}\t{1} companies, companiesPerCountry.Key, companiesPerCountry.Count()); foreach (var companies in companiesPerCountry) { Console.WriteLine(\t{0}, companies.CompanyName); } }

Bir numaralandrlabilir koleksiyon tarafndan dndrlen koleksiyon zerinde, Count gibi hesaplama ilevlerini arabilirsiniz:
int numberOfCompanies = (from a in addresses select a.CompanyName).Count();

Deyimin parantezler iinde yazldna dikkat edin. Kopya olan deerleri ihmal etmek isterseniz, aadaki gibi, Distinct yntemini kullann:
int numberOfCountries = (from a in addresses select a.Country).Distinct().Count();

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

383

pucu Birok durumda, koleksiyondaki tm satrlar boyunca bir alandaki deerlerin says yerine
sadece koleksiyondaki satr saysn saymak isteyebilirsiniz. Bu durumda, orijinal koleksiyon zerinde dorudan Count yntemini arabilirsiniz:

int numberOfCompanies = addresses.Count();

Ortak bir anahtarda iki koleksiyonu birletirmek iin join ilecini kullanabilirsiniz. Aadaki rnek, bu defa baka ekilde yazlm join ileci kullanarak, her koleksiyondaki CompanyName stunu zerindeki adresler ve mterileri dndren sorguyu gsterir. ki koleksiyonun ilikisini belirlemek iin equals ileci ile on yan tmceciini kullanrsnz.
var citiesAndCustomers = from a in addresses join c in customers on a.CompanyName equals c.CompanyName select new { c.FirstName, c.LastName, a.Country };

Not SQLin tersine, bir LINQ deyiminin on yan tmceciindeki deyimlerin sras nemlidir. Birletirdiiniz eyi (from yan tmcesindeki koleksiyon verisine bavuran) equals ilecinin soluna, birleecei eyi de ( join yan tmcesindeki koleksiyon verisine bavuran) sana yerletirmeniz gerekir. LINQ, veri zerinde arama yapmak, veriyi gruplamak, veriyi birletirmek ve zet bilgi elde etmek iin ok sayda baka yntemler de salar. Bu blmde sadece en yaygn zellikler ele alnmtr. rnein, LINO, genilik atama (setwide) ilemlerini gerekletirmek iin kullanabileceiniz, Intersect ve Union yntemleri salar. Ayrca, koleksiyonda en az bir enin ya da her enin belirlenen koula uyup uymayacan belirlemek iin kullanabileceiniz Any ve All gibi yntemleri salar. Take ve Skip yntemleri kullanarak numaralandrlabilir koleksiyondaki deerleri ayrabilirsiniz. Daha fazla bilgi iin, Visual Studio 2008 tarafndan salanan belgelere bakn.

Tree<TItem> Nesnelerinde Veri Sorgulamak


Bu blmde imdiye kadar grdnz rnekler, bir dizideki veriyi nasl sorgulayacanz gstermitir. IEnumerable arabirimini uygulayan herhangi bir koleksiyon snf iin tam olarak ayn teknii kullanabilirsiniz. Aadaki altrmada, bir irketin alanlarn modellemek iin yeni bir snf tanmlayacaksnz. Employee nesnelerinin bir koleksiyonunu ieren bir BinaryTree nesnesi yaratacak ve daha sonra bu bilgiyi sorgulamak iin LINQ kullanacaksnz. Balang olarak LINQ geniletme yntemlerini dorudan kullanacaksnz fakat daha sonra sorgu ilelerini kullanmak iin kodunuzu dzenleyeceksiniz.

384

Ksm III

Bileenler Yaratmak

Geniletilmi yntemleri kullanarak Binary Treeden veri elde edin


1. Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 20\ QueryBinaryTree klasrnde yer alan QueryBinaryTree zmn an. Proje, nceki altrmalarda grdnz Main ve Entrance yntemleri ile Program snfn tanmlayan Program.cs dosyasn ierir. 3. Solution Explorerda, QueryBinaryTree projesini farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Class tklayn. Add New ItemQuery BinaryTree iletiim kutusunda, Name blmne Employee.cs yazn ve daha sonra Addi tklayn. 4. Employee snfna, aada koyu harfle gsterilen otomatik zellikleri ekleyin:
class Employee { public string public string public string public int Id }

FirstName { get; set; } LastName { get; set; } Department { get; set; } { get; set; }

5. Employee snfna, aada koyu harfle gsterilen ToString yntemini ekleyin. .NET Frameworkdeki snflar, Console.WriteLine ifadesini kullanarak nesneyi grntledii gibi, bu yntemi kullanarak bir nesneyi dize gsterimine evirir.
class Employee { ... public override string ToString() { return String.Format(Id: {0}, Name: {1} {2}, Dept: {3}, this.Id, this.FirstName, this.LastName, this.Department); } }

6. Aada gsterildii gibi, IComparable<Employee> arabirimini uygulamak iin Employee.cs dosyasndaki Employee snf tanmn dzenleyin:
class Employee : IComparable<Employee> { }

BinaryTree snf, elerini karlatrlabilir olmak zorunda olarak belirlediinden bu basamak gereklidir. 7. Snf tanmndaki IComparable<Employee> arabirimini farenin sa dmesiyle tklayn, Implement Interfacei iaret edin ve daha sonra Implement Interface Explicitlyi tklayn.

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

385

Bu eylem, CompareTo ynteminin varsaylan uygulamasn oluturur. BinaryTree snfnn, aaca eleri eklerken, eleri karlatrmas gerektiinde bu yntemi ardn hatrlayn. 8. CompareTo ynteminin gvdesini, aada koyu harflerle gsterilen kod ile deitirin. CompareTo ynteminin bu uygulamas, Id alannn deerine dayal Employee nesnelerini karlatrr.
int IComparable<Employee>.CompareTo(Employee other) { if (other == null) return 1; if (this.Id > other.Id) return 1; if (this.Id < other.Id) return -1; return 0; }

Not IComparable arabiriminin tanm iin Blm 18e bavurun. 9. Solution Explorerda, QueryBinaryTree zmn farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Existing Projecti tklayn. Add Existing Project iletiim kutusunda, Belgeler klasrnzdeki Microsoft Press\Visual CSharp Step By Step\Chapter 20\BinaryTree klasrne gidin, BinaryTree projesini tklayn ve daha sonra Open tklayn. BinaryTree projesi, Blm 19da gerekletirdiiniz numaralandrlabilir BinaryTree snfnn bir kopyasn ierir. 10. Solution Explorerda, QueryBinaryTree projesini farenin sa dmesiyle tklayn ve sonra Add Reference tklayn. Add Reference iletiim kutusunda, Projects sekmesini tklayn, BinaryTree projesini sein ve daha sonra OKi tklayn. 11. Solution Explorerda, Program.cs dosyasn an ve dosyann en stndeki using ifadeleri listesinin aadaki kod satrn ierdiini dorulayn:
using System.Linq;

12. BinaryTree ad alann kapsama almak iin, Program.cs dosyasnn en stndeki listeye aadaki using ifadesini ekleyin:
using BinaryTree;

386

Ksm III

Bileenler Yaratmak

13. BinaryTree snfnn bir rneini kurmak ve doldurmak iin, Program snfndaki Entrance yntemine aada koyu harfle gsterilen ifadeleri yazn:
static void Entrance() { Tree<Employee> empTree = new Tree<Employee>(new Employee { Id = 1, FirstName = Janet, LastName = Gates, Department = IT}); empTree.Insert(new Employee { Id = 2, FirstName = Orlando, LastName = Gee, Department = Marketing}); empTree.Insert(new Employee { Id = 4, FirstName = Keith, LastName = Harris, Department = IT }); empTree.Insert(new Employee { Id = 6, FirstName = Lucy, LastName = Harrington, Department = Sales }); empTree.Insert(new Employee { Id = 3, FirstName = Eric, LastName = Lang, Department = Sales }); empTree.Insert(new Employee { Id = 5, FirstName = David, LastName = Liu, Department = Marketing }); }

14. Entrance ynteminin sonuna aadaki ifadeleri yazn. Bu kod, ikili aata bulunan blmleri listelemek iin Select yntemini kullanr.
static void Entrance() { ... Console.WriteLine(List of departments); var depts = empTree.Select(d => d.Department); foreach (var dept in depts) Console.WriteLine(Department: {0}, dept); }

15. Debug mensnde, Start Without Debuggingi tklayn. Uygulama aadaki listenin ktsn vermelidir.
List of departments Department: IT Department: Marketing Department: Sales Department: IT Department: Marketing Department: Sales

Her blmde iki alan olduundan, her blm iki defa yer almaktadr. Blmlerin sras, Employee snfnn veriyi sralamak iin her alann Id zelliini kullanan CompareTo yntemi tarafndan belirlenir. lk blm, Id deeri 1 olan alan iin, ikinci blm Id deeri 2 olan alan iindir ve byle devam eder. 16. Visual Studio 2008e dnmek iin Enter tuuna basn.

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

387

17. Blmlerin numaralandrlabilir koleksiyonunu oluturan ifadeyi aadaki gibi deitirin:


var depts = empTree.Select(d => d.Department).Distinct();

Distinct yntemi, numaralandrlabilir koleksiyondan, ifte satrlar kaldrr. 18. Debug mensnde, Start Without Debuggingi tklayn. Her blmn sadece bir defa grntlendiini dorulayn:
List of departments Department: IT Department: Marketing Department: Sales

19. Visual Studio 2008e dnmek iin Enter tuuna basn. 20. Entrance ynteminin sonuna aadaki ifadeleri ekleyin. Bu kod blou, alanlar filtrelemek iin Where yntemini kullanr ve sadece IT blm alanlarn dndrr. Select yntemi, belirli stunlar yerine tm satr dndrr.
Console.WriteLine(\nEmployees in the IT department); var ITEmployees = empTree.Where(e => String.Equals(e.Department, IT)).Select(emp => emp); foreach (var emp in ITEmployees) Console.WriteLine(emp);

21. Aadaki kodu, Entrance ynteminin sonuna, nceki basamaktan sonrasna ekleyin. Bu kod, ikili aata bulunan alanlar blmlerine gre gruplandrmak iin GroupBy yntemini kullanr. Dtaki foreach ifadesi her grup zerinde yinelenir, blm adn grntler. teki foreach ifadesi, her blmdeki alanlarn adn grntler.
Console.WriteLine(\nAll employees grouped by department); var employeesByDept = empTree.GroupBy(e => e.Department); foreach (var dept in employeesByDept) { Console.WriteLine(Department: {0}, dept.Key); foreach (var emp in dept) { Console.WriteLine(\t{0} {1}, emp.FirstName, emp.LastName); } }

388

Ksm III

Bileenler Yaratmak

22. Debug mensnde, Start Without Debuggingi tklayn. Uygulamann sonucunun aadaki gibi olduunu dorulayn:
List of departments Department: IT Department: Marketing Department: Sales Employees in the IT department Id: 1, Name: Janet Gates, Dept: IT Id: 4, Name: Keith Harris, Dept: IT All employees grouped by department Department: IT Janet Gates Keith Harris Department: Marketing Orlando Gee David Liu Department: Sales Eric Lang Lucy Harrington

23. Visual Studio 2008e dnmek iin Enter tuuna basn.

Sorgu ilelerini kullanarak BinaryTreeden veri elde edin


1. Entrance ynteminde, blmlerin numaralandrlabilir koleksiyonunu oluturan ifadeyi aklama satrna evirin ve yerine aadaki from ve select sorgu ilelerini ieren ifadeleri yazn:
//var depts = empTree.Select(d => d.Department).Distinct(); var depts = (from d in empTree select d.Department).Distinct();

2. IT blmndeki alanlarn numaralandrlabilir koleksiyonunu reten ifadeyi aklama satrna dntrn ve yerine aada koyu harflerle gsterilen kodu yazn:
//var ITEmployees = // empTree.Where(e => String.Equals(e.Department, IT)).Select(emp => emp); var ITEmployees = from e in empTree where String.Equals(e.Department, IT) select e;

3. alanlar blmne gre gruplandran numaralandrlabilir koleksiyonu oluturan ifadeyi aklama satrna evirin ve yerine aadaki ifadeyi yazn:
//var employeesByDept = empTree.GroupBy(e => e.Department); var employeesByDept = from e in empTree group e by e.Department;

4. Debug mensnde, Start Without Debuggingi tklayn. Uygulama sonucunun daha nceki ile ayn olduunu dorulayn. 5. Visual Studio 2008e dnmek iin Enter tuuna basn.

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

389

LINQ ve Ertelenmi Deerlendirme


LINQ kullandnzda, ister LINQ geniletilmi yntemleri kullanarak ister sorgu ilelerini kullanarak numaralandrlabilir bir koleksiyon tanmladnzda, LINQ geniletilmi yntem alt srada uygulamann gerekten koleksiyonu oluturmadn unutmamalsnz; koleksiyon sadece koleksiyon zerinde yineleme yaptnzda numaralandrlr. Bunun anlam udur: Orijinal koleksiyondaki veri bir LINQ sorgusunu altrmak ve sorgunun tanmlad veriyi bulmak arasndaki srede deiebilir; her zaman en gncel veriyi alrsnz. rnein, aadaki sorgu, U.S irketlerinin bir numaralandrlabilir koleksiyonunu tanmlar:
var usCompanies = from a in addresses where String.Equals(a.Country, United States) select a.CompanyName;

addresses dizisindeki veri geri alnmaz ve Where filtresinde belirtilen durumlar, usCompanies koleksiyonu zerinden siz yineleme yapana kadar deerlendirilmez:
foreach (string name in usCompanies) { Console.WriteLine(name); }

usCompanies koleksiyonunu tanmlama ile koleksiyon zerinde yineleme arasnda addresses dizisindeki veriyi deitirirseniz (rnein, United Statesde bulunan yeni bir irket eklerseniz), bu yeni veriyi de grrsnz. Bu strateji, deferred evaluation (ertelenmi deerlendirme) olarak adlandrlr. LINQ sorgusunun deerlendirilmesini zorlayarak statik, n bellee alnm koleksiyonu retebilirsiniz. Bu koleksiyon, orijinal verinin bir kopyasdr ve koleksiyondaki veri deise de deimez. LINQ, verinin n bellee alnm bir kopyasn ieren bir statik List nesnesi oluturmak iin ToList yntemini salar. Bu yntemi u ekilde kullanrsnz:
var usCompanies = from a in addresses.ToList() where String.Equals(a.Country, United States) select a.CompanyName;

Bu defa, sorgu tanmladnzda irketlerin listesi sabitlenir. addresses dizisine daha fazla U.S. irketi eklerseniz, usCompanies koleksiyon zerinde yineleme yaptnzda eklediiniz irketleri gremezsiniz. LINQ ayrca, n bellee alnan koleksiyonu dizi olarak saklamak iin ToArray yntemini salar. Bu blmdeki son altrmada, n bellee alnm bir koleksiyon retmek ile LINQ sorgusunun gecikmeli deerlendirmesini kullanmann etkilerini karlatracaksnz.

LINQ sorgusunun ertelenmi ve n bellee alnm deerlendirmesinin etkilerini inceleyin


1. Visual Studio 2008e dnn, QueryBinaryTree projesini grntleyin ve Program.cs dosyasn dzenleyin.

390

Ksm III

Bileenler Yaratmak

2. Aada gsterildii gibi, Entrance ynteminin ieriini, empTree ikili aac oluturan ifadeden ayr olarak, aklama satrna dntrn:
static void Entrance() { Tree<Employee> empTree = new Tree<Employee>(new Employee { Id = 1, FirstName = Janet, LastName = Gates, Department = IT }); empTree.Insert(new Employee { Id = 2, FirstName = Orlando, LastName = Gee, Department = Marketing }); empTree.Insert(new Employee { Id = 4, FirstName = Keith, LastName = Harris, Department = IT }); empTree.Insert(new Employee { Id = 6, FirstName = Lucy, LastName = Harrington, Department = Sales }); empTree.Insert(new Employee { Id = 3, FirstName = Eric, LastName = Lang, Department = Sales }); empTree.Insert(new Employee { Id = 5, FirstName = David, LastName = Liu, Department = Marketing }); // comment out the rest of the method ... }

pucu Code and Text Editor penceresinde tm kod blounu seerek ve daha sonra ara

ubuu zerindeki Comment Out The Selected Lines dmesini tklayarak ya da Ctrl+E ve arkasndan da Cye basarak, kod blounu aklama satrna dntrebilirsiniz.

3. empTree ikili aacn oluturduktan sonra, Entrance yntemine aadaki ifadeleri ekleyin:
Console.WriteLine(All employees); var allEmployees = from e in empTree select e; foreach (var emp in allEmployees) Console.WriteLine(emp);

Bu kod, allEmployees adnda alanlarn numaralandrlabilir bir koleksiyonunu retir ve daha sonra bu koleksiyon zerinden yineleyerek her alann ayrntlarn grntler. 4. Bir nceki basamakta yazdnz ifadelerden hemen sonrasna aadaki kodu ekleyin:
empTree.Insert(new Employee { Id = 7, FirstName = Donald, LastName = Blanton, Department = IT }); Console.WriteLine(\nEmployee added); Console.WriteLine(All employees); foreach (var emp in allEmployees) Console.WriteLine(emp);

Bu ifadeler, empTree aacna yeni bir alan ekler ve daha sonra allEmployees koleksiyonu zerinden yeniden tekrarlar.

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

391

5. Debug mensnde, Start Without Debuggingi tklayn. Uygulamann ktsnn aadaki gibi olduunu dorulayn:
All Id: Id: Id: Id: Id: Id: employees 1, Name: Janet Gates, Dept: IT 2, Name: Orlando Gee, Dept: Marketing 3, Name: Eric Lang, Dept: Sales 4, Name: Keith Harris, Dept: IT 5, Name: David Liu, Dept: Marketing 6, Name: Lucy Harrington, Dept: Sales

Employee added All employees Id: 1, Name: Janet Gates, Dept: IT Id: 2, Name: Orlando Gee, Dept: Marketing Id: 3, Name: Eric Lang, Dept: Sales Id: 4, Name: Keith Harris, Dept: IT Id: 5, Name: David Liu, Dept: Marketing Id: 6, Name: Lucy Harrington, Dept: Sales Id: 7, Name: Donald Blanton, Dept: IT

Uygulamann allEmployees koleksiyonu zerinde ikinci yinelemesinde, grntlenen listenin, allEmployees koleksiyonu tanmlandktan sonra eklenmi olsa da, Donald Blanton adn kapsadna dikkat edin. 6. Visual Studio 2008e dnmek iin Enter tuuna basn. 7. Entrance ynteminde, veriyi tanmlamak ve hemen n bellee almak iin allEmployees koleksiyonunu reten ifadeyi aadaki gibi deitirin:
var allEmployees = from e in empTree.ToList<Employee>( ) select e;

LINQ, ToList ve ToArray yntemlerinin generic ve generic olmayan srmlerini salar. Sonucun tr gvenliinden emin olmak iin bu yntemlerin mmknse generic biimlerini kullanmak en iyisidir. select ileci tarafndan dndrlen veri bir Employee nesnesidir ve bu aamada gsterilen kod, allEmployees generic List<Employee> koleksiyon olarak retir. Generic olmayan ToList yntemini belirlerseniz, allEmployees koleksiyonu, object trlerinin bir List i olur. 8. Debug mensnde Start Without Debuggingi tklayn. Uygulama ktsnn aadaki gibi olduunu dorulayn:
All Id: Id: Id: Id: Id: Id: employees 1, Name: Janet Gates, Dept: IT 2, Name: Orlando Gee, Dept: Marketing 3, Name: Eric Lang, Dept: Sales 4, Name: Keith Harris, Dept: IT 5, Name: David Liu, Dept: Marketing 6, Name: Lucy Harrington, Dept: Sales

Employee added All employees

392

Ksm III
Id: Id: Id: Id: Id: Id:

Bileenler Yaratmak
1, 2, 3, 4, 5, 6, Name: Name: Name: Name: Name: Name: Janet Gates, Dept: IT Orlando Gee, Dept: Marketing Eric Lang, Dept: Sales Keith Harris, Dept: IT David Liu, Dept: Marketing Lucy Harrington, Dept: Sales

Bu defa, uygulamann allEmployees koleksiyonu zerinde ikinci yinelemesinde, grntlenen listenin Donald Blanton adn kapsamadna dikkat edin. Bunun nedeni, sorgunun Donald Blanton ad empTree ikili aacna eklenmeden nce deerlendirilmesi ve sonularn n bellee alnmasdr. 9. Visual Studio 2008e dnmek iin Enter tuuna basn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 21e gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 20 Hzl Bavuru


Bunun in
Numaralandrlabilir koleksiyondan belirlenen alanlar planlamak

unu Yapn
Select yntemini kullann ve alanlar tanmlayan bir lambda deyimi belirleyin. rnein:
var customerFirstNames = customers.Select(cust => cust.FirstName);

Ya da from ve select sorgu ilelerini kullann. rnein:


var customerFirstNames = from cust in customers select cust.FirstName;

Numaralandrlabilir koleksiyondan satrlar filtrelemek

Where yntemini kullann ve satrlarn elemesi gereken lt ieren bir lambda deyimi belirleyin. rnein:
var usCompanies = addresses.Where(addr => String.Equals(addr.Country, United States)). Select(usComp => usComp.CompanyName);

Ya da where sorgu ilecini kullann. rnein:


var usCompanies = from a in addresses where String.Equals(a.Country, United States) select a.CompanyName;

Blm 20

Sorgu Deyimlerini Kullanarak Bellekteki Veriyi Sorgulamak

393

Veriyi belirli bir srada numaralandrmak

OrderBy yntemini kullann ve satrlar sralamak iin alan tanmlayan bir lambda deyimi belirleyin. rnein:
var companyNames = addresses.OrderBy(addr => addr.CompanyName). Select(comp => comp.CompanyName);

Ya da orderby sorgu ileci kullann. rnein:


var companyNames = from a in addresses orderby a.CompanyName select a.CompanyName;

Bir alandaki deerlere gre veriyi gruplamak

GroupBy yntemini kullann ve satrlar gruplamak iin kullanlacak alan tanmlayan bir lambda deyimi belirleyin. rnein:
var companiesGroupedByCountry = addresses.GroupBy(addrs => addrs.Country);

Ya da group by sorgu ilecini kullann. rnein:


var companiesGroupedByCountry = from a in addresses group a by a.Country;

ki farkl koleksiyonda tutulan veriyi birletirmek

Birleecek koleksiyonu, birleme kriterini ve sonu iin alanlar belirleyen Join yntemini kullann. rnein:
var citiesAndCustomers = customers. Select(c => new { c.FirstName, c.LastName, c.CompanyName }). Join(addresses, custs => custs.CompanyName, addrs => addrs.CompanyName, (custs, addrs) => new {custs.FirstName, custs.LastName, addrs.Country });

Ya da join sorgu ilecini kullann. rnein:


var citiesAndCustomers = from a in addresses join c in customers on a.CompanyName equals c.CompanyName select new { c.FirstName, c.LastName, a.Country };

Bir LINQ sorgusu iin sonularn hemen retilmesini salamak.

Sonular ieren bir liste ya da dizi oluturmak iin ToList ya da ToArray yntemini kullann. rnein:
var allEmployees = from e in empTree.ToList<Employee>() select e;

Blm 21

le Ar Yklemesi
Bu blm tamamladktan sonra renecekleriniz:
n n n n n n

Kendi trleriniz iin ikili ileler gelitirmek. Kendi trleriniz iin tekil ileler gelitirmek. Kendi trleriniz iin artrma ve azaltma ileleri yazmak. Baz ileleri iftler halinde gelitirme gerekliliini anlamak. Kendi trleriniz zerinde rtl dntrme ileleri gelitirmek. Kendi trleriniz zerinde ak dntrme ileleri gelitirmek.

(int ve double gibi) trler zerinde (toplama ve karma gibi) standart ilemleri gerekletirmek iin standart ile simgelerini (+ ve - gibi) kullanmada nemli bir aama kaydettiniz. Yerleik saysal trlerin birou her ile iin nceden tanmlanm davranlar ile birlikte gelir. Kendi yap ve snflarnz iin de ileler tanmlayabilirsiniz; bu blmn konusu budur.

leleri Anlamak
leleri, ilenenleri deyimler iinde toplamak iin kullanrsnz. Her ilecin, birlikte alt tre bal olarak kendi anlam vardr. rnein, + ileci saysal trlerle kullanldnda ekle anlamna gelirken dizilerle kullanldnda birletir anlamna gelir. Her ile simgesinin ncelii vardr. rnein, * ileci + ilecinden daha nceliklidir. Bunun anlam, a + b * c nin a + (b * c) ile ayn olduudur. Her ilecin ayrca, ilecin soldan saa m, sadan sola m gerekleeceini belirleyen birleim zellii vardr. rnein, = ileci sa birleiktir (sadan sola gerekleir) bu yzden a = b = c ile a = (b = c) ayn eydir. Bir unary (tekli) ile tek ileneni olan iletir. rnein, artrm ileci (++) bir tekil iletir. Bir binary (ikili) ile iki ileneni olan iletir. rnein, arpm ileci (*) ikili bir iletir.

395

396

Ksm III

Bileenler Yaratmak

le Kstlamalar
C#n, kendi trlerinizi tanmlarken, yntemleri ar yklemenize imkan saladn grmtnz. C# ayrca, szdizimi olduka farkl olmasna ramen, var olan ile simgelerinden birounu ar yklemenize izin verir. Bunu yaptnzda kullandnz ileler, aadaki kurallarla ok iyi tanmlanm bir ana atya otomatik olarak dahil olurlar:
n

Bir ilecin ncelik ve birleim zelliklerini deitiremezsiniz. ncelik ve birleim zellikleri ile simgesinin zerinde kullanlaca tr deil (rnein int) ile simgesini temel alr (rnein +). Bu yzden, a + b * c, ifadesi her zaman a, b ve cnin trnden bamsz olarak a + (b * c) ile ayn eydir. Bir ilecin oklu ilenenlerle kullanm zelliini (ilenen says) deitiremezsiniz. rnein, arpm (x) simgesi ikili bir iletir. Kendi trnz iin bir * ileci bildirirseniz bu bir ikili ile olmaldr. Yeni ile simgeleri retemezsiniz. rnein, bir sayy baka bir saynn kuvveti yapmak iin yeni bir simge (** gibi) yaratamazsnz. Bunun iin bir yntem yaratmanz gerekir. Yerleik trler uygulandnda ilelerin anlamlarn deitiremezsiniz. rnein, 1 + 2 deyiminin nceden tanml bir anlam vardr ve bu anlam geersiz klamazsnz. Bunu yapabilseydiniz iler ok karmaklard. Ar ykleme yapamayacanz baz ile simgeleri vardr. rnein, snf yesine eriimi gsteren nokta ilecini (.) ar ykleyemezsiniz. Bunu yapabilseydiniz de gereksiz birok karmaklk olurdu.

pucu [] imini ile olarak taklit etmek iin dizinleyiciler kullanabilirsiniz. Benzer biimde, atama

(=) imini ile olarak taklit etmek iin zellikleri, bir ilevi ile olarak taklit etmek iinse temsilcileri kullanabilirsiniz.

Ar Yklenmi leler
Kendi ile davranlarnz tanmlamak iin, belirli bir ileci ar yklemelisiniz. Bir dn tr ve parametreler ieren yntem benzeri bir szdizimi kullanrsnz, ama yntemin ad operator anahtar szc ile birlikte bildiriyor olduunuz ilecin simgesi olmaldr. rnein, aada, Hourun iki rneini toplamak iin + ikili ileci tanmlayan kullanc tanml bir Hour yaps grebilirsiniz:
struct Hour { public Hour(int initialValue) { this.value = initialValue; }

Blm 21
public static Hour operator+ (Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); } ... private int value; }

le Ar Yklemesi

397

Aadaki noktalara dikkat edin:


n n

le geneldir. Btn ileler genel olmaldr. le statiktir. Btn ileler statik olmaldr. leler asla ok biimli olamaz ve virtual, abstract, override ya da sealed niteleyiciler kullanamazlar. Bir ikili ilecin (yukarda gsterilen + gibi) iki ak bamsz deikeni ve bir tekil ilecin de bir tane ak bamsz deikeni vardr (C++ ile program gelitirenler, ilelerin hibir zaman gizli bir this parametrelerinin olmadna dikkat etmelidirler).

pucu yi biimlendirilmi ilevsellik (ileler gibi) bildirirken parametreler iin bir adlandrma

standard belirlemek ok yararldr. rnein, ikili ileler iin (left-hand side (sol taraf) ve righthand side (sa taraf) anlamnda) lhs ve rhs kullanabilirsiniz.

+ ilecini Hour trnde iki deyim zerinde kullandnzda C# derleyicisi kodunuzu otomatik olarak kullanc tanml ilece yaplan bir arya dntrr. Dier bir deyile, C# derleyicisi aadaki kodu:
Hour Example(Hour a, Hour b) { return a + b; }

una dntrr:
Hour Example(Hour a, Hour b) { return Hour.operator+(a,b); // yalanc kod }

Ancak, bu szdiziminin geerli C# dili olmadna, bir yalanc kod olduuna dikkat edin. Bir ikili ileci yalnzca kendi i yazm sistemiyle kullanabilirsiniz (ilenenler arasnda simge olacak biimde). Bir ile bildirirken uymazsanz kodunuzun derlenmeyecei son bir kural daha vardr: Parametrelerden en az birinin ieren tr olmas gerekir. Yukarda gsterilen Hour snfnn operator+ rneinde parametrelerden biri (a ya da b) bir Hour nesnesi olmaldr. Bu rnekte, her iki parametre de Hour nesnesidir. Ancak, bir tamsayy (saat miktarn) bir Hour nesnesine

398

Ksm III

Bileenler Yaratmak

ekleyen operator+ ilecinin baz ek uygulamalarn tanmlamanz gereken zamanlar olabilir (ilk parametre Hour, ikinci parametre tamsay olabilir). Bu kural derleyiciye, bir ile arsn zmlerken nereye bakaca konusunda yardmc olur ve ayrca yerleik ilecin anlamn deitirmenize de engel olur.

Simetrik leler Yaratmak


Bir nceki blmde, Hour nesnesinin iki rneini toplamak iin bir + ikili ilecinin nasl bildirileceini grdnz. Hour yapsnn bir intten bir Hour yaratan bir kurucusu vardr. Bunun anlam, bir int ile bir Houru toplayabileceinizdir; tek yapmanz gereken inti Houra dntrmek iin ilk nce Hour kurucusunu kullanmaktr. rnein:
Hour a = ...; int b = ...; Hour sum = a + new Hour(b);

Bu tamamen geerli bir kod, ama bir int ile bir Houru dorudan toplamak kadar ak ya da ksa deil, unun gibi:
Hour a = ...; int b = ...; Hour sum = a + b;

(a + b) deyimini geerli yapabilmek iin bir Hour (a, solda) ile bir inti (b, sada) toplamann ne demek olduunu bildirmelisiniz. Dier bir deyile, ilk parametresi Hour ve ikinci parametresi int olan bir + ikili ile bildirmelisiniz. Aadaki kod nerilen yaklam gstermektedir:
struct Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static Hour operator+ (Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); } public static Hour operator+ (Hour lhs, int rhs) { return lhs + new Hour(rhs); } ... private int value; }

Blm 21

le Ar Yklemesi

399

lecin ikinci srmnn tm yapt, int bamsz deikeninden bir Hour oluturmak ve ardndan ilk srm armaktr. Bu ekilde, ilecin arkasndaki gerek mantk tek bir yerde tutulur. Ama, ek operator+nn var olan ilevsellii kolay kullanlr hale getirmesidir. Ayrca, bu ilecin, hepsi farkl bir ikinci parametre ieren birok farkl srmn salamamanz gerektiine dikkat edin. Yalnzca yaygn ve anlaml durumlar karlayn ve farkl bir durum uygulamak gerekliyse snfn kullancsnn ek admlar atmasna izin verin. Bu operator+, sol ilenen olarak bir Hourun sa ilenen olan bir int ile nasl toplanacan bildirir. Sol ilenen olarak bir intin sa ilenen olarak bir Hour ile nasl toplanacan bildirmez:
int a = ...; Hour b = ...; Hour sum = a + b; // derleme zaman hatas

Bu biraz manta aykrdr. a+b yazabiliyorsanz b+a da yazabilmeyi beklersiniz. Bu yzden, operator+n ikinci bir ar yklemesini salamalsnz:
struct Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static Hour operator+ (Hour lhs, int rhs) { return lhs + new Hour(rhs); } public static Hour operator+ (int lhs, Hour rhs) { return new Hour(lhs) + rhs; } ... private int value; }

Not C++ ile program gelitirenler ar yklemeyi kendileri salamaldrlar. Derleyici onu sizin iin ar ykleme yazmayacak ya da eleen bir ile bulmak iin ilenenlerin yerlerini deitirmeyecektir.

leler ve Ortak Dil Belirtimleri


Kullanlan her dil, ortak dil alma zamann (CLR) desteklemez ya da ile ar yklemesini alglamaz. Microsoft Visual Basic balca rnektir. Dier dillerde de kullanabilmek istediiniz bir snf yaratyorsanz, bir ileci ar yklyorsanz, ayn

400

Ksm III

Bileenler Yaratmak

ilevsellii destekleyen alternatif bir teknik salamalsnz. rnein, Hour yaps iin operator+y uyguladnz varsayalm:
public static Hour operator+ (Hour lhs, int rhs) { ... }

Snfnz bir Visual Basic uygulamasnda da kullanabilmeniz gerekiyorsa, ayn sonucu veren bir Add yntemi de salamanz gerekir:
public static Hour Add(Hour lhs, int rhs) { ... }

Bileik Atamay Anlamak


Bir bileik atama ileci (+= gibi) her zaman ilgili ileci (+ gibi) gibi deerlendirilir. Dier bir deyile, u:
a += b;

otomatik olarak unun gibi deerlendirilir:


a = a + b;

Genel olarak, a @= b deyimi (burada @ imi herhangi geerli bir ile yerine kullanlmaktadr) her zaman a = a @ b eklinde deerlendirilecektir. Uygun basit ileci bildirdiyseniz, ilgili bileik atama ilecini ardnzda otomatik olarak arlr. rnein:
Hour a = ...; int b = ...; a += a; // a = a + a ile ayn a += b; // a = a + b ile ayn

lk bileik atama ileci (a += a) geerlidir; nk ann tr Hourdur ve Hour tr her iki parametresi de Hour olan bir ikili operator+ ileci bildirir. Benzer biimde, ikinci bileik atama ileci (a += b) de geerlidir nk ann tr Hourdur ve bnin tr inttir. Hour tr, ilk parametresi Hour ikinci parametresi int olan bir ikili operator+ ileci daha bildirir. Ancak, b+= a yazamayacanza dikkat edin, nk bu b = b + a ile ayndr. Toplama geerli olsa da atama geersizdir, nk yerleik int trne bir Hour atamann yolu yoktur.

Blm 21

le Ar Yklemesi

401

Artrma ve Azaltma leleri Bildirmek


C# kendi artrma (++) ve azaltma (--) ilelerinizi bildirmenize izin verir. Bu ileleri bildirirken de standart kurallar geerlidir; genel (public), statik (static) ve tekil olmaldrlar. rnein, aada Hour yaps iin artrma ilecini grebilirsiniz:
struct Hour { ... public static Hour operator++ (Hour arg) { arg.value++; return arg; } ... private int value; }

Artrma ve azaltma ileleri, nek ya da sonek biiminde yazlabilmeleri dolaysyla benzersizdirler. C#, zekice, her iki nek ve sonek biimleri iin de ayn ileci kullanr. Sonekli bir deyimin sonucu, ilenenin deyim gereklemeden nceki deeridir. Dier bir deyile, derleyici unu:
Hour now = new Hour(9); Hour postfix = now++;

etkili bir biimde una dntrr:


Hour now = new Hour(9); Hour postfix = now; now = Hour.operator++(now); // yalanc kod C#ta geerli deil

nekli bir deyimin sonucu ise ilecin dn deeridir. C# derleyici unu:


Hour now = new Hour(9); Hour prefix = ++now;

etkili bir biimde una dntrr:


Hour now = new Hour(9); now = Hour.operator++(now); // yalanc kod C#ta geerli deil Hour prefix = now;

Bu denkliin anlam, artrma ve azaltma ilelerinin dn trlerinin parametre trleriyle ayn olmas gerektiidir.

402

Ksm III

Bileenler Yaratmak

Yap ve Snflardaki leler


Hour yapsndaki artrma ileci uygulamasnn almasnn tek nedeninin Hourun bir yap olmasndan kaynaklandn anlamak nemlidir. Houru snfa dntrp artrma ilecinin uygulamasn deitirmeden brakrsanz sonek evirisinin doru yant vermediini grrsnz. Bir snfn bir bavuru tr olduunu anmsarsanz ve daha nce aklanan derleyici evirilerine yeniden bakarsanz bunun neden olutuunu grebilirsiniz:
Hour now = new Hour(9); Hour postfix = now; now = Hour.operator++(now); // yalanc kod C#ta geerli deil

Hour bir snfsa, atama ifadesi postfix = now imdi postfix (sonek) deikeninin now ile ayn nesneye bavurmasn salar. nowu otomatik olarak gncelletirmek postfixi de gncelletirir! Hour bir yapysa, atama ifadesi postfixte nowun bir kopyasn oluturur ve now da yaplacak deiiklikler postfixi deimeden brakr ki bizim de istediimiz budur. Hour bir snfken artrma ilecinin doru uygulamas aadaki gibidir:
class Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static Hour operator++(Hour arg) { return new Hour(arg.value + 1); } ... private int value; }

operator++n imdi orijinal veriye bal olarak, yeni bir nesne yarattna dikkat edin. Yeni nesnedeki veri artrlr ancak zgndeki veri deitirilmeden kalr. Bu alsa da artrma ilecinin derleyici evirisinin her kullannda yeni bir nesnenin yaratlmasyla sonulanr. Bu bellek kullanm ve p toplama maliyeti asndan pahal olabilir. Dolaysyla, snflar tanmlarken ile ar yklemelerini snrlandrmanz nerilir. Bu neri sadece artrma ileci iin deil, tm ileler iindir.

Blm 21

le Ar Yklemesi

403

le iftleri Tanmlamak
Baz ileler doal olarak iftler halinde gelir. rnein, iki Hour deerini != ileci kullanarak karlatrabiliyorsanz, iki Hour deerini == ilecini kullanarak da karlatrabilmeyi beklersiniz. C# derleyicisi, operator== ilecini ya da operator!= ilecini tanmlarsanz her ikisini de tanmlamanz isteyerek bu dncenizi destekler. Bu ya hep ya hi kural ayrca <, > ve <=, >= ileleri iin de geerlidir. C# derleyicisi bu ilelerin hibirini sizin yerinize yazmaz. Onlar, ne kadar aka grnseler de, kendiniz aka yazmalsnz. Aada Hour yaps zerindeki == ve != ilelerini grebilirsiniz:
struct Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static bool operator==(Hour lhs, Hour rhs) { return lhs.value == rhs.value; } public static bool operator!=(Hour lhs, Hour rhs) { return lhs.value != rhs.value; } ... private int value; }

Bu ilelerden dn tr Boolean olmak zorunda deildir. Ancak baka bir tr kullanmak iin iyi bir nedeniniz olmaldr, yoksa bu ileler kafa kartrc olabilir. Not operator== ve operator!= i tanmlarsanz System.Objectten kaltmla alnan Equals ve

GetHashCode yntemlerini de geersiz klmanz gerekir. Equals yntemi operator== yntemiyle tam olarak ayn davran gstermelidir (birini dieri ile tanmlamak). GetHashCode yntemi Microsoft .NET Frameworkteki dier snflar tarafndan kullanlr. (rnein, bir nesneyi bir hash tablosundaki bir anahtar olarak kullandnzda bir hash deer hesaplamaya yardmc olmak iin GetHashCode yntemi nesne zerinde arlr. Ayrntl bilgi iin Visual Studio 2008 ile verilen .NET Framework Reference belgelerine bakn). Bu yntemin tm yapmas gereken ayrt edici bir tamsay deer dndrmektir (Ancak, hash algoritmalarn etkisini azaltacandan tm nesnelerinizin GetHashCode yntemindeki ayn tamsayy dndrmeyin).

404

Ksm III

Bileenler Yaratmak

Bir le Uygulamak
Aadaki altrmada baka bir Microsoft Windows dijital saat uygulamasn tamamlayacaksnz. Kodun bu biimi, Blm 17deki altrmaya benzer. Ancak, bu biiminde, olay balatldnda delegate yntemi (her saniye arlan yntem) o anki hour (saat), minute (dakika) ve second (saniye) deerlerini almaz. Bunun yerine delegate yntemi, her biri hour, minute ve second deerleri iin olan alan gncelletirerek zaman kendisi tutar. Bu alann trleri srasyla Hour, Minute ve Seconddr ve tm yapdr. Ancak, uygulama henz oluturulamaz nk Minute yaps henz tamamlanmamtr. lk altrmada, eksik toplama ilelerini uygulayarak Minute yapsn tamamlayacaksnz.

operator+ ar yklemelerini yazn


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step by Step\Chapter 21\ Operators klasrnde yer alan Operators projesini an. 3. Code and Text Editor penceresinde, Clock.cs dosyasn an ve snfn sonundaki hour, minute ve second alanlarnn bildirimlerini bulun. Bu alanlar o anki saati gsterir:
class Clock { ... private Hour hour; private Minute minute; private Second second; }

4. Clock snfnn tock yntemini bulun. Hour, minute ve second deikenlerini gncelletirmek iin bu yntem her saniye arlr. tock yntemi aadaki gibi grnr:
private void tock() { this.second++; if (this.second == 0) { this.minute++; if (this.minute == 0) { this.hour++; } } }

Blm 21

le Ar Yklemesi

405

Clock snfnn kurucular aadaki ifadeyi ierir. Bu ifade, pulsed alannn tick olay gerekletiinde bu yntemin arlmasn salar (pulsed alan her saniyede bir olay oluturmak iin DispatcherTimer nesnesini kullanan bir Tickerdr. Bu konu Blm 17de aklanmtr).
this.pulsed.tick += tock;

5. Build mensnde Build Solution tklayn. Oluum hata verir ve aadaki hata iletisini grntler:
Operator == cannot be applied to operands of type Operators.Minute and int.

Sorun, tock ynteminin aadaki if ifadesini iermesi ama uygun operator==un Minute yapsnda bildirilmemi olmasdr:
if (minute == 0) { hour++; }

lk greviniz bu ileci Minute yaps iin uygulamaktr. 6. Code and Text Editor penceresinde, Minute.cs dosyasn an. 7. Code and Text Editor penceresinde operator==n sol ilenen olarak bir Minute ve sa ilenen olarak da bir int alan biimini gelitirin. Bu ilecin dn trnn bool olmas gerektiini unutmayn. Tamamlanm ile aadaki gibi grnmelidir:
struct Minute { ... public static bool operator==(Minute lhs, int rhs) { return lhs.value == rhs; } ... private int value; }

8. Build mensnde Build Solution tklayn. Oluum hata verir ve farkl bir hata iletisini grntler:
The operator Operators.Minute.operator ==(Operators.Minute, int) requires a matching operator != to also be defined.

imdiki sorun, operator==n bir biimini bildirdiiniz halde gerekli olan operator!= eini bildirmemi olmanzdr. 9. operator!=in sol ilenen olarak Minute ve sa ilenen olarak da int kabul eden bir srmn uygulayn.

406

Ksm III

Bileenler Yaratmak

Tamamlanm ile aadaki gibi grnmelidir:


struct Minute { ... public static bool operator!=(Minute lhs, int rhs) { return lhs.value != rhs; } ... private int value; }

10. Build mensnde Build Solution tklayn. Bu kez uygulama hatasz biimde oluturulur. 11. Debug mensnde Start Without Debuggingi tklayn. Uygulama alr ve her saniye kendiliinden gncelletirilen dijital bir saat grntler. 12. Uygulamay kapatn ve Visual Studio 2008 programlama ortamna dnn.

Dntrme lelerini Anlamak


Bazen bir trdeki deyimi baka bir tre dntrmek gerekir. rnein, aadaki yntem tek bir double parametresi ile bildirilmitir:
class Example { public static void MyDoubleMethod(double parameter) { ... } }

Hakl olarak, MyDoubleMethod arlrken yalnzca double trndeki deerlerin bamsz deiken olarak kullanlabilmesini bekleyebilirsiniz, ama durum byle deildir. C# derleyicisi, MyDoubleMethodun tr double olmayan bamsz deikenlerle arlmasna da izin verir, ama bunu ancak ve ancak o deer doublea dntrlebiliyorsa yapar. Derleyici, yntem arlnca bu dntrmeyi gerekletiren kodu retecektir.

Yerleik Dntrmeler Salamak


Yerleik trlerin yerleik dntrmeleri vardr. rnein, bir int kapal biimde bir doublea dntrlebilir. Kapal dntrme zel bir szdizimi gerektirmez ve asla bir zel durum oluturmaz:
Example.MyDoubleMethod(42); // kapal int-double dntrmesi

Blm 21

le Ar Yklemesi

407

Bir kapal dntrme widening conversion (geniletme dntrmesi) olarak da adlandrlr nk sonu zgn deerden genitir (en az zgn deer kadar bilgi ierir ve hibir ey kaybolmaz). Dier yandan, bir double kapal biimde bir int e dntrlemez:
class Example { public static void MyIntMethod(int parameter) { ... } } ... Example.MyIntMethod(42.0); // derleme zaman hatas

doubledan int e dntrme yapmak bilgi kaybna neden olabildiinden otomatik olarak yaplmaz (MyIntMethod un bamsz deikeninin 42.5 olduunu dnn; bu nasl dntrlr?) Bir double bir inte dntrlebilir ama dntrme ak bir gsterim sistemi (bir dntrme) gerektirir:
Example.MyIntMethod((int)42.0);

Ak bir dntrme bazen daraltma dntrmesi (narrowing conversion) olarak da adlandrlr, nk sonu zgn deerden dardr (daha az bilgi ierebilir) ve bir OverflowException (TamazelDurumu) zel durumu yaratabilir. C#, kapal ya da ak biimde baka trlere dntrlebilir olup olmadklarn denetleyebilmeniz iin kendi kullanc tanml trlerinize dntrme ileleri yazmanza izin verir.

Kullanc Tanml Dntrme leleri Uygulamak


Kullanc tanml bir dntrme ilecinin szdizimi, ar yklenmi ilecin szdizimine benzer. Bir dntrme ileci public ve static olmaldr. Aada, bir Hourun kapal biimde bir inte dntrlebileceini bildiren bir ile grebilirsiniz:
struct Hour { ... public static implicit operator int (Hour from) { return this.value; } private int value; }

Hangi trden dntryorsanz o tr tek bir parametre (burada Hour) olarak bildirilir ve hangi tre dntryorsanz o tr operator anahtar szcnden sonra tr ad olarak yazlr (burada int). operator anahtar szcnden nce belirtilmi bir dn tr yoktur.

408

Ksm III

Bileenler Yaratmak

Kendi dntrme ilelerinizi yazarken kapal dntrme mi ak dntrme mi olduklarn belirtmelisiniz. Bunu implicit ya da explicit anahtar szcklerini kullanarak yaparsnz. rnein, az nce bahsedilen Hour dan int e dntrme ileci kapaldr, bunun anlam C# derleyicisi onu kapal biimde kullanabilir demektir (dntrme olmadan):
class Example { public static void MyOtherMethod(int parameter) { ... } public static void Main() { Hour lunch = new Hour(12); Example.MyOtherMethod(lunch); // kapal Hour int dntrmesi } }

Dntrme ileci ak olsayd bir nceki rnek derlenmezdi nk bir ak dntrme ileci, ak bir dntrme ilemini gerektirir:
Example.MyOtherMethod((int)lunch); // ak Hour int dntrmesi

Dntrme ilecini ne zaman ak ne zaman kapal olarak bildirmeniz gerekir? Bir dntrme her zaman gvenliyse, bilgi kaybetme olasl yoksa ve zel durum oluturmuyorsa bir implicit (kapal) dntrme olarak tanmlanabilir. Aksi durumda bir explicit (ak) dntrme olarak bildirilmelidir. Hour dan int e dntrme yapmak her zaman gvenlidir (her Hour, karlk gelen bir int deeri ierir); bu yzden bunun kapal olmas anlalabilir. Bir string i Hour a dntren bir ile ak olmaldr, nk tm dizeler geerli Hour gstermez. (7 dizesinde sorun yok, ancak Hello, World bir Hour a (saate) nasl dntrebilirsiniz?)

Simetrik leler Yaratmak (Yeniden)


Dntrme ileleri, simetrik ileleri salama sorununu zmek iin alternatif bir yol sunar. rnein, daha nceden olduu gibi, Hour yaps iin operator+nn biimini (Hour + Hour, Hour + int ve int + Hour) salamak yerine, (iki Hour parametresi olan) operator+n tek bir biimini ve bir kapal int ten Hour a bir dntrme salarsnz:
struct Hour { public Hour(int initialValue) { this.value = initialValue; } public static Hour operator+(Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); }

Blm 21
public static implicit operator Hour (int from) { return new Hour (from); } ... private int value; }

le Ar Yklemesi

409

Bir Hour ile bir inti toplarsanz (herhangi bir srada), C# derleyicisi otomatik olarak inti Houra dntrp, operator+y iki Hour bamsz deikeni ile arr:
void Example(Hour a, int b) { Hour eg1 = a + b; // b Houra dntrld Hour eg2 = b + a; // b Houra dntrld }

Bir Kapal Dntrme leci Eklemek


Aadaki altrmada dijital saat uygulamasn deitireceksiniz. Second yapsna kapal bir dntrme ileci ekleyecek ve yerlerini tutaca ileleri sileceksiniz.

Dntrme ilecini yazn


1. Visual Studio 2008e dnn, Operators projesini grntleyin. Code and Text Editor penceresinde Clock.cs dosyasn grntleyin tock yntemini tekrar snayn:
private void tock() { this.second++; if (this.second == 0) { this.minute++; if (this.minute == 0) { this.hour++; } } }

nceki kod rneindeki if (this.second == 0) ifadesine dikkat edin. Bu kod paras == ilecini kullanarak bir Second ile bir int i karlatrr. 2. Code and Text Editor penceresinde Second.cs dosyasn grntleyin. Second yaps u anda operator== ve operator!= ilelerinin ar yklenmi er uygulamasn iermektedir. Her ile parametre tr iftleri (Second, Second), (Second, int) ve (int, Second) iin ar yklenmitir.

410

Ksm III

Bileenler Yaratmak

3. Second yapsnda, operator== ve operator!= ilelerinin bir Second ve bir int parametresi alan drt versiyonunu silin (iki Second parametresi alan ileleri silmeyin). Aadaki iki ile Second yapsndaki operator== ve operator!= ilelerin tek srmleri olmaldr:
struct Second { ... public static bool operator==(Second lhs, Second rhs) { return lhs.value == rhs.value; } public static bool operator!=(Second lhs, Second rhs) { return lhs.value != rhs.value; } ... }

4. Build mensnde Build Solution tklayn. Oluturma baarsz olur ve aadaki hata iletisini verir:
Operator == cannot be applied to the operands of type Operators.Second and int

Bir Second ve bir inti karlatran ileleri kaldrmak 1. admda vurgulanan if (this. second == 0) ifadesinin derlenmemesine neden olur. 5. Code and Text Editor penceresinde, intten Second a dntrme yapan Second yapsna kapal bir dntrme ileci ekleyin. Dntrme ileci aadaki gibi grnmelidir:
struct Second { ... public static implicit operator Second (int arg) { return new Second(arg); } ... }

6. Build mensnde Build Solution tklayn . Program bu kez baaryla oluturulur nk dntrme ileci ve geri kalan iki ile birlikte sildiiniz drt ilecin ilevini yerine getirir. Tek fark, kapal bir dntrme ileci kullanmak kapal dntrme ileci kullanmamaktan potansiyel olarak daha yavatr. 7. Debug mensnde Start Without Debuggingi tklayn. Uygulamann hala doru olarak altn dorulayn.

Blm 21

le Ar Yklemesi

411

8. Uygulamay kapatn ve Visual Studio 2008 programlama ortamna dnn. Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 22ye gein.
n

Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 21 Hzl Bavuru


Bunun in
Bir ile uygulamak

unu Yapn
public ve static anahtar szcklerini yazn, ardndan dn trn ve operator anahtar szcn ekleyin ve daha sonra bildirilen ilecin simgesini ve parantez iinde uygun parametreleri yazn. rnein:
struct Hour { ... public static bool operator==(Hour lhs, Hour rhs) { ... } ... }

Bir dntrme ileci bildirmek

public ve static anahtar szcklerini yazn, ardndan implicit ya da explicit anahtar szcn ve operator anahtar szcn ekleyin ve daha sonra dntrlen tr, bildirmekte olan ilecin trn ve hangi trden dntrme yaplyorsa parantez iinde bir tek parametre olarak o tr yazn. rnein:
struct Hour { ... public static implicit operator Hour(int arg) { ... } ... }

Adm Adm Microsoft Visual C# 2008

Windows Uygulamalar ile almak


Bu ksmdaki konular: Blm 22 . Windows Presentation Foundationa Giri . . . . . . . . . . . . . . . . . . . . . . 415 Blm 23 . Menler ve letiim Kutularyla almak . . . . . . . . . . . . . . . . . . . . . . . 451 Blm 24 . Dorulamay Gerekletirmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

Ksm IV

413

Blm 22

Windows Presentation Foundationa Giri


Bu blm tamamladktan sonra renecekleriniz:
n n n n

Microsoft Windows Presentation Foundation (WPF) uygulamalar yaratmak. Etiketler, metin kutular ve dmeler gibi sk kullanlan WPF denetimleri ile almak WPF denetimleri iin modeller tanmlamak. WPF formlar ve denetimlerinin zelliklerini tasarm annda ya da alma annda deitirmek. WPF formlar ve denetimleri tarafndan aa karlan olaylar ilemek.

Bu kitabn ilk ksmndaki altrmalar tamamlam ve rnekleri incelemi olduunuza gre Microsoft Visual C# dilinden iyi anlyor olmanz gerekir. C# kullanarak programlarn nasl yazlacan ve bileenlerin nasl yaratlacan rendiniz. Geniletilmi yntemler, lambda deyimleri ve deer trleri ile bavuru trleri arasndaki farklar gibi dilin daha ayrntl noktalarnn birounu anlyor olmanz gerekir. Artk balca dil yeteneklerini edindiinize gre Ksm IV, bu yetenekler zerinde bilgilerinizi nasl gelitireceinizi ve Microsoft .NET Frameworkn bir paras olarak sunulan Graphical User Interface (Grafiksel Kullanc Arabirimi -GUI) kitaplklarndan yararlanmak iin C# nasl kullanacanz gsterecek. zellikle, WPF uygulamalar yaratmak iin System.Windows ad alanndaki nesneleri nasl kullanacanz greceksiniz. Bu blmde, birok GUI uygulamasnn ortak bileenlerini kullanarak basit bir WPF uygulamas oluturmay reneceksiniz. Design View ve Properties penceresini ve ayrca Extensible Application Markup Language ya da XAML dilini kullanarak WPF formlar ve denetimlerinin zelliklerini nasl ayarlayacanz greceksiniz. Ayrca, irketinizin standartlarna kolayca uygun hale getirilen kullanc arabirimi oluturmak iin WPF modellerinin kullanmn reneceksiniz. Son olarak, WPF formlar ve denetimlerinin balatt olaylarn bazlarn nasl durduracanz ve ileyeceinizi reneceksiniz.

Bir WPF Uygulamas Yaratmak


rnek olarak, bir kullancnn, bulmak isteyebileceiniz en iyi anclarn bir topluluu olan Middleshire Bell Ringers Association yelerinin bilgilerini girmesini ve ayrntlarn grntleyebilmesini salayan bir uygulama yaratacaksnz. nce, formun grnmne ve tmyle alyor olmasna odaklanarak uygulamay ok basit tutacaksnz. lerleyen
415

416

Ksm IV

Windows Uygulamalar ile almak

blmlerde, yksek derecede adapte edilebilir kullanc arabirimleri oluturmak iin WPF formlarnn salad baz zellikleri renecek, menler ekleyecek ve girilen verilerin anlaml olduklarndan emin olmak iin dorulama ilemlerini gelitireceksiniz. Aadaki ekran grnm, uygulamay bitirdiinizde nasl grneceini gsteriyor. (Belgeler klasrndeki\ Microsoft Press\Visual CSharp Step by Step\Chapter 22 \Completed BellRingers\ klasrndeki BellRingers projesini oluturup altrarak bitmi bir srm grebilirsiniz.)

Bir Windows Presentation Foundation Uygulamas Yaratmak


Bu altrmada, yeni bir proje yarattktan sonra formu planlayp, form denetimlerini ekleyerek Middleshire Bell Ringers Association uygulamasn oluturmaya balayacaksnz. Daha nceki blmlerde Microsoft Visual Studio 2008de var olan WPF uygulamalarn kullandnz iin ilk birka altrma sizin iin bir tekrar olacak.

Middleshire Bell Ringers Association projesini yaratn


1. Visual Studio 2008i balatn. 2. Visual Studio 2008 Standard Edition ya da Visual Studio 2008 Professional Edition kullanyorsanz, yeni bir WPF uygulamas yaratmak iin aadaki ilemleri gerekletirin: 2.1. File mensnde, New i iaret edin ve daha sonra Project i tklayn. New Project iletiim kutusu alr. 2.2. Project Types blmesinde, Visual C# tklayn. 2.3. Templates blmesinde, WPF Application simgesini tklayn. 2.4. Location alanna, Belgeler klasrnz altndaki \Microsoft Press\Visual CSharp Step By Step\Chapter 22 yolunu yazn.

Blm 22

Windows Presentation Foundationa Giri

417

2.5. Name alanna BellRingers yazn. 2.6. OK i tklayn. 3. Microsoft Visual C# 2008 Express Edition kullanyorsanz, yeni bir grafik uygulamas yaratmak iin aadaki ilemleri gerekletirin. 3.1. Tools mensnde Options tklayn. 3.2. Options iletiim kutusunda, sol blmedeki aa grnmnde Projects and Solutions tklayn. 3.3. Sa blmede, Visual Studio projects location metin kutusuna, Belgeler klasrnz altndaki Microsoft Press\Visual CSharp Step By Step\Chapter 22 yolunu yazn. 3.4. OKi tklayn. 3.5. File mensnde New Projecti tklayn. 3.6. New Project iletiim kutusunda WPF Application simgesini tklayn. 3.7. Name alanna BellRingers yazn. 3.8. OKi tklayn. Yeni proje yaratlr. Window1 adnda bo bir form ierir.

Formu ve Izgara (Grid) yerleimini inceleyin


1. Design View penceresi altndaki XAML blmesinde formu inceleyin. Formun XAML tanmlamasnn u ekilde grndne dikkat edin:
<Window x:Class=BellRingers.Window1 xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml Title=Window1 Height=300 Width=300> <Grid> </Grid> </Window>

Class znitelii formu uygulayan snfn tmyle nitelendirilmi adn belirtir. Bu rnekte, BellRingers ad alannda Window1 olarak adlandrlmtr. WPF Uygulama ablonu, formlar iin varsaylan ad alan olarak, uygulamann adn kullanr. xmlns znitelikleri, WPF tarafndan kullanlan taslaklar tanmlayan XML ad alanlarn gsterir; denetimlerin tm ve bir WPF uygulama iine birletirebildiiniz dier eler bu ad alanlarnda tanmlamlara sahiptir. (XML ad alanlarna aina iseniz, imdilik bu xmlns zniteliklerini ihmal edebilirsiniz.) Title znitelii, formun balk ubuunda grnen metni belirler. Height ve Width zellikleri, formun varsaylan ykseklik ve geniliini belirler. Bu

418

Ksm IV

Windows Uygulamalar ile almak

deerleri XAML blmesinde deitirerek ya da Properties penceresini kullanarak dzenleyebilirsiniz. Ayrca, form altnda uygulanan C# kodu yazarak bu deerleri ve birok baka zellii deitirebilirsiniz. 2. Design View penceresinde Window1 formunu tklayn. Properties penceresinde, Title zelliini tklayn ve daha sonra formun balk ubuundaki metni deitirmek iin Middleshire Bell Ringers Association Members yazn. XAML blmesinde, formun Title zniteliindeki deerin deitiine ve Design View penceresinde, formun balk ubuunda yeni baln grntlendiine dikkat edin. Not Window1 formu, sonraki admda inceleyeceiniz bir alt denetim ierir. Properties

penceresi System.Windows.Controls.Grid denetimi iin zellikler grntlerse, Window1 formunda Window1 metnini tklayn. Bu ilem klavuz yerine formu seer ve ardndan Properties penceresi System.Windows.Window denetimi iin zellikler grntler.

3. XAML blmesinde, Window esinin Grid adnda bir alt e ierdiine dikkat edin. Bir WPF uygulamasnda, dmeler, metin kutular ve etiketler gibi denetimleri formdaki blmeye yerletirin. Blme, ierdii denetimlerin yerleimini ynetir. WPF uygulama ablonu tarafndan eklenen varsaylan blme Grid dir, tasarm zamannda denetimlerinizin konumunu tam olarak belirleyebilirsiniz. Farkl yerleim stilleri salayan baka blmeler de mevcuttur. rnein, StackPanel otomatik olarak, her denetim dorudan bir ncekinin altna geecek ekilde, denetimleri dikey dzenlemede yerletirir. Bir dieri, bir satrdaki denetimleri soldan saa doru dzenleyen ve geerli satr tmyle dolduktan sonra bir sonraki satra geen WrapPanel rneidir. Bir yerletirme blmesinin balca amac, kullanc alma zamannda pencereyi yeniden boyutlandrrsa denetimlerin nasl yerletirileceini ynlendirmektir; blme trne uygun olarak denetimler otomatik olarak yeniden boyutlandrlr ve yeniden konumlandrlr. Not Grid blmesi esnektir fakat karmaktr. Varsaylan ayar olarak, Grid blmesini,

denetimleri srkleyebildiiniz tek bir hcre tanm olarak dnebilirsiniz. Bununla birlikte, birden fazla satr ve stunu (dolaysyla adlarn) tanmlamak iin Grid blmesinin zelliklerini kullanabilir ve bu satr ve stunlarn tanmlad her hcre iine denetimleri srkleyebilirsiniz. Bu blmde, baz eyleri basit tuttuk ve sadece tek bir hcre kullandk.

4. Design View penceresinde, Window1 formunu tklayn ve daha sonra da Toolbox sekmesini tklayn. 5. Common ksmnda, Buttonu tklayn ve daha sonra formun sa st ksmn tklayn.

Blm 22

Windows Presentation Foundationa Giri

419

Formun st ve sa kelerine sabitlenen iki balaycy gsteren dme denetimi, aadaki gibi forma eklenir:

Formu tklamanzla birlikte, Button denetimi formda kapsanan Grid denetimine eklenir. Tm forma yerleen klavuz, en stteki balk ubuundan ayrdr. Balayclar, klavuzun st ve sa kelerine saplanm dmeyi gsterir. 6. XAML blmesindeki kodu inceleyin. Grid esi ve ierii, imdi aadaki gibi grnmelidir (Margin zellii iin deerleriniz deiebilir):
<Grid> <Button HorizontalAlignment=Right Margin=0,84,34,0 Name=button1 Width=75 Height=23 VerticalAlignment=Top>Button</Button> </Grid>

Not Bu blm boyunca, XAML blmesindeki satrlar, baslan sayfaya uyacak ekilde yarm ve girintili gsterilmitir. Bir klavuz zerine bir klavuz yerletirdiinizde, klavuzun uygun kesine balama noktalarnn herhangi birini ya da tmn balayabilirsiniz. Varsaylan ayar olarak, Design View penceresi denetimi en yakn keye balar. Denetimi klavuzun sol altna doru yerletirirseniz, klavuzun alt ve sol kesine balanacaktr. Dmenin HorizontalAlignment ve VerticalAlignment zellikleri denetimin baland keleri ve Margin zellii de bu kelere olan uzakl gsterir. Blm 1den, Margin zelliinin, klavuzun srasyla sol, st, sa ve alt kelere uzakln belirleyen drt deer ierdiini hatrlayn. Grntlenen XAML parasnda, dme klavuzun st kesinden 84 birim, sa kesinden 34 birim uzaklktadr (Her birim 1/96 inchdir). Kenar boluklar deerinin 0 olmas, dmenin uygun keye balandn gsterir. Uygulamay altrdnzda, WPF alma zaman, siz formu yeniden boyutlandrsanz bile bu uzaklklar ayn tutmaya alacaktr.

420

Ksm IV

Windows Uygulamalar ile almak

7. Debug mensnde Start Without Debuggingi tklayarak uygulamay oluturun ve altrn. 8. Form belirdiinde, pencereyi yeniden boyutlandrn. Formun kelerini srklediinizde dmenin formun st ve sa kelere uzaklnn deimeden sabit kaldna dikkat edin. 9. Formu kapatarak, Visual Studio 2008e dnn. 10. Design View penceresinde, dme denetimini tklayn ve daha sonra aadaki resimde gsterildii gibi, formun sol kesine denetimi ilitirmek iin sol balant noktasn tklayn:

XAML blmesinde, HorizontalAlignment zelliinin artk belirtilmediine dikkat edin. HorizontalAlignment ve VerticalAlignment zelliklerinin varsaylan deeri, denetimin karlkl kelere balandn gsteren, Stretch ad verilen deerdir. Ayrca, Margin zelliinin imdi sol kenar boluu iin sfr dnda bir deer gsterdiine dikkat edin. Not Balanty kaldrmak iin, klavuzun kesine balanan balant noktasn
tklayabilirsiniz.

11. Debug mensnde Start Without Debugging tklayarak, uygulamay yeniden oluturun ve altrn. 12. Form belirdiinde, formu geniletmeyi ve daraltmay deneyin. Formun sol ve sa kelerine balandndan dmenin artk hareket etmediine dikkat edin. Bunun yerine, keler hareket ettike form geniler ya da daralr. 13. Formu kapatn ve Visual Studio 2008e dnn. 14. Design View penceresinde, Toolbox dan forma ikinci bir Button denetimi ekleyin ve formun ortasna yerletirin.

Blm 22

Windows Presentation Foundationa Giri

421

15. XAML blmesinde, Margin zellii deerlerini 0a ayarlayn, VerticalAlignment ve HorizontalAlignment zelliklerini kaldrn ve Width ve Height zelliklerini aadaki gibi ayarlayn:
<Button Margin=0,0,0,0 Name=button2 Width=75 Height=23>Button</Button>

pucu Properties penceresini kullanarak ayrca, Margin gibi denetim zelliklerinin

birounu ayarlayabilirsiniz. Bununla birlikte, Properties penceresini kullanarak zelliklerin tmn ayarlayamazsnz. Bazen, deerleri dikkatlice girdiiniz srece XAML blmesine deerleri dorudan yazmak kolaydr.

Not Dme denetiminin Width ve Height zelliklerini ayarlamazsanz, dme tm formu doldurur . 16. Debug mensnde Start Without Debuggingi tklayarak uygulamay bir kere daha oluturun ve altrn. 17. Form belirdiinde, formu yeniden boyutlandrn. Form daraldka ya da geniledike, yeni dmenin, drtkenara gre formdaki konumunu ayn tutmaya alarak yeniden konumlandna (formun merkezinde kalmaya alr) dikkat edin. Formun yksekliini daraltrsanz, yeni dme denetimi ilk dme denetiminin stne kar. 18. Formu kapatn ve Visual Studio 2008e dnn. Yaklamnzda tutarl olduunuz srece, Grid gibi yerletirme blmelerini kullanarak, kullancnn pencereyi yeniden boyutlandrdn belirlemek iin karmak kod yazmak zorunda kalmadan kullancnn ekran znrl ne olursa olsun, doru grnen formlar oluturabilirsiniz. Ek olarak, WPF ile, yine ok sayda karmak kod yazmak zorunda kalmadan, uygulamann kulland denetimlerin grnmlerini ve zelliini deitirebilirsiniz. Bu zelliklerle, kolaylkla irketiniz tarafndan istenen herhangi bir tarza uyacak uygulamalar oluturabilirsiniz. Aadaki altrmalarda bu zelliklerin bazlarn inceleyeceksiniz.

Forma arka plan resmi ekleyin


1. Design View penceresinde Window1 formunu tklayn. 2. Toolboxdaki Common ksmnda Imagei tklayn ve daha sonra form zerinde herhangi bir yeri tklayn. Formun arka plannda bir resim grntlemek iin bu resim denetimini kullanacaksnz.

422

Ksm IV

Windows Uygulamalar ile almak

Not Gridin arka plannda bir resim grntlemek iin baka birok teknik kullanabilirsiniz. Bu altrmada gsterilen yntem basit olsa da dier stratejiler daha fazla esneklik salayabilir. 3. XAML blmesinde, resim denetiminin Margin zelliini ayarlayn ve aada gsterildii gibi, Name dndaki dier zellik deerlerini kaldrn:
<Image Margin=0,0,0,0 Name=image1/>

ki dme denetimi grnr kalacak biimde, klavuzu tamamen yerletirmek iin resim denetimi geniler. 4. Solution Explorerda, BellRingers projesini farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Existing Item tklayn. Add Existing Item BellRingers iletiim kutusunda, Belgeler klasrnz altndaki Microsoft Press\Visual CSharp Step By Step\ Chapter 22 klasrne gein. File name kutusuna Bell.gif yazn ve Addi tklayn. Bu hareket, Bell.gif resim dosyasn uygulamanzn kaynak dosyas olarak ekler. Bell.gif dosyas alan bir an resmini ierir. 5. XAML blmesinde, resim denetiminin tanmn aada gsterildii gibi deitirin. Resim denetiminin kapal etiket snrlaycsn (/>), sradan etiket snrlaycs (>) ile deitirmeniz ve kapal </Image> etiketi eklemeniz gerektiine dikkat edin:
<Image Margin=0,0,0,0 Name=image1 > <Image.Source> <BitmapImage UriSource=Bell.gif /> </Image.Source> </Image>

Resim denetiminin amac, bir resmi grntlemektir. Resim kaynan deiik yollarla belirleyebilirsiniz. Burada gsterilen rnek, projeye kaynak dosya olarak eklediiniz Bell.gif resmini ykler. Resim aadaki gibi formda grnmelidir:

Blm 22

Windows Presentation Foundationa Giri

423

Ancak bir sorun var. Resim arka planda deil ve iki dme denetimini tmyle gizliyor. Konu udur, siz aksini belirtmedike, yerleim blmesinde yer alan tm denetimler, daha nce eklenen denetimlerin en stne eklendii bir z srasna sahiptir. Not z sras terimi, y ekseninin dikey, x ekseninin de yatay olduu boyutlu uzayda,

z ekseni zerinde enin konumunu gsterir. z sras deeri yksek olan eler, dk olan elerin nnde grnecektir.

Resim denetimini dmelerin arkasna gtrmenin en az iki yolu vardr. Birincisi, dmelerin XAML tanmlarn hareket ettirmektir, bylece resim denetiminden sonra grnrler. kincisi, ak bir ekilde denetimin ZIndex zellii iin bir deer belirlemektir. Yksek ZIndex deerli denetimler, dk ZIndex deerli denetimlerin nnde yer alr. ki denetim ayn ZIndex deerine sahipse, ncelik XAML tanmnda yer alma srasna gre belirlenir. Not panel (blme) denetimi, dier denetimler iin bir kapsayc olarak grev yapar ve

denetimlerin birbirine gre nasl yerleeceklerini belirler. Grid denetimi bir blme denetimi rneidir. Dier blme denetimi rneklerini ilerleyen ksmlarda greceksiniz. Bir forma birden fazla blme yerletirebilirsiniz.

6. XAML blmesinde, dme ve resim denetimlerinin ZIndex zelliklerini aadaki kodda gsterildii gibi ayarlayn:
<Button Panel.ZIndex=1 Margin=169,84,34,0 Name=button1 Height=23 VerticalAlignment=Top>Button</Button> <Button Panel.ZIndex=1 Height=23 Margin=0,0,0,0 Name=button2 Width=76>Button</Button> <Image Panel.ZIndex=0 Margin=0,0,0,0 Name=image1 > <Image.Source> <BitmapImage UriSource=Bell.gif /> </Image.Source> </Image>

ki dme imdi resmin nnde grnmelidir. WPF ile, dmeler, metin kutular ve etiketler gibi denetimlerin form zerinde bulunma ekillerini deitirebilirsiniz.

424

Ksm IV

Windows Uygulamalar ile almak

Denetimlerin form zerindeki grnmlerini ynetmek iin bir stil oluturun


1. XAML blmesinde, formun ilk dmesini aada koyu harfle gsterilen koddaki gibi deitirin. Button.Resource gibi birleik alt zellik ieren bir denetimin XAML tanmn, birden fazla satr zerine datmak, kodun okunuunu ve bakmn kolaylatrmak iin iyi bir uygulamadr.
<Button Style={DynamicResource buttonStyle} Panel.ZIndex=1 Margin =169,84,34,0 Name=button1 Height=23 VerticalAlignment=Top> <Button.Resources> <Style x:Key=buttonStyle> <Setter Property=Button.Background Value=Gray/> <Setter Property=Button.Foreground Value=White/> <Setter Property=Button.FontFamily Value=Comic Sans MS/> </Style> </Button.Resources> Button </Button>

Bir denetimin zelliklerine varsaylan deerleri atamak iin o denetimin <Style> esini kullanabilirsiniz. (Bu blmde daha sonra greceiniz gibi, Stiller daha fazla ey yapabilir.) Bu rnek, dme zerindeki metinde kullanlan yaz tipinin yan sra, dmenin arka plan ve n plan renkleri iin deerleri belirler. Design View penceresinde grntlenen dmenin, stil iin belirlenen zellik deerleri ile elemek iin grnmn deitirdiine dikkat edin. Stiller kaynaklardr ve onlar denetimin Resources esine eklersiniz. Key zelliini kullanarak her stile benzersiz bir ad verebilirsiniz. Daha sonra denetimin Style zelliinden yeni stile bavurabilirsiniz. {DynamicResource buttonStyle} szdizimi, adlandrlan stile dayal yeni bir stil yaratr ve daha sonra dmeye bu stili uygular. Not Bir WPF penceresini derlediinizde, Visual Studio pencerenin ierdii kaynaklar pencere ile ilikili bir koleksiyona ekler. Aka sylemek gerekirse, Key zellii, stilin adr deil bu koleksiyondaki kaynan bir tanmlaycsn gsterir. C# kodunuzdaki kaynaklar ynetmek isterseniz Name zelliini belirleyebilseniz de, denetimler kaynan Key deerini belirterek kaynaklara bavurur. Forma eklediiniz denetimler ve dier eler kendi Name zellii ayarna sahip olmaldr nk kaynaklarda olduu gibi, kodda bu elere nasl bavurulacan gsterir. Stiller kapsama sahiptir. Form zerindeki ikinci dmeden buttonStyle stiline bavurmaya alrsanz, hibir ey olmaz. Bunun yerine, bu stilin kopyasn oluturarak ikinci dmenin Resources esine ekleyebilir ve daha sonra bu kopyaya bavurabilirsiniz:
<Grid> <Button Style={DynamicResource buttonStyle} Panel.ZIndex=1 Margin =169,84,34,0 Name=button1 Height=23 VerticalAlignment=Top>

Blm 22

Windows Presentation Foundationa Giri

425

<Button.Resources> <Style x:Key=buttonStyle> <Setter Property=Button.Background Value=Gray/> <Setter Property=Button.Foreground Value=White/> <Setter Property=Button.FontFamily Value=Comic Sans MS/> </Style> </Button.Resources> Button </Button> <Button Style={DynamicResource buttonStyle} Panel.ZIndex=1 Height=23 Margin=0,0,0,0 Name=button2 Width=76> <Button.Resources> <Style x:Key=buttonStyle> <Setter Property=Button.Background Value=Gray/> <Setter Property=Button.Foreground Value=White/> <Setter Property=Button.FontFamily Value=Comic Sans MS/> </Style> </Button.Resources> Button </Button> ... </Grid>

Bununla birlikte, bu yaklam olduka fazla tekrarlanabilir ve dmelerin stilini deitirmeniz gerekirse bakm bir kabusa dnebilir. Daha iyi bir strateji, pencere iin kaynak olarak bir stil tanmlamaktr. Daha sonra, o penceredeki tm denetimlerden bu stile bavurabilirsiniz. 2. XAML blmesinde, klavuz zerine bir <Window.Resources> esi ekleyin, buttonStyle stilinin tanmn bu yeni eye geirin ve daha sonra her iki dmeden <Button. Resources> esini silin. Her iki dmeden yeni stile bavurun ve kodu daha okunulur yapmak iin button2 denetiminin tanmn birden fazla satr zerine datn. Formun tm XAML tanm iin gncellenmi kod, kaynak tanm ve kaynaa bavuru ile birlikte aadaki gibidir:
<Window x:Class=BellRingers.Window1 xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml Title=Middleshire Bell Ringers Association - Members Height=300 Width=300> <Window.Resources> <Style x:Key=buttonStyle> <Setter Property=Button.Background Value=Gray/> <Setter Property=Button.Foreground Value=White/> <Setter Property=Button.FontFamily Value=Comic Sans MS/> </Style> </Window.Resources> <Grid> <Button Style={StaticResource buttonStyle} Panel.ZIndex=1 Margin =169,84,34,0 Name=button1 Height=23 VerticalAlignment=Top> Button </Button>

426

Ksm IV

Windows Uygulamalar ile almak

<Button Style={StaticResource buttonStyle} Panel.ZIndex=1 Height=23 Margin=0,0,0,0 Name=button2 Width=76> Button </Button> <Image Panel.ZIndex=0 Margin=0,0,0,0 Name =image1> <Image.Source> <BitmapImage UriSource=Bell.gif /> </Image.Source> </Image> </Grid> </Window>

Her iki dmenin de ayn stil ile Design View penceresinde belirdiine dikkat edin. Not Yukarda girdiiniz kod, DynamicResource anahtar szc yerine StaticResource

kullanarak dme stiline bavurur. Statik kaynaklarn kapsama kurallar, C#daki ile benzerdir, bavurabilmeniz iin ncelikle bir kayna tanmlamanz gerektirir. Bu altrmann 1. admnda, kaynan tanmland XAML kodunun stnde buttonStyle stiline bavurdunuz. Bu kapsam dndaki bavuru alr, nk DynamicResource kullanmak, alma zamannda kaynaa bavurunun analizinin yaplmasn kaynan oluturulduu noktaya kadar erteler. Genel olarak, statik kaynaklar, dinamik kaynaklardan daha verimlidir nk uygulama oluturulduunda bavuru analizi yaplr, bununla birlikte dinamik kaynaklar daha fazla esneklik salar. rnein, uygulama altka kaynan kendisi deiirse (alma zamannda stili deitirmek iin kod yazabilirsiniz), StaticResource kullanarak stile bavuran denetimler gncellenmeyecektir, fakat DynamicResource kullanarak stile bavuran denetimler gncellenecektir. Statik ve dinamik kaynaklar arasnda birok baka farkllklar ve bir kaynaa dinamik olarak bavurabilmeniz iin kstlamalar vardr. Daha fazla bilgi iin, Visual Studio 2008 tarafndan salanan .NET Framework belgelerine bavurun.

Stil tanmnda hl biraz yineleme vardr; zelliklerin her biri (arka plan, n plan ve yaz tipi) ak bir ekilde dme zellikleri olduklarn belirtir. Style etiketinde TargetType zniteliini belirterek bu yinelemeyi ortadan kaldrabilirsiniz. 3. TargetType zniteliini belirtmek iin stil tanmn aadaki gibi deitirin:
<Style x:Key=buttonStyle TargetType=Button> <Setter Property=Background Value=Gray/> <Setter Property=Foreground Value=White/> <Setter Property=FontFamily Value=Comic Sans MS/> </Style>

Forma istediiniz kadar dme ekleyebilirsiniz ve tmn yine buttonStyle stilini kullanarak dzenleyebilirsiniz. Peki, etiketler ve metin kutular gibi dier denetimler nasl olur? 4. Design View penceresinde, Window1 formunu tklayn ve daha sonra Toolbox sekmesini tklayn. Common blmnde TextBox tklayn ve sonra formun alt blmnde herhangi bir yeri tklayn.

Blm 22

Windows Presentation Foundationa Giri

427

5. XAML blmesinde, metin kutusu denetiminin tanmn deitirin ve buttonStyle stili uygulamaya alan, aadaki rnekte gsterilen Style zniteliini belirtin:
<TextBox Style={StaticResource buttonStyle} Height=21 Margin=114,0,44,58 Name=textBox1 VerticalAlignment=Bottom />

Dme iin tasarlanm bir stili, bir metin kutusunun stili olarak ayarlamaya almak baarszlkla sonulanr. Design View penceresinde The document root element has been altered or an unexpected error has been encountered in updating the designer. Click here to reload. (Belge kk esi deitirilmi ya da tasarmcy gncellerken beklenmedik hata olutu. Yeniden yklemek iin buray tklayn) hata iletisi grnr. Gsterildii gibi iletiyi tklarsanz, Design View penceresinde form kaybolur ve yerine aadaki ileti gelir:

Telalanmayn, hatanz imdi dzelteceksiniz! 6. XAML blmesinde, Key zelliini dzenleyin ve stil tanmn TargetType yerine Control olacak ekilde deitirin, daha sonra aada gsterildii gibi dme ve metin kutusu denetimlerinde stile bavurular dzenleyin:
<Window x:Class=BellRingers.Window1 ...> <Window.Resources> <Style x:Key=bellRingersStyle TargetType=Control> <Setter Property=Background Value=Gray/> <Setter Property=Foreground Value=White/> <Setter Property=FontFamily Value=Comic Sans MS/> </Style> </Window.Resources> <Grid> <Button Style={StaticResource bellRingersStyle} ...> Button </Button> <Button Style={StaticResource bellRingersStyle} ...> Button </Button> ... <TextBox ... Style={StaticResource bellRingersStyle} ... /> </Grid> </Window>

Stil artk sadece dmelere uygulanmayacandan, yeniden adlandrmak iyi olacaktr. Stilin TargetType zniteliini Control olarak ayarlamak, Control snfndan kaltmla alnan denetime stilin uygulanabileceini belirtir. WPF modelinde, metin kutular ve dmeleri de ieren denetimlerin birok farkl tr, Control snfndan kaltmla alr. Bununla birlikte, sadece ak bir ekilde Control snfna ait zellikler iin Setter elerini

428

Ksm IV

Windows Uygulamalar ile almak

salayabilirsiniz. (Dmeler, Control snfnn paras olmayan baz ek zelliklere sahiptir; bu dmeye ait zelliklerden birini belirlerseniz, TargetType zniteliini Control olarak ayarlayamazsnz.) 7. Design View penceresinde, Reload the designer balantsn tklayn. Formun imdi grnmesi gerekir. Metin kutusunun gri arka planda olduuna dikkat edin. 8. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Metin kutusuna bir eyler yazn ve yazdklarnzn beyaz renkte Comic Sans MS yaz tipinde belirdiini dorulayn. Ne yazk ki, renklerin seimi, metin kutusunu tklayarak bir metin yazdnzda metin imlecini grmenizi zorlatrr. Bu problemi sonraki admda zeceksiniz. 9. Formu kapatn ve Visual Studio 2008e dnn. 10. XAML blmesinde, bellRingersStyle stilini dzenleyin ve aadaki kodda koyu renkle gsterilen <Style.Triggers> esini ekleyin. (TriggerCollectionn mhrlendiine (sealed olduuna) dair bir hata iletisi alrsanz, zm yeniden oluturun.)
<Style x:Key=bellRingersStyle TargetType=Control> <Setter Property=Background Value=Gray/> <Setter Property=Foreground Value=White/> <Setter Property=FontFamily Value=Comic Sans MS/> <Style.Triggers> <Trigger Property=IsMouseOver Value=True> <Setter Property=Background Value=Blue /> </Trigger> </Style.Triggers> </Style>

Tetikleyici, bir zellik deeri deitiinde gerekletirilecek olan hareketi belirler. bellRingersStyle stili, fare iaretisi zerine gittiinde denetimin arka plan rengini geici olarak deitirmek iin IsMouseOver zelliindeki deiiklii belirler. Not Tetikleyicileri olaylarla kartrmayn. Tetikleyiciler, zellik deerlerindeki geici

deiikliklere karlk verir. Tetikleme zelliindeki deer tersine dnerse, tetiklenen hareket tamamlanmam olur. Daha nce gsterilen rnekte, bir denetim iin IsMouseOver zellii artk true olmadnda, Background zellii orijinal deerine geri dner. Olaylar, bir uygulamada nemli bir zel durum (kullancnn dmeyi tklamas gibi) meydana geldiinde gerekletirilecek bir hareketi belirtir; olay tarafndan gerekletirilen hareketler, zel durum sona erdiinde tamamlanmam olur.

11. Uygulamay tekrar oluturmak ve altrmak iin Debug mensnde, Start Without Debugging i tklayn. Bu defa, metin kutusunu tkladnzda, mavi renk olur ve metin imlecini rahatlkla grebilirsiniz. Fare iaretisini uzaklatrdnzda, metin kutusunun rengi orijinal giri rengine dnr. Dmelerin ayn ekilde olmadna dikkat edin. Dme denetimleri bu ilevsellii gerekletirir ve fare iaretisi zerine geldiinde rengi mavinin farkl bir tonuna dnr. Bu varsaylan davran, stilde belirtilen tetikleyiciyi geersiz klar.

Blm 22

Windows Presentation Foundationa Giri

429

12. Formu kapatn ve Visual Studio 2008e dnn. Not Form zerindeki tm denetimlere genel olarak bir yaz tipi uygulayabilmeniz iin alternatif bir yaklam, denetimleri tutan pencerenin metin zelliklerini ayarlamaktr. Bunlar, FontFamily, FontSize ve FontWeight zelliklerini kapsar. Bununla birlikte, stiller, tetikleyiciler gibi ek kolaylklar salar ve yaz tipi ile ilikili zellikler ayarlamak zorunda olmazsnz. Bir pencere iin metin zellikleri belirtirseniz ve bu penceredeki denetimlere stil uygularsanz, denetimlerin stili pencere stiline gre ncelie sahip olur.

Bir WPF Uygulamas Nasl alr?


Bir Windows Forms uygulamas herhangi bir sayda form ierebilir: Visual Studio 2008te Project mensndeki Add Window komutunu kullanarak bir uygulamaya ek formlar ekleyebilirsiniz. Bir uygulama baladnda hangi formu grntleyeceini nereden bilir? Blm 1den hatrlarsanz, bu App.xaml dosyasnn amacdr. BellRingers projesi iin App.xaml dosyasn aarsanz, aadaki gibi olduunu grrsnz:
<Application x:Class=BellRingers.App xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml StartupUri=Window1.xaml> <Application.Resources> </Application.Resources> </Application>

Bir WPF uygulamas oluturduunuzda, derleyici bu XAML tanmn bir Application nesnesine dntrr. Application nesnesi, uygulamann sresini denetler ve uygulamann balangta grntleyecei formu oluturmaktan sorumludur. Application nesnesini, uygulama iin Main yntem salayan nesne olarak dnebilirsiniz. Anahtar zellik, Application nesnesinin yaratlmas gereken pencere iin XAML dosyasn belirten StartupUri zelliidir. Uygulamay oluturduunuzda, bu zellik, belirtilen WPF formunu yaratan ve aan koda evrilir. Farkl bir form grntlemek isterseniz, sadece StartupUri zelliinin deerini deitirmeniz gerekir. StartupUri zelliinin, bu XAML dosyasnda pencereyi gerekletiren snfa deil, XAML dosyasnn adna bavurduunu kavramak nemlidir. Snfn varsaylan ad Window1dir. Snf yeniden adlandrrsanz, dosya ad deimeyecektir (Window1.xaml olarak kalr). Benzer ekilde, dosya adn deitirirseniz, bu dosyada tanmlanan pencere snfnn ad deimez. Pencere snf ve XAML dosyas farkl adlara sahipse bu karmakla neden olabilir, bu nedenle yeniden adlandrmak istediinizde, tutarl olun, dosya ve pencere snf adlarnn her ikisini de deitirin.

430

Ksm IV

Windows Uygulamalar ile almak

Forma Denetimler Eklemek


imdiye kadar, bir form yarattnz, baz zellikleri ayarladnz, birka denetim eklediniz ve stil tanmladnz. Formu kullanl yapmak iin, biraz daha fazla denetim eklemeniz ve baz kodlar yazmanz gerekir. WPF ktphanesi eitli denetimlerin koleksiyonuna sahiptir. TextBox, ListBox, CheckBox ve ComboBox gibi baz denetimlerin amac olduka ak iken, dier daha gl denetimlere ok fazla aina olmayabilirsiniz.

WPF Denetimlerini Kullanmak


Bir sonraki altrmada, forma kullancnn an alma topluluu yeleri ile ilgili ayrntlar girdii denetimler ekleyeceksiniz. Her biri belirli trde veri giriine uygun olan eitli denetimler kullanacaksnz. yenin ilk adn ve soyadn girmek iin TextBox denetimlerini kullanacaksnz. Her ye, anlarn asld bir kuleye sahiptir. Middleshire blgesi birka kuleye sahiptir fakat liste statiktir. ok sk yeni kule eklenmeyeceini ve eski kulelerin de ok fazla kaldrlmadn umuyoruz. Bu tr veriyi ilemek iin en iyi denetim ComboBoxtr. Form ayrca, yenin kaptan (dier an alanlarla balanty salayan kii) kulesi olup olmadn da kaydeder. CheckBox, bunun iin en iyi denetim trdr; seilmi (True) ya da seilmemi (False) olabilir. pucu CheckBox denetimleri, IsThreeState zellii True olarak atanmadysa tam olarak

duruma sahip olabilir. durum, true, false ve nulldur. Bir ilikisel veritabanndan elde edilen bilgiyi grntlyorsanz bu durumlar kullanldr. Bir veritabanndaki tablodaki baz stunlar null deerlere olanak salar, tutulan deerin tanml olmadn ya da bilinmeyen deer olduunu gsterir.

Uygulama ayrca, yelerin toplulua ne zaman katldklar ve an alma deneyimleri (1 yla kadar, 1 ile 4 yl arasnda, 5 ile 9 yl arasnda ve 10 yl ya da daha fazla) olduuna dair istatistiksel bilgi toplar. yenin deneyimini gstermek iin seenek dmelerini kullanabilirsiniz (seenek dmeleri birbirini dlayan deerler kmesi salar). Eski Microsoft Windows Forms kitapl, tarihleri semek ve grntlemek iin DateTimePicker denetimi salar ve bu denetim, yenin toplulua katld tarihi gstermek iin kusursuzdur. Bununla birlikte, kk bir engel vardr: WPF ktphanesi bir edeer denetim salamaz. Bu ilevsellii salamak iin kendi denetiminizi uygulayabilirsiniz ya da bir WPF formuna DateTimePicker denetimi eklemek iin Windows Forms birlikte ilerliini ve WindowsFormsHost denetimini kullanabilirsiniz. Bu uygulamada sonraki yaklam benimseyeceksiniz. Son olarak, uygulama yenin alabildii tonlarn kaydn tutar (daha karma, bu tonlar an alma birlii tarafndan yntemler olarak adlandrlr). Bir an alc, ayn anda sadece bir an alsa da, kule kaptannn ynlendirmesi altnda an alanlar grubu kendi anlarn farkl

Blm 22

Windows Presentation Foundationa Giri

431

sralarda alarak basit bir mzik yapabilirler. eitli an alma yntemleri vardr ve Plain Bob, Reverse Canterbury, Grandsire, Stedman, Kent Treble Bob ve Old Oxford Delight gibi eski seslere sahiptir. Her geen gn yeni yntemler yazlr, bu nedenle yntemlerin listesi zamanla deiebilir. Gerek dnyada, bu listeyi bir veritabannda saklayacaksnz. Bu uygulamada, forma uygulayacanz yntemlerin kk bir seimini kullanacaksnz. (Veriyi Ynetmek balkl Ksm Vte bir veritabanndaki veriye nasl erieceinizi ve veriyi nasl alacanz greceksiniz.) Bu bilgiyi grntlemek ve yenin yntemi alp alamadn gstermek iin iyi bir denetim, CheckBox denetimlerinin listesini ieren ListBox denetimidir. Kullanc yenin ayrntlarn girdiinde, Add dmesi veriyi onaylayacak ve saklayacaktr. Kullanc, formdaki denetimleri sfrlamak ve girilen veriyi iptal etmek iin Clear tklayabilir.

Forma denetimler ekleyin


1. Design View penceresinde Window1.xamlin grntlendiinden emin olun. Formdan iki dme denetimini ve metin kutusu denetimini kaldrn. 2. XAML blmesinde, formun Height zelliini 470 olarak ve Width zelliini 600 olarak deitirin:
<Window x:Class=BellRingers.Window1 ... Title=... Height=470 Width=600> ... </Window>

3. Design View penceresinde Window1 formunu tklayn. Toolbox dan forma bir Label denetimi srkleyin ve sol st keye yakn bir yere yerletirin. Etiketi tam olarak konumlandramadnz ve boyutlandramadnz iin endielenmeyin, daha sonra bu ilemi birka denetim iin de yapacaksnz. 4. XAML blmesinde, etiket adn First Name olarak deitirin:
<Label ...>First Name</Label>

pucu Ayrca etiket tarafndan grntlenen metni ve Properties penceresindeki Content zelliini ayarlayarak birok dier denetimi de deitirebilirsiniz. 5. Design View penceresinde, Window1 formunu tklayn. Toolboxdan bir TextBox denetimini forma, etiketin sa tarafna srkleyin. pucu Hizalama denetimlerine yardmc olmak iin Design View penceresi tarafndan grntlenen klavuz izgilerini kullanabilirsiniz. (Klavuz izgileri siz form zerinde denetimi srkledikten sonra grntlenir.)

432

Ksm IV

Windows Uygulamalar ile almak

6. XAML blmesinde, metin kutusunun Name zelliini, aada gsterildii gibi, firstName olarak deitirin:
<TextBox ... Name=firstName .../>

7. Forma ikinci bir Label denetimi ekleyin. firstName metin kutusunun sana yerletirin. XAML blmesinde, etiket metnini Last Name olarak deitirin. 8. Forma baka bir TextBox denetimi ekleyin ve Last Name etiketinin sana yerletirin. XAML blmesinde, bu metin kutusunun Name zelliini lastName olarak deitirin. 9. Forma nc bir Label denetimi ekleyin ve dorudan First Name etiketi altna yerletirin. XAML blmesinde, etiket metnini Tower olarak deitirin. 10. Forma bir ComboBox denetimi ekleyin. firstName metin kutusunun altna ve Tower etiketinin sana yerletirin. XAML blmesinde, bu alan kutunun Name zelliini towerNames olarak deitirin. 11. Forma bir CheckBox denetimi ekleyin. lastName metin kutusunun altna ve towerNames alan kutusunun sana yerletirin. XAML blmesinde, alan kutunun Name zelliini isCaptain olarak deitirin ve bu onay kutusunda grntlenen metni Captain olarak deitirin. 12. Forma drdnc Label denetimini ekleyin ve Tower etiketinin altna yerletirin. XAML blmesinde, bu etiketin metnini Member Since olarak deitirin. 13. Solution Explorer da, BellRingers projesi altndaki References klasrn farenin sa dmesiyle tklayn ve daha sonra Add Reference tklayn. Add Reference iletiim kutusunda .NET sekmesini tklayn, CTRL tuunu basl tutarak System.Windows.Forms ve WindowsFormsIntegration derlemelerini sein ve daha sonra OKi tklayn. Aadaki basamaklarda, DateTimePicker denetimini tutmak iin forma bir WindowsFormsHost denetimi ekleyeceksiniz. Bu denetimler uygulamann System. Windows.Forms ve WindowsFormsIntegration derlemelerine bavurmasn gerektirir. 14. XAML blmesinde, aada koyu harflerle gsterilen XML ad alan bildirimini Window1 formuna ekleyin. Bu bildirim, Windows Forms ktphanesindeki trleri kapsam iine getirir ve wfi bu ad alan iin takma ad olarak saptar:
<Window x:Class=BellRingers.Window1 xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml xmlns:wf=clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms Title=...> ... </Window>

Blm 22

Windows Presentation Foundationa Giri

433

15. Build mensnde Build Solution tklayn. Uygulamaya Windows Forms denetimleri eklemeden nce, Visual Studio 2008in System.Windows.Forms ad alanna bavurular doru bir ekilde analiz edebilmesi iin bu basamak gereklidir. 16. Toolboxda, Controls blmnde, forma WindowsFormsHost denetimi ekleyin ve towerNames alan kutusunun altna yerletirin. Not WindowsFormsHost denetimini yerletirmenizden sonra, denetim kullanlabilir hale gelir. Bu denetimin yerletirilmesi konusunda endielenmeyin nk bir sonraki altrmada XAML tanmnda denetimlerin zelliklerini dzenleyeceksiniz. Ek olarak, XAML blmesinde, WindowsFormsHostun bulunamadn syleyen bir uyar grntlenebilir. System. Windows.Forms ve WindowsFormsIntegration derlemelerine bavurular eklediiniz srece bu uyary ihmal edebilirsiniz. 17. XAML blmesinde, WindowsFormsHost denetiminin Name zelliini hostMemberSince olarak deitirin. Yine XAML blmesinde, WindowsFormsHost denetimine alt zellik olarak bir Windows Forms DateTimePicker denetimi ekleyin ve memberSince olarak adlandrn. (Dier alt zelliklerde olduu gibi, WindowsFormsHost denetiminin kapatma etiket snrlaycsn (/>), sradan snrlayc karakteri olarak deitirmeniz ve bir </WindowsFormsHost> etiketi eklemeniz gerekir.) WindowsFormsHost denetimi iin tamamlanm XAML kodu u ekilde grnmelidir:
<WindowsFormsHost ... Name=hostMemberSince ...> <wf:DateTimePicker Name=memberSince/> </WindowsFormsHost>

DateTimePicker denetimi form zerinde grnmeli ve geerli tarihi gstermelidir. Visual Studio pencerelerinizin nasl dzenlendiine bal olarak, yeni denetimi grmek iin sayfay aaya doru ekmeniz gerekebilir. 18. Forma Toolboxn Containers blmnden bir GroupBox denetimi ekleyin ve Member Since etiketinin altna yerletirin. XAML blmesinde, grup kutusunun Name zelliini yearsExperience olarak ve Header zelliini de Experience olarak deitirin. Header zellii form zerinde grup kutusu iin etiketi deitirir. 19. Forma StackPanel denetimi ekleyin ve yearsExperience grup kutusu iine yerletirin. XAML blmesinde, GroupBox denetimi iin XAML kodu iinde StackPanel denetiminin meydana geldiini dorulayn:
<GroupBox Header=Experience ... Name=yearsExperience ...> <StackPanel ... Name=stackPanel1 ... /> </GroupBox>

434

Ksm IV

Windows Uygulamalar ile almak

20. Forma bir RadioButton denetimi ekleyin ve yeni eklediiniz StackPanel denetimine yerletirin. StackPanel denetimine RadioButton denetimi daha ekleyin. Otomatik olarak yukardan aaya doru sralanmaldr. 21. XAML blmesinde, her seenek dmesinin Name zelliini ve grntledii metni aadaki gibi deitirin:
<GroupBox...> <StackPanel ...> <RadioButton <RadioButton <RadioButton <RadioButton </StackPanel> </GroupBox>

... ... ... ...

Name=novice ...>Up to 1 year</RadioButton> Name=intermediate ...>1 to 4 years</RadioButton> Name=experienced ...>5 to 9 years</RadioButton> Name=accomplished ...>10 or more years</RadioButton>

22. Forma bir ListBox denetimi ekleyin ve GroupBox denetiminin sana yerletirin. XAML blmesinde, liste kutusunun Name zelliini methods olarak deitirin. 23. Forma bir Button denetimi ekleyerek GroupBox denetiminin altna, formun sol alt kesindeki dme yaknna yerletirin. XAML blmesinde, bu dmenin Name zelliini add olarak ve bu dme zerindeki metni de Add olarak deitirin. 24. Forma baka bir Button denetimi ekleyerek, Add dmesinin sandaki dme yanna yerletirin. XAML blmesinde, bu dmenin Name zelliini clear olarak ve bu dme tarafndan grntlenen metni de Clear olarak deitirin. Forma tm gerekli denetimleri eklediniz. Bir sonraki basamak yerleimi dzenlemektir. Aadaki tabloda, her bir denetime atamanz gereken deerler ve yerleim zellikleri listelenmitir. XAML blmesini ya da Properties penceresini kullanarak bu deiiklikleri yapn. Denetimlerin kenar boluklar ve hizalamas, kullanc formu yeniden boyutlandrrsa, denetimler yerinde kalacak ekilde tasarlanmtr. Seenek dmeleri iin belirlenmi kenar boluu deerlerinin, StackPanel denetiminde nceki eye bal olduuna dikkat edin; seenek dmeleri StackPanel denetiminin st ksmndan 10 birim uzaktadr ve seenek dmeleri arasnda da yatay olarak 20 birim mesafe vardr.
Denetim
label1

zellik
Height Margin VerticalAlignment HorizontalAlignment Width

Deer
23 29, 25, 0, 0 Top Left 75 21 121, 25, 0, 0

firstName

Height Margin

Blm 22

Windows Presentation Foundationa Giri

435

Denetim

zellik
VerticalAlignment HorizontalAlignment Width

Deer
Top Left 175 23 305, 25, 0, 0 Top Left 75 21 380, 25, 0, 0 Top Left 175 23 29, 72, 0, 0 Top Left 75 21 121, 72, 0, 0 Top Left 275 21 420, 72, 0, 0 Top Left 75 23 29, 134, 0, 0 Top

label2

Height Margin VerticalAlignment HorizontalAlignment Width

lastName

Height Margin VerticalAlignment HorizontalAlignment Width

label3

Height Margin VerticalAlignment HorizontalAlignment Width

towerNames

Height Margin VerticalAlignment HorizontalAlignment Width

isCaptain

Height Margin VerticalAlignment HorizontalAlignment Width

Label4

Height Margin VerticalAlignment

436

Ksm IV

Windows Uygulamalar ile almak

Denetim

zellik
HorizontalAlignment Width

Deer
Left 90 23 121, 134, 0, 0 Top Left 275 200 29, 174, 0, 0 Top Left 258 151 224 16 0, 10, 0, 0 120 16 0, 20, 0, 0 120 16 0, 20, 0, 0 120 16 0, 20, 0, 0 120 200 310, 174, 0, 0 Top Left 245

hostMemberSince

Height Margin VerticalAlignment HorizontalAlignment Width

yearsExperience

Height Margin VerticalAlignment HorizontalAlignment Width

stackPanel1

Height Width

Novice

Height Margin Width

Intermediate

Height Margin Width

Experienced

Height Margin Width

Accomplished

Height Margin Width

Methods

Height Margin VerticalAlignment HorizontalAlignment Width

Blm 22

Windows Presentation Foundationa Giri

437

Denetim
Add

zellik
Height Margin VerticalAlignment HorizontalAlignment Width

Deer
23 188, 388, 0, 0 Top Left 75 23 313, 388, 0, 0 Top Left 75

Clear

Height Margin VerticalAlignment HorizontalAlignment Width

Son olarak, denetimlere stil uygulayacaksnz. Dmeler ve metin kutular gibi denetimler iin bellRingersStyle stilini kullanabilirsiniz, fakat etiketler, alan kutu ve seenek dmeleri muhtemelen gri arkaplanda grntlenmemelidir.

Denetimlere stiller uygulayn ve formu test edin


1. XAML blmesinde, <Windows.Resources> esine aadaki kodda koyu renkle gsterilen bellRingersFontStyle stilini uygulayn. Mevcut bellRingersStyle stilini olduu yerde brakn. Bu stilin, sadece bu stile bavuran denetimlerin yaz tipini deitirdiine dikkat edin.
<Window.Resources> <Style x:Key=bellRingersFontStyle TargetType=Control> <Setter Property=FontFamily Value=Comic Sans MS/> </Style> <Style x:Key=bellRingersStyle TargetType=Control> ... </Style> </Window.Resources>

2. XAML blmesinde, label1 denetimine, aada gsterildii gibi, bellRingersFontStyle stilini uygulayn:
<Label Style={StaticResource bellRingersFontStyle} ...>First Name</Label>

Ayn stili aadaki denetimlere de uygulayn:


n n n

label2 label3 isCaptain

438

Ksm IV

Windows Uygulamalar ile almak


n n n n

towerNames label4 yearsExperience methods

Not yearsExperience grup kutusuna ve methods liste kutusuna stil uygulamak, otomatik olarak stilin bu denetimlerde grntlenen eler tarafndan kullanlmasna neden olur. 3. Aadaki denetimlere bellRingersStyle stilini uygulayn:
n n n n

firstName lastName add clear

4. Debug mensnde Start Without Debuggingi tklayn. Form altnda aadaki resimdeki gibi grnmelidir:

Methods liste kutusunun u anda bo olduuna dikkat edin. Sonraki altrmada liste kutusunu doldurmak iin kod ekleyeceksiniz. 5. Tower alan kutusundaki aa oku tklayn. Kulelerin listesi u anda botur. Ayn ekilde, sonraki altrmada bu alan kutuyu doldurmak iin kod yazacaksnz. 6. Formu kapatn ve Visual Studio 2008e dnn.

Blm 22

Windows Presentation Foundationa Giri

439

zellikleri Dinamik Olarak Deitirmek


imdiye kadar, zellikleri statik olarak deitirmek iin Design View penceresini, Properties penceresini ve XAML blmesini kullandnz. Form altnda her denetimin deerini varsaylan balang deerine sfrlamak yararl olur. Bunu yapmak iin, biraz kod yazmanz gerekir. Aadaki altrmalarda, Reset adl private bir yntem yaratacaksnz. Daha sonra, Reset yntemini form ilk altnda ve kullanc Clear dmesini tkladnda aracaksnz.

Reset yntemini yaratn


1. Design View penceresinde, formu farenin sa dmesiyle tklayn ve daha sonra View Codeu tklayn. Code and Text Editor penceresi alr ve Window1.xaml.cs dosyas grntlenir, bylece forma C# kodunu ekleyebilirsiniz. 2. Window1 snfna, aada koyu harfle gsterilen Reset yntemini ekleyin:
public partial class Window1 : Window { ... public void Reset() { firstName.Text = String.Empty; lastName.Text = String.Empty; } }

Bu yntemdeki iki ifade, firstName ve lastName metin kutularnn Text zelliine bo bir dize atayarak, metin kutularnn bo olduunu garantiler. Ayrca, form zerindeki dier denetimler iin zellikleri balatmanz ve towerNames alan kutusunu ve methods liste kutusunu doldurmanz gerekir. Hatrlarsanz, towerName alan kutusu, Middleshire blgesindeki tm an kulelerinin bir listesini ierecektir. Bu bilgi genelde bir veritabannda tutulacaktr ve kulelerin listesini elde etmek iin kod yazacaksnz ve ComboBox dolduracaksnz. Bu rnek iin, uygulama kodlanm bir koleksiyon kullanacaktr. Bir ComboBox, grntlenen verinin listesini ieren Items adnda bir zellie sahiptir. 3. Window1 snfna, aada koyu harfle gsterilen, kule adlarn listesini ieren, towers adl dize dizisini ekleyin:
public partial class Window1 : Window { private string[] towers = { Great Shevington, Little Mudford, Upper Gumtree, Downley Hatch }; ... }

440

Ksm IV

Windows Uygulamalar ile almak

4. Reset ynteminde yazdnz koddan sonra, towerNames alr kutuyu temizlemek iin aadaki ifadeleri yazn (bu ifadeleri yazmanz nemlidir, nk aksi takdirde listede ok sayda kopya deerler olabilir) ve towers dizisinde bulunan kuleleri ekleyin. foreach dngsnden sonraki ifade, ilk kulenin varsaylan deer olarak gsterilmesine neden olur:
public void Reset() { ... towerNames.Items.Clear(); foreach (string towerName in towers) { towerNames.Items.Add(towerName); } towerNames.Text = towerNames.Items[0] as string; }

Not Ayrca,aadaki gibi, bir alr kutunun XML tanmnda, tasarm srasnda kodlanacak deerleri belirleyebilirsiniz:
<ComboBox Text=towerNames> <ComboBox.Items> <ComboBoxItem> Great Shevington </ComboBoxItem> <ComboBoxItem> Little Mudford </ComboBoxItem> <ComboBoxItem> Upper Gumtree </ComboBoxItem> <ComboBoxItem> Downley Hatch </ComboBoxItem> </ComboBox.Items> </ComboBox>

5. methods liste kutusunu an alma yntemlerinin bir listesiyle doldurmanz gerekir. Alr kutu gibi, liste kutusu da, grntlenen deerlerin koleksiyonunu ieren, Items adnda bir zellie sahiptir. Ayrca, ComboBox gibi, bir veritabanndan doldurulabilirdi. Ancak

Blm 22

Windows Presentation Foundationa Giri

441

daha nceki gibi, bu rnek iin baz kodlanm deerler uygulayacaksnz. Aada koyu harfle gsterilen, yntemlerin listesini ieren dize dizisini Window1 snfna ekleyin:
public partial class Window1 : Window { ... private string[] ringingMethods = { Plain Bob, Reverse Canterbury, Grandsire, Stedman, Kent Treble Bob, Old Oxford Delight, Winchendon Place, Norwich Surprise, Crayford Little Court }; ... }

6. methods liste kutusu, sradan metin dizelerinden ok onay kutularnn listesini grntlemelidir. WPF modelinin esneklii ile, liste kutular ve alr kutular gibi denetimler iin eitli farkl trlerde ierik belirleyebilirsiniz. methods liste kutusunu, ringingMethods dizisindeki yntemlerle doldurmak iin Reset yntemine aada koyu harfle gsterilen kodu ekleyin. Bu defa, her enin bir onay kutusu olduuna dikkat edin. Onay kutusunun Content zelliini ayarlayarak, onay kutusu tarafndan grntlenen metni ve Margin zelliini ayarlayarak da listedeki eler arasndaki boluu (bu kod her eden sonra 10 birim boluk ekler) belirleyebilirsiniz:
public void Reset() { ... methods.Items.Clear(); CheckBox method; foreach (string methodName in ringingMethods) { method = new CheckBox(); method.Margin = new Thickness(0, 0, 0, 10); method.Content = methodName; methods.Items.Add(method); } }

Not Birok WPF denetimi, o denetim tarafndan grntlenen deeri okumak ve ayarlamak iin kullanabileceiniz bir Content zelliine sahiptir. Bu zellik tam olarak bir nesnedir, yani grntlemek iin mantkl bir tr olduu srece, hemen hemen herhangi bir tr atayabilirsiniz. 7. isCaptain onay kutusu, false varsaylan deerinde olmaldr. Bunun iin, IsChecked zelliini ayarlamanz gerekir. Reset yntemine aada koyu renkle gsterilen ifadeyi ekleyin:
public void Reset() { ... isCaptain.IsChecked = false; }

442

Ksm IV

Windows Uygulamalar ile almak

8. Form, yelerin an alma deneyimlerini yl says olarak gsteren drt seenek dmesi ierir. Seenek dmesi, true ya da false deer iermesi bakmndan CheckBoxa benzer. Bununla birlikte, seenek dmelerini bir arada bir GroupBox iine yerletirdiinizde, gleri artar. Bu durumda, seenek dmeleri birbirini dlayan bir koleksiyon biimlendirir; en ok, grupta sadece bir seenek dmesi seilebilir (true olarak atanr) ve dierlerinin tm otomatik olarak temizlenir (false olarak atanr). Varsaylan ayar olarak, dmelerin hibiri seilmeyecektir. novice seenek dmesinin IsChecked zelliini ayarlayarak bunu dzeltmelisiniz. Aada koyu renkle gsterilen ifadeyi Reset yntemine ekleyin:
public void Reset() { ... novice.IsChecked = true; }

9. Member Since DateTimePicker denetiminin varsaylan ayar olarak geerli tarihe ayarlandndan emin olmalsnz. Bunu, denetimin Value zelliini ayarlayarak yapabilirsiniz. Geerli tarihi, DateTime snfnn statik Today ynteminden elde edebilirsiniz. DateTimePicker denetimine balang deeri atamak iin Reset yntemine, aada koyu harfle gsterilen kodu ekleyin.
public void Reset() { ... System.Windows.Forms.DateTimePicker memberDate = hostMemberSince.Child as System.Windows.Forms.DateTimePicker; memberDate.Value = DateTime.Today; }

Bir WindowsFormsHost kapsaycsnda bir nesneye erimek iin, kapsaycnn Child zelliine bavurarak daha sonra uygun bir tre dntrdnze dikkat edin. Ayrca, DateTimePicker snfnn System.Windows.Forms ad alannda tanmlandna dikkat edin. Tipik olarak, bir snf tanmlayan dosyaya, snfn ad alann kapsam iine almak iin bir using ifadesi ekleyin, fakat bir WPF uygulamas ile Windows Forms denetimlerini birletirdiinizde bunu yapmamalsnz. Bunun nedeni, System.Windows.Forms ad alannn, WPF ktphanesindeki denetimlerle ayn ad kullanan birok denetim iermesi, bu nedenle using ifadesi eklemenin bu denetimlere olan bavurularn tmn belirsiz yapacak olmasdr! 10. Son olarak, form ilk grntlendiinde arlacak olan Reset yntemini dzenlemeniz gerekir. Bunu yapmann en iyi yeri, Window1 kurucusudur. InitializeComponent yntemini aran ifadeden sonra Reset yntemine bir ar ekleyin:
public Window1() { InitializeComponent(); this.Reset(); }

Blm 22

Windows Presentation Foundationa Giri

443

11. Debug mensnde Start Without Debuggingi tklayarak projeyi oluturun ve altrn. 12. Form aldnda, Tower alr kutusunu tklayn. an kulelerinin listesini greceksiniz, daha sonra bunlardan birini seebilirsiniz. 13. Member Since tarih/zaman seicisinin sa tarafndaki aa okunu tklayn. Bir takvim greceksiniz. Varsaylan deer geerli tarih olacaktr. Bir tarihi tklayarak, ay semek iin oklar kullanabilirsiniz. Ayrca, aylar alr liste olarak grntlemek iin ay adn tklayabilirsiniz. Yl tklayarak, saysal yukar aa denetimi kullanarak yl seebilirsiniz. 14. Experience grup kutusundaki her seenek dmesini tklayn. Ayn anda birden fazla seenek dmesi seebileceinize dikkat edin. 15. Methods liste kutusunda, uygun onay kutusunu semek iin yntemlerden bazlarn tklayn. Bir yntemi ikinci defa tklarsanz, uygun onay kutusu temizlenecektir. 16. Add ve Clear dmelerini tklayn. Bu dmeler u an hibir ey yapmaz. Bu blmdeki altrmalarn sonuncusunda bu ilevsellii ekleyeceksiniz. 17. Formu kapatn ve Visual Studio 2008e dnn.

Bir WPF Formda Olaylar lemek


Microsoft Visual Basic, Microsoft Foundation Classes (MFC) ya da Windows iin GUI uygulamalar oluturmakta kullanlan dier herhangi bir arala ilgilendiyseniz Windowsun kodu ne zaman altracan belirlemek iin olay ynlendirmeli (event-driven) model kullandnn farkndasnzdr. Blm 17de, kendi olaylarnz nasl yaynlayacanz ve onlara nasl abone olacanz grdnz. WPF formlar ve denetimleri abone olabileceiniz kendi nceden tanml olaylarn ierirler ve bu olaylar birok kullanc arabiriminin gereksinimlerini ilemek iin yeterli olmaldr.

Windows Formsda Olaylar lemek


Bir program gelitirici olarak greviniz, uygulamanzla ilgili olduunu hissettiiniz olaylar yakalamak ve bu olaylara tepki gsteren kodlar yazmaktr. Sk rastlanan bir rnek, bir kullanc fare ile tkladnda ya da dme etkinken Enter tuuna bastnda Somebody clicked me (Birileri dmeye bast) olayn balatan Button denetimidir. Dmenin bireyler yapmasn istiyorsanz, bu olaya tepki veren kodu yazmalsnz. Bu, bu blmn son altrmasnda yapacanz eydir.

444

Ksm IV

Windows Uygulamalar ile almak

Clear dmesinin Click olayn ileyin


1. Design View penceresinde Window1.xaml dosyasn grntleyin. Form zerindeki Clear dmesini ift tklayn. Code and Text Editor penceresi belirir ve clear_Click adnda bir yntem yaratr. Bu, kullanc Clear dmesini tkladnda arlacak olan bir olay yntemidir. Olay ynteminin iki parametre aldna dikkat edin: sender parametresi (bir object) ve ayrca bir bamsz deiken parametresi (bir RoutedEventArgs nesnesi). WPF alma zaman, bu parametreleri olayn kayna hakknda bilgi ve olay ilerken yararl olabilecek ek bilgilerle birlikte dolduracaktr. Bu altrmada bu parametreleri kullanmayacaksnz. WPF denetimleri eitli olaylara yol aabilir. Design View penceresinde bir formu ya da bir denetimi ift tkladnzda, Visual Studio, denetimin varsaylan olay iin olay ynteminin kkn retir; bir dme iin varsaylan olay, Click olaydr. (Bir metin kutusu denetimini ift tklarsanz, Visual Studio, TextChanged olayn ilemek iin olay ynteminin kkn retir.) 2. Kullanc Clear dmesini tkladnda, formun varsaylan deerlerine sfrlanmasn istersiniz. Aada koyu harflerle gsterildii gibi, clear_Click ynteminin gvdesinde Reset yntemini arn:
private void clear_Click(object sender, RoutedEventArgs e) { this.Reset(); }

Kullanclar, yenin tm verilerini doldurduktan sonra bilgiyi kaydetmek iin Add dmesini tklayacak. Add dmesi iin Click olay, girilen verinin anlaml olduundan (rnein, bir kule kaptannn bir yldan az deneyimi olabilir mi?) emin olmak iin geerliliini denetlemelidir ve veri geerli ise, bir veritabanna ya da dier kalc saklama ortamna gndermek iin veriyi dzenlemelidir. Verinin geerliliinin denetlenmesi ve saklanmas ile ilgili daha fazlasn sonraki blmlerde reneceksiniz. imdilik, Add dmesinin Click olay iin kod, veri giriini yanstan bir ileti kutusu grntler. 3. Window1.xaml formunu grntleyen Design View penceresine dnn. XAML blmesinde, Add dmesini tanmlayan eyi bulun ve aada koyu harflerle gsterilen kodu yazmaya balayn:
<Button ... Click=>Add</Button>

Click= teriminden sonra, trnak iaretini yazdnzda, <New Event Handler> ve clear_

Click elerini gsteren bir ksayol mensnn belirdiine dikkat edin. ki dme ortak bir eylem gerekletirirse, iki dme arasnda ayn olay ileyicisini (rnein clear_Click) paylaabilirsiniz. Tmyle yeni bir olay ileme yntemi retmek isterseniz, <New Event Handler> komutunu seebilirsiniz.

Blm 22

Windows Presentation Foundationa Giri

445

4. Ksayol mensnde <New Event Handler> komutunu ift tklayn. XAML kodunda dme iin add_Click metni belirir. Not Bir dme iin Click olayn ilemekle snrl deilsiniz. Bir denetim iin XAML kodu dzenlediinizde, IntelliSense listesi denetim iin zellikler ve olaylar grntler. Click olayndan baka bir olay ilemek iin, olayn adn yazn ve daha sonra bu olay ilemek iin istediiniz yntemin adn yazarak yntemi sein. Her denetim tarafndan desteklenen olaylarn tam listesi iin, Visual Studio 2008 belgelerine bakn. 5. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. Window1 snfna add_Click ynteminin eklendiine dikkat edin. pucu Olay ileyici yntemleri iin Visual Studio 2008 tarafndan retilen varsaylan adlar
kullanmak zorunda deilsiniz. Ksayol mensnden <New Event Handler> komutunu tklamak yerine, yntemin adn yazabilirsiniz. Ancak, daha sonra yntemi pencere snfna eklemeniz gerekir. Bu yntem doru imzaya sahip olmak zorundadr; bir void dndrmeli ve bir object parametresi ve RoutedEventArgs parametresi olmak zere iki bamsz deiken almaldr

nemli Daha sonra, Window1.xaml.cs dosyasndan add_Click gibi bir olay yntemini
kaldrmaya karar verirseniz, uygun denetimin XAML tanmn dzenlemeniz ve olayn Click=add_Click bavurusunu kaldrmanz gerekir; aksi takdirde, uygulamanz derlenmez.

6. add_Click yntemine aadaki kodu ekleyin:


private void add_Click(object sender, RoutedEventArgs e) { string nameAndTower = String.Format( Member name: {0} {1} from the tower at {2} rings the following methods:, firstName.Text, lastName.Text, towerNames.Text); StringBuilder details = new StringBuilder(); details.AppendLine(nameAndTower); foreach (CheckBox cb in methods.Items) { if (cb.IsChecked.Value) { details.AppendLine(cb.Content.ToString()); } } MessageBox.Show(details.ToString(), Member Information); }

446

Ksm IV

Windows Uygulamalar ile almak

Bu kod blou, yenin adn ve bal olduu kulenin adn saklayan, nameAndTower adnda bir string deikeni yaratr. Kodun, metin kutusunun Text zelliine ve alr kutu denetimine erierek bu denetimlerin geerli deerlerini nasl okuduuna dikkat edin. Ayrca, kod sonular sfrlamak iin statik String.Format yntemini kullanr. String.Format yntemi, biimlendirilmi dizeyi ekranda grntlemek yerine sonu olarak dndrmesi dnda, Console.WriteLine yntemi ile ayn ekilde alr. Kod daha sonra details adnda bir StringBuilder nesnesi yaratr. Yntem, grntleyecei bilginin dize gsterimini oluturmak iin bu StringBuilder nesnesini kullanr. nameAndTower dizesindeki metin, balang olarak details nesnesini yerletirmek iin kullanlr. Kod daha sonra, methods liste kutusundaki Items koleksiyonu zerinden yinelenir. Hatrlarsanz, bu liste kutusu, onay kutusu denetimlerini ierir. Her onay kutusu incelenir ve kullanc tarafndan seilmise, onay kutusunun Content zelliindeki metin details StringBuilder nesnesine eklenir. Not StringBuilder nesnesi yerine sradan dize birletirme kullanabilirdiniz, fakat StringBuilder snf ok daha etkilidir ve bu kodda gerekli trde grevleri gerekletirmek iin nerilen bir yaklamdr. .NET Frameworkde ve C#da string veri tr sabittir; deeri bir dize iinde deitirdiinizde, alma zaman gerekte deitirilmi deeri ieren yeni bir dize yaratr ve daha sonra eski dizeyi terk eder. Bir dizeyi tekrar tekrar deitirmek, dize her deiiklikte bellekte oluturulmak zorunda olduundan kodunuzun verimsiz olmasna neden olabilir (eski dizelerde sonuta p toplama gerekleecektir). System.Text ad alanndaki StringBuilder snf bu verimsizlii nlemek iin tasarlanmtr. Her seferinde yeni bir nesne yaratmak zorunda kalmadan, Append, Insert ve Remove yntemlerini kullanarak StringBuilder nesnesine karakterler ekleyebilir ve karabilirsiniz. Son olarak, MessageBox snf, ekranda iletiim kutularn grntlemek iin statik yntemler salar. Burada kullanlan Show yntemi, ileti kutusunun gvdesindeki details dizesinin ieriini grntler. Balk ara ubuunda Member Information yazacaktr. Show, bir ar yklenmi yntemdir ve ileti kutusunda gstermek iin belirleyebileceiniz eitli simgeler ve dmeler ierir. 7. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 8. yenin ilk ad ve soyadn yazn, bir kule ve birka yntem sein. Add dmesini tklayn ve yeni yenin bilgilerini ve yeni yenin alabildii yntemleri gsteren Member Information ileti kutusunun belirdiini dorulayn. 9. Clear dmesini tklayn ve formdaki denetimlerin varsaylan deerlere sfrlandn dorulayn. 10. Formu kapatn ve Visual Studio 2008e dnn.

Blm 22

Windows Presentation Foundationa Giri

447

Bu blmdeki son altrmada, pencereyi kapatan Closing olayn ilemek iin bir olay ileyici ekleyeceksiniz, bylece kullanclar uygulamay gerekten sonlandrmak istediklerini onaylayabilir. Closing olay, kullanc formu kapatma giriiminde bulunduunda, fakat form gerekte kapanmadan nce ortaya kar. Kullancy kaydedilmemi veriyi kaydetmesi iin uyarmak ya da formu gerekten kapatmak isteyip istemediini sormak iin bu olay kullanabilirsiniz.

Form iin Closing olayn ileyin


1. Design View penceresinde, XAML blmesinde, Window1 penceresinin XAML tanmna aadaki kodu yazmaya balayn:
<Window x:Class=BellRingers.Window1 ... Title=... ... Closing=>

2. Trnak iaretini yazdktan sonra ksayol mens grndnde, <New Event Handler> komutunu ift tklayn. Visual Studio, Window_Closing adnda bir olay yntemi retir ve aadaki gibi formun Closing olay ile ilikilendirir:
<Window x:Class=BellRingers.Window1 ... Title=... ... Closing=Window_Closing>

3. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. Window1 snfna, Window_Closing olay ynteminin kk eklenir:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { }

Bu yntemin ikinci parametresinin CancelEventArgs trne sahip olduuna dikkat edin. CancelEventArgs snf, Cancel adnda bir Boolean zelliine sahiptir. Olay ileyicideki Canceli true olarak ayarlarsanz, olay ileyici bittiinde form kapanr. 4. memberFormClosing yntemine aada koyu harflerle gsterilen ifadeleri ekleyin:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { MessageBoxResult key = MessageBox.Show( Are you sure you want to quit, Confirm, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); e.Cancel = (key == MessageBoxResult.No); }

448

Ksm IV

Windows Uygulamalar ile almak

Bu ifadeler, kullancya uygulamay kapatmak isteyip istemediini soran bir ileti kutusu gsterir. leti kutusu, Yes ve No dmeleri ve bir soru iareti simgesi ierir. Son parametre olan MessageBoxResult.No, kullanc Enter tuuna basarsa varsaylan dmeyi gsterir (kullanc yeni yazd verileri kazara kaybetmektense formu kapatmamay ister). Kullanc her iki dmeyi de tkladnda, ileti kutusu kapanacak ve tklanan dme yntemin deeri olarak dnecektir (MessageBoxResult olarak-hangi dmenin tklandn tanmlayan numaralandrma). Kullanc Noyu tklarsa, ikinci ifade, formun kapanmasn engelleyen, CancelEventArgs parametresinin (e) Cancel zelliini true olarak atayacaktr. 5. Uygulamay altrmak iin Debug mensnde Start Without Debuggingi tklayn. 6. Formu kapatmaya aln. Beliren ileti kutusunda Noyu tklayn. Form almaya devam etmelidir. 7. Formu kapatmay tekrar deneyin. Bu defa, ileti kutusunda Yesi tklayn. Form kapanr ve uygulama sonlanr. levsel kullanc arabirimi oluturmak iin gerekli WPF zelliklerinin kullanmn grdnz. WPF, burada grdmz zelliklerden daha fazlasn, zellikle iki boyutlu ve boyutlu grafikler ve animasyon ile ilgili ok daha fazla zellik ierir.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 23e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 22

Windows Presentation Foundationa Giri

449

Blm 22 Hzl Bavuru


Bunun in
Bir WPF uygulamas yaratmak Forma denetimler eklemek Bir formun ya da denetimin zelliklerini deitirmek

unu Yapn
WPF Uygulama ablonu kullann. Denetimi Toolboxdan forma srkleyin. Design View penceresinde formu ya da denetimi tklayn. Daha sonra aadakilerden birini yapn: n Properties penceresinde, deitirmek istediiniz zellii sein ve yeni deeri girin. n XAML blmesinde, <Window> esinde ya da denetimi tanmlayan ede zellii ve deeri belirleyin Aadakilerden birini yapn: n View mensnde, Codeu tklayn. n n Design View penceresini farenin sa dmesiyle tklayn ve sonra da View Codeu tklayn. Solution Explorerda, formun .xaml dosyasnn klasrn geniletin ve grnen .xaml.cs dosyasn ift tklayn.

Formun arkasndaki koda gz gezdirmek

Birbirini dlayan seenek dmeleri tanmlamak C# kodu kullanarak bir alr kutu ya da liste kutusu doldurmak

Forma StackPanel gibi bir blme ekleyin. Blmeye seenek dmeleri ekleyin. Ayn blmedeki tm seenek dmeleri birbirini dlayandr. Items zelliinin Add yntemini kullann. rnein:
towerNames.Items.Add(Upper Gumtree);

Listenin mevcut ieriini sakl tutmak isteyip istemediinize bal olarak, ilk nce Items zelliini temizlemeniz gerekebilir. rnein:
towerNames.Items.Clear();

Bir onay kutusu ya da seenek dmesi denetimini balatmak Bir denetim ya da form iin bir olay ilemek

IsChecked zelliini true ya da false olarak atayn. rnein:


novice.IsChecked = true;

XAML blmesinde, olay belirleyen kodu ekleyin ve daha sonra ya mevcut yntemden uygun imzaya sahip olan sein ya da ortaya kan ksayol mensnde <Add New Event> komutunu tklayarak yaratlan olay ynteminde olay ileyen kodu yazn.

Blm 23

Menler ve letiim Kutularyla almak


Bu blm tamamladktan sonra renecekleriniz:
n

Microsoft Windows Presentation Foundation (WPF) uygulamalar iin, Menu ve MenuItem snflarn kullanarak menler yaratmak ve dzenlemek. Kullanc bir men komutunu tkladnda ilemleri gerekletirmek iin men olaylarna tepki vermek. ContextMenu snfn kullanarak ierik duyarl alan pencere menler yaratmak. Menleri kod zerinden deitirmek ve dinamik menler yaratmak. Kullanclarn dosya ad girmesi iin uygulamanzda Windows ortak iletiim kutularn kullanmak.

n n n

Blm 22de denetimleri ve olaylar seilebilir yapan bir WPF uygulamasnn nasl yaratlacan grdnz. Birok profesyonel Microsoft Windows uygulamas ayrca komutlar ve seenekler ieren ve kullancya uygulamayla ilgili birok deiik grevi yerine getirme olana veren menler sunar. Bu blmde, menlerin nasl yaratldklarn ve menleri Menu denetimini kullanarak formlara nasl ekleyeceinizi reneceksiniz. Kullanc mendeki bir komutu tkladnda nasl tepki verileceini greceksiniz. Etkin konuma gre ierikleri deien alan menler yaratmay reneceksiniz. Son olarak, Windows Forms kitaplnn bir paras olarak salanan ortak iletiim snflarn reneceksiniz. Bu iletiim snflar, dosya ve yazclar gibi sk kullanlan eler iin kullancnn hzl, kolay ve tandk bir yolla bilgi girmesini salamanza olanak verir.

Men Temel lkeleri ve Stil


Birok Windows uygulamasna bakarsanz, men ubuunda baz bileenlerin ayn yerde birok kez yinelendiini ve bu elerin ieriklerinin nceden kestirilebilir olduunu fark edersiniz. rnein, File mens tipik olarak men ubuunun ilk esidir ve bu mende genellikle bir belge yaratmak, var olan bir belgeyi amak, belgeyi kaydetmek, belgeyi yazdrmak ve uygulamadan kmak iin komutlar bulunur. Not document (Belge) terimi uygulamann kulland veri anlamndadr. Microsoft Office

Excelde belge bir elektronik tablodur; Blm 22de yarattnz Bell Ringers uygulamasnda ise yeni bir ye olabilir.

451

452

Ksm IV

Windows Uygulamalar ile almak

Bu komutlarn oluum sras uygulamalar arasnda benzerlik gsterir; rnein, Exit komutu neredeyse amaz biimde File mensnn son komutudur. File mensnde uygulamaya zel komutlar da olabilir. Bir uygulama genelde Cut, Paste, Clear, Find vb. komutlar ieren bir Edit mensne de sahiptir. Sklkla men ubuunda uygulamaya zg menler de olur ama burada da genellikle son mennn hem yardma, hem de uygulamann telif haklar ile lisanslama ayrntlarn ieren hakknda bilgisine eriimi salayan Help mens olmasdr. yi tasarlanm bir uygulamada ou menler tahmin edilebilir olup uygulamann renilmesini ve kullanlmasn kolaylatrmaya yardmc olur. pucu Microsoft, sezgisel kullanc arabirimleri iin men tasarm dahil men temel ilkelerinin
tmn Microsoft Web sitesi olan http://msdn2.microsoft.com/en-us/library/Aa286531.aspx adresinde sunmaktadr.

Menler ve Men Olaylar


WPF, men eleri iin bir tayc olarak Menu denetimini salar. Menu denetimi, bir men tanmlamak iin basit bir kabuk salar. Birok WPF yaklamnda olduu gibi, Menu denetimi de olduka esnektir, bylece hemen hemen her tr WPF denetimi ieren bir men yaps tanmlayabilirsiniz. Bir komutu gerekletirmek iin tklayabileceiniz metin eleri ieren menlere aina olabilirsiniz. WPF menleri ayrca, dmeler, metin kutular, alr kutular vb. eler ierir. Menleri, Design View penceresindeki XAML blmesini kullanarak tanmlayabilirsiniz ve ayrca Microsoft Visual C# kodu kullanarak alma zamannda da menleri dzenleyebilirsiniz. Bir men dzenlemek hikayenin sadece yarsdr. Kullanc bir mendeki komutu tkladnda, bir eyler meydana gelmesini bekler! Uygulamanz men olaylarn yakalayarak ve denetim olaylarn ilemeye olduka benzer ekilde kodu altrarak komutlar zerinde rol oynar.

Bir Men Yaratmak


Aadaki altrmada Middleshire Bell Ringers Association uygulamas iin menler yaratmak iin XAML blmesini kullanacaksnz. Menlerin kod ile nasl deitirileceini ve yaratlacan bu blmn ilerleyen ksmlarnda ele alacaz.

Uygulama mens yaratn


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 23\BellRingers klasrnde yer alan BellRingers zmn an. Bu, Blm 22de oluturduunuz uygulamann kopyasdr.

Blm 23

Menler ve letiim Kutularyla almak

453

3. Design View penceresinde Window1.xamli grntleyin. (Solution Explorerda Window1.xamli ift tklayn.) 4. Toolboxdan, Controls ksmndan bir DockPanel denetimini formda herhangi bir yere srkleyin. Properties penceresinde, DockPanelin Width zelliini Auto olarak, HorizontalAlignment zelliini Stretch olarak, VerticalAlignment zelliini Top olarak ve Margin zelliini de 0 olarak ayarlayn. Not Margin zelliine 0 atamakla, 0, 0, 0, 0 atamak ayn eydir. DockPanel denetimi, formun st ksmnda ve tam form geniliinde yer almaldr. (First Name, Last Name, Tower ve Captain kullanc arabirim elerini kapsayacaktr.) DockPanel denetimi, Blm 22de grdnz Grid ve StackPanel denetimleri gibi, yerletirdiiniz dier denetimlerin dzenlemesini denetlemek iin kullanabileceiniz bir blme denetimidir. Forma dorudan bir men ekleyebilirsiniz, fakat meny DockPanel zerine yerletirmek ok daha iyi bir uygulamadr nk daha sonra meny ve mennn form zerindeki yerleimini kolayca dzenleyebilirsiniz. rnein, meny alt tarafta ya da bir kenarda yerletirirseniz, tasarm annda ya da alma zamannda kodu altrarak blmeyi hareket ettirmek suretiyle tm meny form zerinde baka bir yere yerletirebilirsiniz. 5. Toolboxdaki, Controls blmnden bir Menu denetimini DockPanel denetimine srkleyin. Properties penceresinde, DockPanel.Dock zelliini Top olarak, Width zelliini Auto olarak, HorizontalAlignment zelliini Stretch olarak ve VerticalAlignment zelliini de Top olarak atayn. Menu denetimi, DockPanelin st ksmnda boydan boya gri bir ubuk olarak grnr. XAML blmesinde, DockPanel ve Menu denetimlerinin kodunu inceleyin, u ekilde grnmelidir:
<DockPanel Height=100 HorizontalAlignment=Stretch Margin=0 Name=dockPanel1 VerticalAlignment=Top Width=Auto> <Menu Height=22 Name=menu1 Width=Auto DockPanel.Dock=Top VerticalAlignment=Top> </DockPanel>

HorizontalAlignment zellii, XAML kodunda ortaya kmaz nk Stretch deeri bu zellik iin varsaylan deerdir. Not Bu blm boyunca, XAML blmesinden satrlar ayr olarak gsterilmitir ve baslan
sayfaya yerleecek ekilde tasarlanmtr.

454

Ksm IV

Windows Uygulamalar ile almak

6. XAML blmesinde, Menu denetiminin tanmna aadaki kodda koyu harfle gsterilen MenuItem elerini ekleyin. MenuItem elerinin Menu denetiminin alt zellii olarak grndne dikkat edin, bu nedenle Menu esinin (/>) etiket snrlaycsn, allm etiket snrlayc (>) ile deitirin ve sonuna ayr bir </Menu> esi yerletirin.
<Menu Height=22 Name=menu1 Width=Auto DockPanel.Dock=Top VerticalAlignment=Top HorizontalAlignment=Stretch > <MenuItem Header=_File /> <MenuItem Header=_Help /> </Menu>

MenuItem esinin Header znitelii, men esi iin gsterilen metni belirler. Kullanc Alt tuuna ve mennn alt izgi (_) ile gsterilen harfine (Burada, File mens iin Alt+F, Help mens iin Alt+H) bastnda, o men esine hzl eriim salar. Bu bir dier yaygn kuraldr. alma zamannda, kullanc Alt tuuna ve F tuuna bastnda, File mens grnr. Ayn eriim tuunu karkla neden olacandan birden fazla men iin kullanmayn. Not Menu denetiminin Properties penceresi, Items adnda bir zellik grntler. Bu zellii ve sonra bu zellikte grnen nokta dmesini tklarsanz, Collection Editor grnr. Yazma zamannda, Visual Studio 2008in geerli srm (Beta 2) menden eleri kaldrmak, mendeki elerin srasn deitirmek ve bu elerin zelliklerini ayarlamak iin bu pencereyi kullanmanza imkan salar fakat menye yeni eler eklemenize izin vermez. O nedenle, bu blmde menlerinizin yapsn tanmlamak iin XAML blmesini kullanacaksnz. 7. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Form grnnce, balk ubuunun altndaki pencerenin st ksmnda meny grmelisiniz. Alt tuuna basn; menye odaklanlmaldr ve File mensnde F harfi ve Help mensnde H harfinin alt izili olmaldr:

Men elerinden birini tklarsanz, bu elerin ierecei alt menleri tanmlamadnzdan u an hibirey meydana gelmez. 8. Formu kapatn ve Visual Studio 2008e dnn.

Blm 23

Menler ve letiim Kutularyla almak

455

9. XAML blmesinde, _File men esinin tanmna, aada koyu harfle gsterildii gibi, </MenuItem> esi ile birlikte alt men ekleyin:
<MenuItem Header=_File > <MenuItem Header=_New Member Name=newMember /> <MenuItem Header=_Save Member Details Name=saveMember /> <Separator/> <MenuItem Header=E_xit Name=exit /> </MenuItem>

Bu XAML kodu, File mensne New Member, Save Member Details ve Exit komutlarn ekler. Men grndnde ve ilikili men elerini gruplandrmak iin kullanldnda, <Separator/> esi ubuk olarak belirir. 10. _Help men esine aada gsterilen alt men esini ekleyin:
<MenuItem Header=_Help > <MenuItem Header=_About Middleshire Bell Ringers Name=about /> </MenuItem>

11. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Form ortaya ktnda File mensn tklayn. Aadaki gibi alt men elerini grmelisiniz:

About Middleshire Bell Ringers alt men esini grntlemek iin Help mensn de tklayabilirsiniz. 12. Formu kapatn ve Visual Studio 2008e dnn. Ayrca, men elerine simgeler ekleyebilirsiniz. Birok uygulama, Visual Studio 2008de dahil, ekstra sanal ipucu salamak iin menlerde simgeleri kullanlr yapar. 13. Solution Explorerda, BellRingers projesini farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Existing Item tklayn. Add Existing Item BellRingers iletiim kutusunda, Belgeler klasrnz altnda yer alan Microsoft Press\Visual CSharp Step By Step\Chapter 23 klasrne gein, File name kutusuna Ring.bmp Face.bmp Note. bmp (trnak iaretleri ile birlikte) yazn ve daha sonra Addi tklayn. Bu eylem, resim dosyasn kaynak dosya olarak uygulamanza ekler.

456

Ksm IV

Windows Uygulamalar ile almak

14. XAML blmesinde, newMember, saveMember ve about men elerini dzenleyin ve nceki admda projeye eklediiniz simge dosyalarnn her birine bavuran MenuItem. Icon alt elerini ekleyin:
<Menu Height=22 Name=menu1 ... > <MenuItem Header=_File > <MenuItem Header=_New Member Name=newMember > <MenuItem.Icon> <Image Source=face.bmp/> </MenuItem.Icon> </MenuItem> <MenuItem Header=_Save Member Details Name=saveMember > <MenuItem.Icon> <Image Source=note.bmp/> </MenuItem.Icon> </MenuItem> <Separator/> <MenuItem Header=E_xit Name=exit/> </MenuItem> <MenuItem Header=_Help> <MenuItem Header=_About Middleshire Bell Ringers Name=about > <MenuItem.Icon> <Image Source=ring.bmp/> </MenuItem.Icon> </MenuItem> </MenuItem> </Menu>

15. Son dzenleme, men elerinin metninin formun geri kalan ile tutarl olacak ekilde biimlendirildiinden emin olmaktr. XAML blmesinde, st seviye menu1 esinin tanmn dzenleyin ve Style zelliini aada gsterildii gibi BellRingersFontStyle stil olarak ayarlayn:
<Menu Style={StaticResource bellRingersFontStyle} ... Name=menu1 ... >

Alt men elerinin, st seviye men esinin stilini otomatik olarak miras aldna dikkat edin. 16. Debug mensnde Start Without Debuggingi tklayarak uygulamay oluturun ve altrn. Form grndnde, File mensn tklayn. imdi men elerinin metnini, alt men elerindeki simgelerdeki yaz tipinde grmelisiniz:

17. Formu kapatn ve Visual Studio 2008e dnn.

Blm 23

Menler ve letiim Kutularyla almak

457

Men elerinin Trleri


Menu denetimine alt men eleri eklemek iin MenuItem esini kullandnz. st seviye mendeki eleri MenuItem eleri olarak belirleyebileceinizi ve daha sonra men yapnz tanmlamak iin yuvalanm MenuItem eleri ekleyebileceinizi grdnz. Basamaklanm menler yaratmak istiyorsanz, yuvalanm MenuItem eleri kendi iinde daha fazla yuvalanm MenuItem elerine sahip olabilir. Teorik olarak, bu ilemi olduka dip seviyelere kadar srdrebilirsiniz fakat pratikte iki seviyeden fazlasna gitmemelisiniz. Bununla birlikte, MenuItem esini kullanmakla snrl deilsiniz. Ayrca, WPF menlerine alr kutular, metin kutular ve dier denetim trlerinin birounu ekleyebilirsiniz. rnein, aadaki men yaps dme ve alr kutu ierir:
<Menu ...> <MenuItem Header=Miscellaneous> <Button>Add new member</Button> <ComboBox Text=Towers> <ComboBox.Items> <ComboBoxItem> Great Shevington </ComboBoxItem> <ComboBoxItem> Little Mudford </ComboBoxItem> <ComboBoxItem> Upper Gumtree </ComboBoxItem> <ComboBoxItem> Downley Hatch </ComboBoxItem> </ComboBox.Items> </ComboBox> </MenuItem> </Menu>

alma zamannda men yaps u ekilde grnr:

Menlerinizi tasarlarken olduka zgr olsanz da, tasarmnz basit tutmal ve ok fazla gsterili yapmamalsnz. Byle bir men ok sezgisel deildir!

458

Ksm IV

Windows Uygulamalar ile almak

Men Olaylarn lemek


imdiye kadar oluturduunuz men olduka sevimli grnyor fakat hibir e zerini tkladnzda birey yapmyor. eleri ilevsel yapmak iin, deiik men olaylarn ileyen kod yazmanz gerekir. Kullanc bir men esini setiinde birka farkl olay meydana gelebilir. Bazlar dierlerine gre daha kullanldr. En sk kullanlan olay, kullanc men esini tkladnda meyda gelen Click olaydr. Men esi ile ilikili grevleri gerekletirmek iin genellikle bu olay yakalarsnz. Aadaki altrmada, men olaylar ve bunlar nasl ileyeceinize dair daha fazla bilgi elde edeceksiniz. newMember ve exit men olaylar iin Click olaylar yaratacaksnz. New Member komutunun amac, kullancnn yeni bir yenin ayrntlarn girebilmesidir. Bu nedenle, kullanc New Member tklayana kadar, Save Member Details komutu ve form zerindeki tm alanlar devre d olmaldr. Kullanc New Member komutunu tkladnda, tm alanlar etkinletirmek, kullancnn yeni ye ile ilgili bilgi ekleyebilmesi iin formun ieriini sfrlamak ve Save Member Details komutunu etkinletirmek istersiniz.

New Member ve Exit men esi olaylarn ileyin


1. XAML blmesinde, firstName metin kutusunun tanmn tklayn. Properties penceresinde IsEnabled zelliini temizleyin. (Bu eylem, XAML tanmnda IsEnabled zelliini False olarak ayarlar.) Bu ilemi lastName, towerNames, isCaptain, hostMemberSince, yearsExperience, methods, add ve clear denetimleri ve saveMember men esi iin de tekrarlayn. 2. Design View penceresindeki XAML blmesinde, Member men esinin XAML tanmna aadaki kodu yazmaya balayn:
<MenuItem Header=_New Member Click=>

3. Trnak iaretini yazdktan sonra ortaya kan ksayol mensnde <New Event Handler> komutunu ift tklayn. Visual Studio newMember_Click adnda bir olay yntemi retir ve men esinin Click olay ile ilikilendirir. pucu Bir men esi iin olay yntemi tanmladnzda her zaman anlaml bir ad verin.
Siz bir ad vermezseniz, Visual Studio Click olay iin MenuItem_Click adnda olay yntemi retir. Daha sonra dier men eleri iin Click olay yntemleri yaratrsanz, o yntemler de MenuItem_Click_1, MenuItem_Click_2 ve bu ekilde devam eder. Bu olay yntemlerinden birka tane varsa, hangi olay ynteminin hangi men esine ait olduunu bulmak zor olabilir.

Blm 23

Menler ve letiim Kutularyla almak

459

4. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. (View mensnde Codeu tklayn.) Window1 snf tanmnn alt ksmna newMember_Click olay yntemi eklenir:
private void newMember_Click(object sender, RoutedEventArgs e) { }

5. memberFormClosing yntemine aadaki ifadeleri ekleyin:


private void newMember_Click(object sender, RoutedEventArgs e) { this.Reset(); saveMember.IsEnabled = true; firstName.IsEnabled = true; lastName.IsEnabled = true; towerNames.IsEnabled = true; isCaptain.IsEnabled = true; hostMemberSince.IsEnabled = true; yearsExperience.IsEnabled = true; methods.IsEnabled = true; add.IsEnabled = true; clear.IsEnabled = true; }

Bu kod Reset yntemini arr ve daha sonra tm denetimleri etkin hale getirir. Blm 22den hatrlarsanz, Reset yntemi form zerindeki tm denetimleri varsaylan deerlerine sfrlar. (Reset ynteminin nasl altn hatrlamyorsanz, yntemi grntlemek iin Code and Text Editor penceresini aa doru kaydrn.) Daha sonra, Exit komutu iin bir Click olay yntemi yaratmanz gerekir. Bu yntem formu kapatmaldr. 6. Window1.xaml dosyasn grntleyen Design View penceresine dnn. exit men esine exit_Click adnda bir Click olay yaratmak iin 2. admdaki teknii izleyin. 7. Code and Text Editor penceresine gein. exit_Click ynteminin gvdesine, aada koyu harfle yazlm olan ifadeyi yazn:
private void exit_Click(object sender, RoutedEventArgs e) { this.Close(); }

Formun Close yntemi formu kapatmaya teebbs eder . Form Closing olayn engellerse, formun kapanmayacan hatrlayn. Middleshire Bell Ringers Association uygulamas tam olarak bunu yapar ve kullancya uygulamay kapatmak isteyip istemediini sorar. Kullanc hayr derse, form kapanmaz ve uygulama almaya devam eder.

460

Ksm IV

Windows Uygulamalar ile almak

Bir sonraki adm, saveMember men esini ilemektir. Kullanc bu men esini tkladnda, form zerindeki veri dosyaya kaydedilmelidir. Balang olarak, bilgiyi geerli klasrde Members.txt adnda sradan bir metin dosyasna kaydedeceksiniz. Daha sonra, kullanc alternatif dosya ad ve konumu seebilecek ekilde kodu dzenleyeceksiniz.

Save Member Information men esi olayn ileyin


1. Window1.xaml dosyasn grntleyen Design View penceresine dnn. XAML blmesinde, saveMember men esi tanmn bulun ve saveMember_Click adnda (<New Event Handler> komutu tarafndan oluturulan varsaylan addr.) bir Click olay yntemi belirlemek iin <New Event Handler> komutunu kullann. 2. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresinde, dosyann en stne gidin ve listeye aadaki using ifadesini ekleyin:
using System.IO;

3. Dosyann sonundaki saveMember_Click olay yntemini bulun. Yntem gvdesine aadaki ifadeleri ekleyin:
private void saveMember_Click(object sender, RoutedEventArgs e) { using (StreamWriter writer = new StreamWriter(Members.txt)) { writer.WriteLine(First Name: {0}, firstName.Text); writer.WriteLine(Last Name: {0}, lastName.Text); writer.WriteLine(Tower: {0}, towerNames.Text); writer.WriteLine(Captain: {0}, isCaptain.IsChecked.ToString()); System.Windows.Forms.DateTimePicker memberDate = hostMemberSince.Child as System.Windows.Forms.DateTimePicker; writer.WriteLine(Member Since: {0}, memberDate.Value.ToString()); writer.WriteLine(Methods: ); foreach (CheckBox cb in methods.Items) { if (cb.IsChecked.Value) { writer.WriteLine(cb.Content.ToString()); } } MessageBox.Show(Member details saved, Saved); } }

Bu kod blou, yntemin Member.txt dosyasna metni yazmak iin kulland bir StreamWriter nesnesi yaratr. StreamWriter snfn kullanmak, Console nesnesini kullanarak konsol uygulamasnda metni grntlemeye olduka benzer; WriteLine yntemini kullanabilirsiniz.

Blm 23

Menler ve letiim Kutularyla almak

461

Ayrntlarn tm yazldnda, kullancya baz geri dnler veren bir ileti kutusu grntlenir (her zaman iyi bir fikirdir). 4. Add dmesi ve ilikili olay yntemi imdi kullanlmaz durumdadr, bu nedenle Design View penceresinde Add dmesini silin. Code and Text Editor penceresinde, add_Click yntemini aklama satrna evirin. 5. newMember_Click ynteminde, aadaki ifadeyi aklama satrna dntrn:
// add.IsEnabled = true;

Geriye about men esi kalyor. Bu men esi, uygulamann srm hakknda, yaync ve dier yararl bilgileri salayan bir iletiim kutusu gstermelidir. Bir sonraki altrmada bu olay ilemek iin bir olay yntemi ekleyeceksiniz.

About Middleshire Bell Ringers men esi olayn ileyin


1. Project mensnde Add Windowu tklayn. 2. Add New Item BellRingers iletiim kutusundaki Templates blmesinde, Window (WPF)u tklayn. Name metin kutusuna About.xaml yazn ve daha sonra Addi tklayn. Uygun denetimleri eklediinizde, kullanc Help mensndeki About Middleshire Bell Ringers komutunu tkladnda bu pencereyi grntleyeceksiniz. Not Visual Studio, About Box pencereleri ablonunu salar. Bununla birlikte, bu ablon
WPF penceresinden ok bir Windows Forms penceresi oluturur.

3. Design View penceresinde, About.xaml formunu tklayn. Properties penceresinde, Title zelliini About Middleshire Bell Ringers olarak deitirin, Width zelliine 300 ve Height zelliine de 156 atayn. Kullancnn pencere boyutunu deitirmesini engellemek iin ResizeMode zelliini NoResize olarak ayarlayn. 4. Properties penceresinin st ksmndaki Name kutusuna AboutBellRingers yazn. 5. Forma iki etiket denetimi ve bir dme denetimi ekleyin. XAML blmesinde, bu denetimin zelliklerini aada gsterildii gibi deitirin (isterseniz buildDate etiketi tarafndan grntlenen metni deitirebilirsiniz):
<Window x:Class=BellRingers.About xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml Title=About Middleshire Bell Ringers Height=156 Width=300 Name=AboutBellRingers ResizeMode=NoResize> <Grid> <Label Margin=80,20,0,0 Name=version Height=30 VerticalAlignment=Top HorizontalAlignment=Left Width=75>Version 1.0</Label>

462

Ksm IV

Windows Uygulamalar ile almak

<Label Margin=80,50,0,0 Name=buildDate Height=30 VerticalAlignment=Top HorizontalAlignment=Left Width=160>Build date: September 2007</Label> <Button Margin=100,85,0,0 Name=ok HorizontalAlignment=Left Width=78 Height=23 VerticalAlignment=Top>OK</Button> </Grid> </Window>

Tamamlanm form yle grnmelidir:

6. Design View penceresinde OK dmesini ift tklayn. Visual Studio, dmenin Click olay iin bir olay yntemi retir ve About.xaml.cs dosyasna ok_Click yntemini ekler. 7. About.xaml.cs dosyasn grntleyen Code and Text Editor penceresinde, ok_Click yntemine aadaki ifadeyi ekleyin:
private void ok_Click(object sender, RoutedEventArgs e) { this.Close(); }

Kullanc OK dmesini tkladnda pencere kapanacaktr. 8. Window1.xaml dosyasn grntleyen Design View penceresine dnn. XAML blmesinde, about men esinin tanmn bulun ve about_Click adnda (<New Event Handler> komutu tarafndan retilen varsaylan addr) bir Click olay yntemi belirlemek iin <New Event Handler> komutunu kullann. 9. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresinde, about_ Click yntemine aadaki ifadeleri ekleyin:
private void about_Click(object sender, RoutedEventArgs e) { About aboutWindow = new About(); aboutWindow.ShowDialog(); }

Bu kod, About penceresinin yeni bir rneini yaratr ve sonra bu rnei grntlemek iin ShowDialog yntemini arr. ShowDialog yntemi, About penceresi kapanana kadar (kullanc OK dmesini tkladnda) birey dndrmez.

Blm 23

Menler ve letiim Kutularyla almak

463

Men olaylarn test edin


1. Debug mensnde Start Without Debuggingi tklayarak uygulamay oluturun ve altrn. Formdaki tm alanlarn etkisiz hale geldiine dikkat edin. 2. File mensn tklayn. Save Member Details komutu etkisizletirilir. 3. File mensnde New Member tklayn. Formdaki alanlar imdi etkin durumdadr . 4. Yeni ye iin bilgileri girin. 5. Tekrar File mensn tklayn. imdi Save Member Details komutu etkindir. 6. File mensnde Save Member Detailsi tklayn. Ksa bir sre sonra Member details saved (ye bilgileri kaydedildi) iletisi grnr. leti kutusunda OK i tklayn. 7. Windows Gezgininde Belgeler klasrnzn altndaki \Microsoft Press\Visual CSharp Step by Step\Chapter 23\BellRingers\BellRingers\bin\Debug klasrne gidin. Bu klasrde Members.txt adnda bir dosya grmelisiniz. 8. Members.txt dosyasnn ieriini Not Defterinde grntlemek iin zerini ift tklayn. Bu dosya yeni yenin bilgilerini iermelidir. 9. Not Defterini kapatn ve Middleshire Bell Ringers uygulamasna dnn. 10. Help mensnde About Middleshire Bell Ringers tklayn. About penceresi ortaya kar. Bu pencereyi yeniden boyutlandramadnza ve About penceresi etkinken Members formu zerinde hibir eyi tklayamadnza dikkat edin. 11. Members formuna dnmek iin OKi tklayn. 12. File mensnde Exiti tklayn. Form kapanmay dener. Formu kapatmak istediinizden emin olup olmadnz sorulur. Noyu tklarsanz, form kapanmaz; Yesi tklarsanz form kapanr ve uygulama sonlanr. 13. Formu kapatmak iin Yesi tklayn.

464

Ksm IV

Windows Uygulamalar ile almak

Ksayol Menleri
Birok Windows tabanl uygulama, bir form ya da denetimi farenin sa dmesiyle tkladnzda beliren alan (pop-up) menleri kullanr. Bu menler, genellikle ierik duyarldr ve yalnzca etkin denetime ya da forma zg komutlar listeler. Genellikle context (ierik) ya da shortcut (ksayol) menler olarak adlandrlrlar. ContextMenu snfn kullanarak, WPF uygulamasna kolayca ksayol menleri ekleyebilirsiniz.

Ksayol Menleri Yaratmak


Aadaki altrmalarda iki ksayol mens yaratacaksnz. lk ksayol mens firstName ve lastName metin kutusu denetimlerine baldr ve kullancnn denetimleri temizlemesini salar. kinci ksayol mens ise forma baldr ve gsterilmekte olan ye bilgilerini kaydetmek ve formu temizlemek iin kullanlabilecek komutlar ierir. Not Metin kutusu denetimleri, metin dzenlemeleri yapabilmek iin Cut, Copy ve Paste

komutlarn salayan varsaylan bir ksayol mens ile ilikilendirilir. Aadaki altrmada tanmlayacanz ksayol mens, bu varsaylan meny etkisiz klacaktr.

firstName ve lastName ksayol mens yaratn


1. Window1.xamli grntleyen Design View penceresinde, XAML blmesinde pencere kaynaklarnn sonuna, stil tanmndan sonrasna aadaki ContextMenu esini ekleyin:
<Window.Resources> ... <ContextMenu x:Key=textBoxMenu Style={StaticResource bellRingersFontStyle}> </ContextMenu> </Window.Resources>

Bu ksayol mens, firstName ve lastName metin kutular tarafndan paylalacaktr. Ksayol mensn pencere kaynaklarna eklemek, meny penceredeki her denetim iin kullanlabilir yapar. 2. textBoxMenu ksayol mensne aadaki MenuItem esini ekleyin:
<Window.Resources> ... <ContextMenu x:Key=textBoxMenu Style={StaticResource bellRingersFontStyle}> <MenuItem Header=Clear Name Name=clearName /> </ContextMenu> </Window.Resources>

Blm 23

Menler ve letiim Kutularyla almak

465

Bu kod, ksayol mensne Clear Name (Ad Temizle) aklamasyla, clearName adnda bir men esi ekler. 3. XAML blmesinde, firstName ve lastName metin kutusu denetimlerinin tanmlamalarn dzenleyin ve ContextMenu zelliini ekleyin:
<TextBox ... Name=firstName ContextMenu={StaticResource textBoxMenu} ... /> ... <TextBox ... Name=lastName ContextMenu={StaticResource textBoxMenu} ... />

ContextMenu zellii, kullanc denetimi farenin sa dmesiyle tkladnda, hangi mennn grntleneceini belirler. 4. textBoxMenu stilinin tanmna dnerek clearName men esine clearName_Click adnda (<New Event Handler> komutu tarafndan retilen varsaylan addr.) bir Click olay yntemi ekleyin.
<MenuItem Header=Clear Name Name=clearName Click=clearName_Click />

5. Window1.xaml.csi grntleyen Code and Text Editor penceresinde, <New Event Handler> komutunun oluturduu clearName_Click olay yntemine aadaki ifadeleri ekleyin:
firstName.Text = String.Empty; lastName.Text = String.Empty;

Bu kod, kullanc ksayol mensndeki Clear Name komutunu tkladnda metin kutularnn her ikisini de temizler. 6. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Form belirdiinde File tklayn ve sonra da New Member tklayn. 7. First Name ve Last Name metin kutularna bir ad yazn. First Name metin kutusunu farenin sa dmesiyle tklayn. Ksayol mensnde, Clear Name komutunu tklayn ve her iki metin kutusunun da temizlendiini dorulayn. 8. First Name ve Last Name metin kutularna bir ad yazn. Bu defa, Last Name metin kutusunu farenin sa dmesiyle tklayn. Ksayol mensnde, Clear Name komutunu tklayn ve her iki metin kutusunun da temizlendiini dorulayn. 9. Formda First Name ve Last Name metin kutular dnda herhangi bir yeri tklayn. Sadece First Name ve Last Name metin kutular ksayol menlerine sahiptir, herhangi bir alr (pop-up) men belirmemelidir. 10. Formu kapatn ve Visual Studio 2008e dnn. imdi, kullancnn ye bilgisini kaydetmek ve formdaki alanlar temizlemek iin kullanabilecei komutlar ieren ikinci ksayol mensn ekleyebilirsiniz. Biraz deiiklik salamak ve ksayol menlerini dinamik olarak yaratmann ne kadar kolay olduunu

466

Ksm IV

Windows Uygulamalar ile almak

gstermek iin, aadaki altrmada kod kullanarak ksayol mens yaratacaksnz. Bu kodu yerletirmek iin en iyi yer, formun kurucusudur. Daha sonra, kullanc yeni bir ye yarattnda pencere iin ksayol mensn etkinletirmek iin kod ekleyeceksiniz.

Pencere ksayol mensn yaratn


1. Window1.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. 2. Window1 snfna aadaki zel (private) deikeni ekleyin:
public partial class Window1 : Window { ... private ContextMenu windowContextMenu = null; ... }

3. Window1 snf iin kurucuyu bulun. Bu gerekten snftaki ilk yntemdir ve Window1 olarak adlandrlr. ye bilgilerini kaydetmek zere men eleri yaratmak iin Reset yntemini aran koddan sonra aadaki ifadeleri ekleyin:
public Window1() { InitializeComponent(); this.Reset(); MenuItem saveMemberMenuItem = new MenuItem(); saveMemberMenuItem.Header = Save Member Details; saveMemberMenuItem.Click += new RoutedEventHandler(saveMember_Click); }

Bu kod, men esi iin Header zelliini ayarlar ve sonra Click olaynn saveMember_ Click olay yntemini armas gerektiini belirtir; bu daha nceki altrmada yazdnz yntemin aynsdr. RoutedEventHandler tr, birok WPF denetimi tarafndan ortaya karlan olaylar ilemek iin yntemleri gsteren bir temsilcidir. (Temsilciler ve olaylarla ilgili daha fazla bilgi iin, Blm 17ye bakn.) 4. Window1 kurucusuna, form zerindeki alanlar temizleyen ve varsaylan deerlerine sfrlayan men eleri yaratmak iin aadaki ifadeleri ekleyin:
public Window1() { ... MenuItem clearFormMenuItem = new MenuItem(); clearFormMenuItem.Header = Clear Form; clearFormMenuItem.Click += new RoutedEventHandler(clear_Click); }

Bu men esi, kullanc tarafndan tklandnda clear_Click olayn arr.

Blm 23

Menler ve letiim Kutularyla almak

467

5. Ksayol mens kurmak ve yeni yarattnz men elerini yerletirmek iin, Window1 kurucusuna aadaki ifadeleri ekleyin:
public Window1() { ... windowContextMenu = new ContextMenu(); windowContextMenu.Items.Add(saveMemberMenuItem); windowContextMenu.Items.Add(clearFormMenuItem); }

ContextMenu tr, Items adnda, men elerini tutan bir koleksiyon ierir. 6. Ksayol mensn form ile ilikilendirmek iin, newMember_Click olay ynteminin sonuna aadaki ifadeyi ekleyin:
private void newMember_Click(object sender, RoutedEventArgs e) { ... this.ContextMenu = windowContextMenu; }

Uygulamann sadece yeni ye ilevsellii kullanlabilir olduunda ksayol mensn form ile ilikilendirdiine dikkat edin. Formun ContextMenu zelliini kurucuda ayarlamak isteseydiniz, formdaki denetimler etkisiz hale getirilse bile Save Member Details ve Clear Details ksayol men eleri etkin olacakt. Bu, uygulamada olmasn istediiniz bir davran deildir. pucu Formun ContextMenu zelliini null olarak ayarlayarak ksayol mens ile form
ilikisini kesebilirsiniz.

7. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 8. Form belirdiinde, formu farenin sa dmesiyle tklayn ve ksayol mensnn ortaya kmadn dorulayn. 9. File mensnde New Member tklayn ve sonra yeni yenin bilgilerini girin. 10. Formu farenin sa dmesiyle tklayn. Ksayol mensnde Clear Formu tklayn ve formdaki alanlarn varsaylan deerlerine sfrlandn dorulayn. 11. Daha fazla yenin bilgisini girin. Formu farenin sa dmesiyle tklayn. Ksayol mensnde Save Member Details tklayn. Member details saved (ye bilgileri kaydedildi) ileti kutusunun belirdiini grn ve daha sonra OKi tklayn. 12. Formu kapatn ve Visual Studio 2008e geri dnn.

468

Ksm IV

Windows Uygulamalar ile almak

Windows Ortak letiim Kutular


Bell Ringers uygulamas, ye bilgilerini kaydetmenize olanak verse de verileri hep ayn dosyaya kaydeder ve burada olan her eyin zerine yazar. imdi bu konulara eilme zamandr. Kullancnn bir tr bilgiyi belirtmesini gerektiren birok gnlk grev bulunur. rnein, kullanc bir dosyay amak ya da kaydetmek isterse, genellikle kendisine hangi dosyay amak istedii ya da dosyay nereye kaydetmek istedii sorulur. Ayn iletiim kutularnn birok farkl uygulama tarafndan kullanldn fark etmisinizdir. Bu uygulama gelitiricilerin d glerinin eksikliinden kaynaklanmamaktadr; bu ilevsellik o kadar yaygndr ki Microsoft bunu standartlatrm ve ortak iletiim olarak kullanlabilir klmtr (Microsoft Windows iletim sistemiyle birlikte gelen ve kendi uygulamalarnzda kullanabileceiniz bir bileendir). Microsoft .NET Framework snf ktphanesi, bu ortak iletiim kutular iin kapsayc grevi yapan OpenFileDialog ve SaveFileDialog snflarn salar.

SaveFileDialog Snfn Kullanmak


Aadaki altrmada, SaveFileDialog snfn kullanacaksnz. BellRingers uygulamasnda, kullanc bilgileri bir dosyaya kaydederken, Save File ortak iletiim kutusu ile kullancdan dosya ad ve dosyann konumunu girmesini isteyeceksiniz.

SaveFileDialog snfn kullann


1. Window1.xaml.csi grntleyen Code and Text Editor penceresinde, dosyann st ksmna aadaki using ifadesini ekleyin:
using Microsoft.Win32;

SaveFileDialog snf Microsoft.Win32 ad alanndadr. 2. saveMember_Click yntemini bulun ve bu yntemin balangcna aadaki kodu ekleyin, YourName yerine kendi hesap adnz yazn:
private void saveMember_Click(object sender, RoutedEventArgs e) { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = txt; saveDialog.AddExtension = true; saveDialog.FileName = Members; saveDialog.InitialDirectory = @C:\Users\YourName\Documents\; saveDialog.OverwritePrompt = true; saveDialog.Title = Bell Ringers; saveDialog.ValidateNames = true; ... }

Blm 23

Menler ve letiim Kutularyla almak

469

Not Windows XP kullanyorsanz, saveDialog nesnesinin InitialDirectory zelliini ayarlayan ifade yerine aadaki kodu yazn:
saveDialog.InitialDirectory = @C:\Documents and Settings\YourName\My Documents\;

Bu kod, SaveFileDialog snfnn yeni bir rneini yaratr ve zelliklerini ayarlar. Aadaki tabloda bu zelliklerin amac listelenmitir.
zellik
DefaultExt AddExtension

Tanm
Kullanc dosya adn verirken uzantsn belirtmemise, kullanlacak olan varsaylan dosya uzantsdr. Kullanc dosya uzantsn ihmal ettiyse, kullanc tarafndan belirlenen dosya adna DefaultExt zellii tarafndan gsterilen dosya ad uzantsn eklemek iin iletiim kutusunu etkinletirir. Seili dosya addr. Varsaylan dosya ad belirlemek iin bu zellii kullanabilirsiniz ya da varsaylan dosya ad istemiyorsanz bu zellii temizleyebilirsiniz. letiim kutusu tarafndan kullanlan varsaylan dizin. Kullanc var olan bir dosyann zerine yazmaya kalkarsa, iletiim kutusunun kullancy uyarmasn salar. Bunun almas iin, ValidateNames zelliinin de true olmas gerekir. letiim kutusunun balk ubuunda grntlenen dize. Dosya adnn geerli olup olmadn gsterir. OverwritePrompt gibi baz dier zellikler tarafndan kullanlr. ValidateNames zellii true olarak ayarlanmsa, iletiim kutusu kullancnn yazd dosya adnda sadece geerli karakterler olduunu dorular.

FileName

InitialDirectory OverwritePrompt

Title ValidateNames

3. saveMember_Click yntemine aadaki ifadeleri ekleyin ve StreamWriter nesnesini yaratan ve ye bilgilerini bir if ifadesi iinde yazan nceki kodu kapsayn:
if (saveDialog.ShowDialog().Value) { using (StreamWriter writer = new StreamWriter(Members.txt)) { // varolan kod ... } }

ShowDialog yntemi, Save File iletiim kutusunu grntler. Save File iletiim kutusu tipiktir, yani kullanc dmelerinden birini tklayarak bu iletiim kutusunu kapatana kadar uygulamadaki dier formlar kullanmaya devam edemez. Save File iletiim

470

Ksm IV

Windows Uygulamalar ile almak

kutusu bir Save dmesine ve bir Cancel dmesine sahiptir. Kullanc Savei tklarsa, ShowDialog yntemi tarafndan dndrlen deer true olur; aksi durumda false olur . ShowDialog yntemi kullancdan dosyay kaydetmek iin bir dosya ad girmesini ister fakat gerekte dosyay kaydetmez; kodu yine kendiniz salamak zorundasnz. Tm yapt, kullancnn FileName zelliinde setii dosya adn salamaktr. 4. saveMember_Click ynteminde, StreamWriter nesnesini yaratan ifadeyi aadaki gibi deitirin:
using (StreamWriter writer = new StreamWriter(saveDialog.FileName)) { ... }

saveMember_Click yntemi, imdi Members.txt yerine kullancnn belirledii dosyaya yazacaktr. 5. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 6. File mensnde New Member tklayn ve daha sonra yeni yenin bilglerini ekleyin. 7. File mensnde Save Member Details tklayn. Bell Ringers bal ile Save File iletiim kutusu almaldr. Aada gsterildii gibi, varsaylan klasr, Belgeler ve varsaylan dosya ad da Members olmaldr:

Dosya ad uzantsn ihmal ederseniz, dosya kaydedildiinde dosya uzants olarak .txti ekler. Var olan bir dosyay seerseniz, iletiim kutusu sizi uyaracaktr. 8. File name metin kutusundaki deeri TestMember olarak deitirin ve daha sonra Savei tklayn. 9. Bell Ringers uygulamasnda, Member details saved (ye bilgileri kaydedildi) iletisinin grndn dorulayn ve OKi tklayn. Daha sonra uygulamay kapatn.

Blm 23

Menler ve letiim Kutularyla almak

471

10. Windows Gezginini kullanarak Belgeler klasrnze gidin. TestMember.txt dosyasnn yaratldn dorulayn. 11. Dosyay ift tklayn ve dosyann eklediiniz yenin bilgilerini ierdiini dorulayn. Daha sonra Not Defteri uygulamasn kapatn. Bir dosyay amak iin de ayn teknii kullanabilirsiniz: bir OpenFileDialog nesnesi yaratn, ShowDialog yntemini kullanarak etkinletirin ve kullanc Open dmesini tklad sonucunu dndrdnde FileName zelliini aln. Daha sonra dosyay aabilir, ieriini okuyabilir ve ekranda alanlar yerletirebilirsiniz. OpenFileDialog snfn kullanmak ile ilgili daha fazla ayrnt iin, Visual Studio 2008 iin MSDN Ktphanesine bavurun.
n

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 24e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 23 Hzl Bavuru


Bunun in
Form iin bir men yaratmak Menye men eleri eklemek

unu Yapn
DockPanel denetimi ekleyin ve formun en stne yerletirin. DockPanel denetimine Menu denetimi ekleyin. Menu denetimine MenuItem eleri ekleyin. Header zellii ile men esi iin metni belirleyin ve Name zelliini belirleyerek de her men esine bir ad verin. Simgeler ve alt menler gibi zellikleri grntleyebilmek iin istee bal zellikleri de belirleyebilirsiniz. Uygun harfi alt izgi ile belirterek men esine bir eriim anahtar ekleyebilirsiniz. Menye Seperator esi ekleyin. Tasarm srasnda Properties penceresinde, IsEnabled zelliini True ya da False olarak ayarlayn ya da alma zamannda IsEnabled zelliini true ya da false olarak ayarlamak iin kod yazn. Men esini sein ve Click olay iin bir olay yntemi belirleyin. Olay yntemine kodunuzu ekleyin. Pencere kaynaklarna bir ContextMenu ekleyin. Sradan menye eleri eklediiniz biimde ksayol mensne eleri ekleyin. Ksayol mensne bavurmak iin form ya da denetimin ContextMenu zelliini ayarlayn.

Bir mende ayrc ubuu yaratmak Bir men esini etkinletirmek ya da devre d brakmak Kullanc bir men esini tkladnda bir eylem gerekletirmek Bir ksayol mens yaratmak Ksayol mensn bir form ya da denetim ile ilikilendirmek

472

Ksm IV

Windows Uygulamalar ile almak

Dinamik olarak ksayol mens yaratmak Kullancy kaydedilecek dosyaya ad vermesi iin uyarmak.

Bir ContextMenu nesnesi yaratn. Bu nesnenin Items koleksiyonunu, men elerini tanmlayan MenuItem nesneleri ile yerletirin. Ksayol mensne bavurmak iin form ya da denetimin ContextMenu zelliini ayarlayn. SaveFileDialog snfn kullann. ShowDialog yntemini kullanarak iletiim kutusunu grntleyin. letiim kutusu kapandnda, SaveFileDialog rneinin FileName zellii, kullancnn setii dosyann adn ierir.

Blm 24

Dorulamay Gerekletirmek
Bu blm tamamladktan sonra renecekleriniz:
n

Kullanc tarafndan girilen bilgileri, hibir uygulamay ya da i kuraln ihlal etmediinden emin olmak iin incelemek. Kullanc tarafndan girilen bilgiyi dorulamak iin veri balama dorulama kurallarn kullanmak. Dorulamay, etkili ama sknt vermeyen biimde gerekletirmek .

nceki iki blmde, veri girii iin birok denetim kullanan Microsoft Windows Presentation Foundation (WPF) uygulamasnn nasl yaratlacan grdnz. Uygulamann kullanmn kolaylatrmak amacyla menler yarattnz. Menler, formlar ve denetimler tarafndan balatlan olaylarn nasl yakalanacan bylece uygulamanzn gzel grnmek dnda nasl gerekten bir eyler yapabileceini rendiniz. Bir formun dikkatli tasarlanmas ve denetimlerin uygun kullanmlar, kullanc tarafndan girilen bilgilerin anlaml olmasna yardmc olsa da genelde gerekletirmeniz gereken ek denetimler vardr. Bu blmde, uygulamay altran bir kullanc tarafndan girilen verilerin, uygulamann gereklilikleri tarafndan belirlenen i kurallarna uyduundan emin olmak iin nasl dorulanacan reneceksiniz.

Verileri Dorulamak
Girdi dorulama kavram olabildiince basittir ama uygulama iinde kullanm her zaman kolay olmaz; zellikle de dorulama kullancnn iki ya da daha ok denetime girdii verilerin karlkl dorulanmalarn gerektiriyorsa. Arka plandaki i kural grece ok ak olabilir ama ou zaman yanl zamanda gerekletirilen dorulama, formun kullanmn zorlatrr ve sinirleri gerer.

Kullanc Giriini Dorulamak in Stratejiler


Uygulamanzn kullanclar tarafndan girilen bilgiyi dorulamak iin birok strateji uygulayabilirsiniz. Birok Microsoft Windows yazlm gelitiricisinin, Microsoft .NET Frameworkun nceki srmlerinden aina olduu yaygn teknik, denetimlerin LostFocus olayn ilemektir. LostFocus olay, kullanc bir denetimden uzaklatnda ortaya kar. Kullancnn terkettii denetimdeki veriyi incelemek ve ilecin uzaklamasna izin vermeden nce uygulamann gereksinimleri ile eletiinden emin olmak iin bu olaya kod ekleyebilirsiniz. Bu strateji ile ilgili problem, ou kez bir denetime girilen deer ile
473

474

Ksm IV

Windows Uygulamalar ile almak

dierlerindeki deerleri karlkl kontrol etmeniz gerekmesi ve dorulama mantnn olduka karmak hale gelebilmesidir; ou kez birka denetim iin LostFocus olay ileyicisinde benzer mant tekrarlamay brakrsnz. Ayrca, kullancnn bir denetimden dierine gei sras zerinde bir gce sahip deilsiniz. Kullanc bir formdaki denetimler zerinde hareket edebilir, bu nedenle form zerindeki belirli bir denetimin dierlerine gre karlkl kontroln yapyorsanz her denetimin geerli veri ierdiini her zaman varsayamazsnz. Bu strateji ile ilgili bir dier nemli konu, bir uygulamann sunum elerinin dorulama mantnn i mantna olduka yakndan bal olmasdr. gereksinimleri deiirse, dorulama mantn da deitirmeniz gerekebilir ve kodun bakm karmak bir i haline gelebilir. WPF ile uygulamanz tarafndan kullanlan i modelinin paras olarak dorulama kurallar tanmlayabilirsiniz. Daha sonra, kullanc arabiriminin Extensible Application Markup Language (XAML) tanmndan bu kurallara bavurabilirsiniz. Bunun iin, i modeli tarafndan istenen snf tanmlar ve daha sonra kullanc arabirimi denetimlerinin zelliklerini bu snflar tarafndan sunulan zelliklere balarsnz. alma zamannda, WPF bu snflarn rneklerini yaratabilir. Bir denetimdeki veriyi deitirdiinizde, veri otomatik olarak, belirlenen ve dorulanan uygun i modeli snf rneine kopyalanabilir. Veriyi Ynetmek balkl Ksm Vte veri balama hakknda daha fazla ey reneceksiniz. Bu blmde, veri balama ile ilikilendirebileceiniz dorulama kurallar zerinde younlaacaz.

Bir rnek: Mteri Ynetimi


rnek olarak basit bir senaryo dnn. Bir Mteri Ynetimi uygulamas gelitirmeniz istendi diyelim. Uygulamann bir blm, hitap, ad ve cinsiyeti de ieren temel mteri bilgilerinin girilmesini gerektirir. Aadaki resimdekine benzer bir form yaratmaya karar verdiniz.

Kullanc girdisinin tutarl olduundan emin olmanz gerekir; hitap (Mr, Mrs, Miss ya da Ms) seili cinsiyetle (Male (Erkek) ya da Female (Kadn)) elemelidir veya tam tersi.

Blm 24

Dorulamay Gerekletirmek

475

Veri Balamay Kullanarak Dorulamay Gerekletirmek


Aadaki altrmalarda, Mteri Ynetimi uygulamasn inceleyecek ve veri balamay kullanarak dorulama kurallar ekleyeceksiniz. Uyarc bir aama olarak, dorulamay yanl zamanda yapmann ve uygulamay neredeyse kullanlamaz yapmann ne kadar kolay olduunu greceksiniz!

Mteri Ayrntlar formunu inceleyin


1. Microsoft Visual Studio 2008i balatn. 2. Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step By Step\Chapter 24\ CustomerDetails klasrnde yer alan CustomerDetails projesini an. 3. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 4. Form belirdiinde, Title alan kutusundaki aa okunu ve ardndan Mr tklayn. 5. Gender grup kutusunda, Female seenek dmesini tklayn. 6. File mensnde, Savei tklayn ve Customer saved (Mteri kaydedildi) ileti kutusunun belirdiini dorulayn. Uygulama gerekte herhangi bir veri kaydetmez. Kaydederse, uygulama herhangi bir denetim gerekletirmediinden kaydedilen bilgi tutarsz olacaktr. deal olarak, tm mteriler bir ada sahip olmaldr ve Title ve Gender denetimleri iin belirlenen veriler tutarl olmaldr. 7. OKi tklayn ve formu kapatarak Visual Studio 2008e geri dnn. Gerekli dorulama mantn eklemenin ilk adm, bir mteri modelleyen bir snf yaratmaktr. Kullancnn her zaman mterinin ilk adn ve soyadn girdiinden emin olmak iin bu snf nasl kullanacanz renmekle balayacaksnz.

Bir ad giriini salamak iin dorulama mantyla Customer snfn yaratn


1. Solution Explorerda, CustomerDetails projesini farenin sa dmesiyle tklayn, Addi iaret edin ve daha sonra Class tklayn. 2. Add New Item CustomerDetails iletiim kutusunda Name metin kutusuna Customer.cs yazn ve sonra Addi tklayn. 3. Customer.cs dosyasn grntleyen Code and Text Editor penceresinde Customer snfna zel foreName ve lastName alanlarn ekleyin:
class Customer { private string foreName; private string lastName; }

476

Ksm IV

Windows Uygulamalar ile almak

4. Customer snfna, bir nceki basamakta eklediiniz foreName alanna dayal, aadaki genel ForeName zelliini ekleyin:
class Customer { ... public string ForeName { get { return this.foreName; } set { if (String.IsNullOrEmpty(value)) { throw new ApplicationException (Specify a forename for the customer); } else { this.foreName = value; } } } }

set eriimci zellii ilk ad iin salanan deeri inceler ve deer bo ise, uygun bir iletiyle bir zel durum oluturur. 5. Customer snfna aadaki kodda koyu harfle gsterilen LastName zelliini ekleyin. Bu zellik ForeName zellii ile benzer modeli izler:
class Customer { ... public string LastName { get { return this.lastName; } set { if (String.IsNullOrEmpty(value)) { throw new ApplicationException (Specify a last name for the customer); } else { this.lastName = value; } } } }

imdi Customer snfn oluturdunuz, bir sonraki adm form zerindeki foreName ve lastName metin kutularn snfn uygun zelliklerine balamaktr.

Blm 24

Dorulamay Gerekletirmek

477

Formdaki metin kutusu denetimlerini Customer snfndaki zelliklere balayn


1. Solution Explorerda, CustomerForm.xaml dosyasn ift tklayarak formu Design View penceresinde grntleyin. 2. XAML blmesinde, Window tanmna aadaki XML ad alan bildirimini ekleyin:
<Window x:Class=CustomerDetails.CustomerForm xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml xmlns:cust=clr-namespace:CustomerDetails Title=Customer Details Height=273 Width=370 ResizeMode=NoResize> ...

Bu bildirim ile, pencere iin XAML kodundaki CustomerDetails ad alanndaki trlere bavurabilirsiniz. 3. Aadaki Window.Resources esini pencereye ekleyin:
<Window x:Class=CustomerDetails.CustomerForm ... ...ResizeMode=NoResize> <Window.Resources> <cust:Customer x:Key=customerData /> </Window.Resources> <Grid> ...

Bu kaynak Customer snfnn yeni bir rneini yaratr. Pencerenin XAML tanmnda baka bir yerde customerData anahtar deerini kullanarak bu rnee bavurabilirsiniz. 4. XAML blmesinde foreName metin kutusunun tanmn bulun ve aada gsterildii gibi deitirin (TextBox denetimi iin kapanan snrlayc etiketini [/>], sradan snrlayc [>] ile deitirdiinizden ve kapanan </TextBox> etiketi eklediinizden emin olun):
<TextBox Height=21 Margin=70,74,0,0 Name=foreName VerticalAlignment=Top HorizontalAlignment=Left Width=120 > <TextBox.Text> <Binding Source={StaticResource customerData} Path=ForeName /> </TextBox.Text> </TextBox>

Bu kod, bu metin kutusunun Text zelliinde grntlenen veriyi, customerData nesnesinin ForeName zelliindeki veriye balar. Kullanc form zerindeki foreName metin kutusundaki deeri gncellerse, yeni veri otomatik olarak customerData nesnesine kopyalanr. Customer snfndaki ForeName zelliinin kullancnn bir deeri sadece silmediini, gerekte bir deer belirlediini denetlediini hatrlayn.

478

Ksm IV

Windows Uygulamalar ile almak

5. nceki admda eklediiniz balama tanmn deitirin ve aada gsterildii gibi Binding.ValidationRules alt esini ekleyin:
<TextBox Height=21 Margin=70,74,0,0 Name=foreName VerticalAlignment=Top HorizontalAlignment=Left Width=120 > <TextBox.Text> <Binding Source={StaticResource customerData} Path=ForeName > <Binding.ValidationRules> <ExceptionValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>

Bir balamann ValidationRules esi ile kullanc bu denetimde veri girdiinde uygulamann gerekletirmesi gereken dorulamay belirleyebilirsiniz. ExceptionValidationRule esi, bu denetimdeki veri deitiinde uygulama tarafndan oluturulan bir zel durumu denetleyen yerleik bir kuraldr. Herhangi bir zel durum saptarsa, denetimi belirginletirir, bylece kullanc giri ile ilgili bir problem olduunu grebilir. 6. lastName metin kutusuna, customerData nesnesinin LastName zellii ile ilikilendiren edeer balama ve balama kuraln ekleyin:
<TextBox Height=21 Margin=210,74,0,0 Name=lastName VerticalAlignment=Top HorizontalAlignment=Left Width=120 > <TextBox.Text> <Binding Source={StaticResource customerData} Path=LastName > <Binding.ValidationRules> <ExceptionValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>

7. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 8. Form grndnde, foreName ve lastName metin kutularna adnz yazn ve daha sonra title alan kutusunu tklayn. Kayda deer birey olmamal. 9. foreName metin kutusunu tklayn, girdiiniz ilk ad silin ve daha sonra title alan kutusunu tekrar tklayn. Bu defa, foreName metin kutusu krmz bir ereve ile belirgin hale gelir. 10. foreName metin kutusuna tekrar bir deer girin ve lastName metin kutusundaki deeri silin. File mensnde Savei tklayn. foreName metin kutusundaki krmz erevenin yok olduuna fakat lastName metin kutusu etrafnda krmz ereve olmadna dikkat edin.

Blm 24

Dorulamay Gerekletirmek

479

11. leti kutusunda, OKi tklayn ve sonra title alan kutusunu tklayn. imdi lastName metin kutusu etrafnda krmz ereve belirir. 12. Formu kapatn ve Visual Studio 2008e geri dnn. Bu noktada u iki soruyu sorabilirsiniz:
n

Neden form her zaman kullanc metin kutusuna bir deer girmeyi unuttuu zaman bunu saptamyor? Yant, dorulamann sadece metin kutusu odak noktasndan ktnda meydana gelmesidir. Bu da sadece kullanc form zerindeki baka bir denetime odaklandnda olur. Menler gerekte formun paras olarak ele alnmaz (farkl olarak ilenirler), bu nedenle bir men esi setiinizde form zerinde baka bir denetime gemi olmazsnz ve bu yzden metin kutusu henz odak dna kmamtr. Sadece title alan kutusunu (ya da baka bir denetimi) tkladnzda odak dna klr ve dorulama meydana gelir. Ayrca, foreName ve lastName metin kutular balangta botur. foreName metin kutusundan lastName metin kutusuna geerseniz ve daha sonra da hibir ey yazmadan title alan kutusuna geerseniz dorulama gereklemez. Sadece bir eyler yazdnzda ve sonra sildiinizde dorulama alr. Bu problemi daha sonra ele alacaksnz. Sadece bir denetimdeki girilen deerle ilgili bir problem olduunu vurgulamak yerine anlaml bir hata iletisini nasl grntleyebiliriz? zel durum tarafndan retilen iletiyi yakalayabilir ve formda baka bir yerde grntleyebilirsiniz. Aadaki altrmada bunu nasl yapacanz greceksiniz.

zel durum iletilerine bir stil ekleyin


1. CustomerForm.xaml dosyasn grntleyen Design View penceresinde, XAML blmesinde Window.Resources esine aadaki stili ekleyin:
<Window.Resources> <cust:Customer x:Key=customerData /> <Style x:Key=errorStyle TargetType=Control> <Style.Triggers> <Trigger Property=Validation.HasError Value=True> <Setter Property=ToolTip Value={Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation. Errors)[0].ErrorContent} /> </Trigger> </Style.Triggers> </Style> </Window.Resources>

Bu stil, denetimin Validation.HasError zelliinin ne zaman true olarak ayarlandn saptayan bir tetikleyici ierir. Denetimin balama dorulama kural bir zel durum oluturursa bu meydana gelir. Tetikleyici, zel durumun metnini grntlemek iin geerli denetimin ToolTip zelliini ayarlar. Burada gsterilen balama

480

Ksm IV

Windows Uygulamalar ile almak

szdiziminin ayrntl aklamas bu kitabn kapsam dndadr, fakat {Binding RelativeSource={x:Static RelativeSource.Self} balama kayna geerli denetime bavurur ve (Validation.Errors)[0].ErrorContent balama yolu bu balama kaynanda bulunan ilk zel durum iletisini ToolTip zellii ile ilikilendirir. (Bir zel durum baka zel durumlar oluturabilir, tm kendi iletilerini retir. lk ileti genellikle en nemlisidir). 2. foreName ve lastName metin kutusuna aada gsterildii gibi errorStyle stilini uygulayn:
<TextBox Style={StaticResource errorStyle} ... Name=foreName ... > ... </TextBox> <TextBox Style={StaticResource errorStyle} ... Name=lastName ... > ... </TextBox>

3. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 4. Form belirdiinde, foreName ve lastName metin kutularna adnz yazn ve sonra title alan kutusunu tklayn. 5. foreName metin kutusunu tklayn, girdiiniz ad silin ve daha sonra tekrar title alan kutusunu tklayn. foreName metin kutusu krmz renk ereve ile belirgin hale gelecektir. Not foreName metin kutusunun ieriini gerekten sildiinizden emin olun. 6. Balklar listesini gizlemek iin Title alan kutusunu tekrar tklayn ve daha sonra fare ilecini foreName metin kutusu zerinde brakn. Aadaki gibi, Specify a forename for the customer, (Mterinin adn girin) iletisini grntleyen bir Ekran pucu belirmelidir:

Bu ileti, Customer snfnn ForeName zelliine eklediiniz zel durum tarafndan oluturulur.

Blm 24

Dorulamay Gerekletirmek

481

7. lastName metin kutusunu temizleyin ve sonra Title alan kutusunu tklayn. Listeyi gizlemek iin Title alan kutusunu tekrar tklayn ve sonra fare ilecini lastName metin kutusu zerinde brakn ve Specify a last name for the customer (Mterinin soyadn girin) ara ipucunun belirdiini dorulayn. 8. Formu kapatn ve Visual Studio 2008e dnn. Hala zlmesi gereken baz problemler var. Fakat mteriye hitap ekli ve cinsiyetini nasl dorulayacanz grdkten sonra bu problemi zeceksiniz.

Mteri hitap ekli ve cinsiyetini dorulamak iin zellikler ekleyin


1. Customer.cs dosyasn grntleyen Code and Text Editor penceresine gein. 2. Customer snfnn stndeki dosyaya, aada gsterildii gibi, Title ve Gender numaralandrmalarn ekleyin.
enum Title { Mr, Mrs, Miss, Ms } enum Gender { Male, Female } class Customer { ... }

Customer snfnn Title ve Gender zelliklerini belirlemek iin bu numaralandrmalar kullanacaksnz. 3. Aada gsterildii gibi, Customer snfna title ve gender zel (private) alanlarn ekleyin:
class Customer { private string foreName; private string lastName; private Title title; private Gender gender; ... }

4. Aada gsterildii gibi Customer snfna zel (private) yntemi ekleyin:


class Customer { ... private bool checkTitleAndGender(Title proposedTitle, Gender proposedGender) { bool retVal = false; if (proposedGender.Equals(Gender.Male)) { retVal = (proposedTitle.Equals(Title.Mr)) ? true : false; }

482

Ksm IV

Windows Uygulamalar ile almak


if (proposedGender.Equals(Gender.Female)) { retVal = (proposedTitle.Equals(Title.Mr)) ? false : true; } return retVal; }

Bu yntem, proposedTitle ve proposedGender parametrelerindeki deerleri inceler ve tutarl olmas iin bu parametreleri test eder. proposedTitle ve proposedGender parametrelerindeki deerler tutarl ise, bu yntem true dndrr; aksi durumda false dndrr. Not Bu yntemde kullanlan l ilemciye (? ve : ile gsterilen) aina olmayabilirsiniz.
Younlatrlm if else ifadesi gibi alr. Aadaki biime sahiptir: boolean deyimi ? true sonucu : false sonucu Boolean deyimi deerlendirilir. Eer true sonucu verirse, soru iareti (?) ve iki nokta st ste (:) aras deerlendirilir ve tm deyimin sonucu olarak kullanlr; aksi takdirde iki nokta st ste (:) iaretinden sonras deerlendirilir ve sonu olarak kullanlr.

5. Customer snfna aada gsterilen Title ve Gender zelliklerini ekleyin. Title zelliinin tr Title numaralandrma ve Gender zelliinin tr de Gender numaralandrmadr:
class Customer { ... public Title Title { get { return this.title; } set { this.title = value; if (!checkTitleAndGender(value, this.gender)) { throw new ApplicationException( The title must match the gender of the customer); } } } public Gender Gender { get { return this.gender; } set { this.gender = value; if (!checkTitleAndGender(this.title, value))

Blm 24
{

Dorulamay Gerekletirmek

483

throw new ApplicationException( The gender must match the title of the customer); } } } }

Bu zelliklerin set eriimcileri, title ve gender alanlarnn eletiini dorulamak iin checkTitleAndGender yntemini arr ve alanlar elemiyorsa bir zel durum oluturur. 6. Aada gsterildii gibi, Customer snfna ToString yntemini ekleyin:
class Customer { ... public override string ToString() { return this.Title.ToString() + + this.ForeName + + this.LastName + - + this.Gender.ToString(); } }

Verinin doru olduunu dorulamak iin mteri bilgilerini kaydederken grntlemek iin bu yntemi kullanacaksnz. Bir sonraki aama, form zerindeki male ve female seenek dmeleri ve title alan kutusunu bu yeni zelliklere balamaktr. Bununla birlikte, biraz dnrseniz, ok sayda kk sorunlar olduunu anlarsnz. lk olarak, title alan kutusunun Text zelliini, form tarafndan yaratlan Customer nesnesinin Title zelliine balamanz gerekir. Text zellii string trndedir. Title zellii de Title (bir numaralandrma) trndedir. Balamann almas iin string ve Title deerlerini birbirine evirmeniz gerekir. Neyse ki, WPF tarafndan gerekletirilen balama mekanizmas ile, bunun gibi ilemleri gerekletirmek iin bir evirici snf belirleyebilirsiniz. kinci problem de benzer bir problemdir. Her bir seenek dmesinin IsChecked zelliini (bir boolean deerdir), Customer nesnesinin Gender zelliine (Gender trne sahiptir) balamanz gerekir. Yine, bir boolean deer ve Gender deer arasnda dntrme yapmak iin bir evirici snf yaratabilirsiniz fakat ayrca hangi iki seenek dmesinin tklandn da gstermeniz gerekir. Bu seenek dmelerinden birini tkladnzda Gender zelliini ayarlam olursunuz fakat her durumda farkl bir deere ayarlarsnz. male seenek dmesinin IsChecked zellii true olarak ayarlanmsa, Gender zelliini Gender.Male olarak ayarlamalsnz. female seenek dmesinin IsChecked zellii true olarak ayarlanmsa, Gender zelliini Gender.Female olarak ayarlamalsnz. Neyse ki, Microsoftun WPF ekibi bunu iyi dnmtr ve hangi seenek dmesinin tklandn size gsterecek olan bir evirici yntemine parametre geirebilirsiniz.

484

Ksm IV

Windows Uygulamalar ile almak

evirici yntemler, IValueConverter arabirimini uygulamak zorunda olan kendi snflarna aittir. Bu arabirim iki yntem tanmlar: balama iin veri salayan snftaki zellik tarafndan kullanlan tr form zerinde grntlenen tre dntren Convert yntemi ve form zerinde grntlenen tr snf tarafndan istenen tre dntren ConvertBack yntemi.

evirici snflar ve yntemler yaratn


1. Customer.cs dosyasnda, dosyann st ksmna aadaki using ifadesini ekleyin.
using System.Windows.Data;

Bu ad alannda IValueConverter arabirimi tanmlanr. 2. Aada gsterilen TitleConverter snfn dosyaya ekleyin.
[ValueConversion(typeof(string), typeof(Title))] public class TitleConverter : IValueConverter { }

Snfn st ksmnda keli parantezler iindeki metin, bir znitelik rneidir. Bir znitelik bir snf iin tanmlayc metaveri bilgisi salar. Design View penceresindeki WPF tasarmc gibi aralar tarafndan, bir snfa bavurduunuzda snf doru olarak uyguladnz dorulamak iin ValueConversion znitelii kullanlr. ValueConversion znitelii parametreleri form (string) tarafndan grntlenen deerin trn ve snftaki (Title) uygun zellikteki deer trn belirler. lerleyen blmlerde zniteliklerle ilgili daha fazla rnek greceksiniz. 3. TitleConverter snfna, aada gsterilen Convert yntemini ekleyin:
public class TitleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Title title = (Title)value; return title.ToString(); } }

Convert ynteminin imzas IValueConverter arabirimi tarafndan tanmlanr. value parametresi, snftaki dntreceiniz deerdir. (imdilik dier parametreleri ihmal edebilirsiniz.) Bu yntemden dn deeri form zerindeki zellie bal veridir. Bu durumda, Convert yntemi bir Title deeri bir stringe dntrr. value parametresinin bir object olarak geirildiine, bu nedenle parametreyi kullanmaya kalkmadan nce uygun tre dntrmeniz gerektiine dikkat edin.

Blm 24

Dorulamay Gerekletirmek

485

4. Aada gsterilen ConvertBack yntemini TitleConverter snfna ekleyin:


public class TitleConverter : IValueConverter { ... public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Title retVal = Title.Miss; switch ((string)value) { case Mr : retVal = Title.Mr; break; case Mrs : retVal = Title.Mrs; break; case Ms : retVal = Title.Ms; break; case Miss: retVal = Title.Miss; break; } return retVal; } }

ConvertBack ynteminde, value parametresi imdi formdaki, snf iin uygun tre dntreceiniz deerdir. Bu durumda, ConvertBack yntemi veriyi stringden (alan kutudaki Text zelliinde grntlenir) uygun Title deere dntrr. 5. Customer.cs dosyasna, TitleConverter snfndan sonra, aada gsterilen GenderConverter snfn ekleyin:
[ValueConversion(typeof(bool), typeof(Gender))] public class GenderConverter : IValueConverter { }

Bu defa, snf form zerindeki seenek dmelerine uygun olarak Gender deerler ve Boolean deerler arasnda dnm yapacaktr. 6. GenderConverter snfna aada gsterilen Convert yntemini ekleyin:
public class GenderConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string radioButtonId = (string)parameter; Gender gender = (Gender)value; bool retVal = false;

486

Ksm IV

Windows Uygulamalar ile almak


if (String.Equals(radioButtonId, Female) && gender.Equals(Gender.Female)) retVal = true; if (String.Equals(radioButtonId, Male) && gender.Equals(Gender.Male)) retVal = true; return retVal; }

Bu durumda, yntem parameter parametresini kullanacaktr. Bir formdaki eviriciye bavurduunuzda, ek bir veri belirtebilirsiniz. Bir snfta ayn zellie birden fazla denetimin balanmas gerekiyorsa, bu yararldr. evirici yntemi hangi denetimin ardn belirlemek iin bu parametreyi kullanabilirsiniz. Sonraki altrmada, seenek dmelerinin forma balanmas iin kod eklediinizde, male seenek dmesi iin Male parametresi ve female seenek dmesi iin Female parametresini belirteceksiniz. value parametresi Gender.Female deerini ieriyorsa, mteri nesnesi de bayan (female) olur ve yntem true dndrr. parameter parametresi Female iken, value parametresi Gender.Male ise, mteri nesnesi erkektir (male) ve yntem false dndrr. parameter parametresi Male ise, yntem ayn mant kullanr. 7. GenderConverter snfna aada gsterilen ConvertBack yntemini ekleyin:
public class GenderConverter : IValueConverter { ... public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (String.Equals((string)parameter, Female)) return Gender.Female; else return Gender.Male; } }

Bu yntem son derecede basittir. Anlalmas gereken nemli nokta, evirici ynteminin sadece kullanc form zerindeki deeri deitirdiinde arlmasdr. Seenek dmesi iin, kullanc dmeyi sadece seebilir, onu temizleyemez. Bir seenek dmesi yalnzca ayn grupta baka bir seenek dmesi seildiinde temizlenir. Yani, value parametresini kontrol etmeniz gerekmez nk her zaman true olacaktr. parameter parametresine dayanarak yalnzca Gender deerini dndrmeniz gerekir.

Blm 24

Dorulamay Gerekletirmek

487

Formdaki alan kutu ve seenek dmeleri denetimlerini Customer snfndaki zelliklere balayn
1. CustomerForm.xaml dosyasn grntleyen Design View penceresine dnn. 2. XAML blmesinde, pencereye kaynak olarak bir TitleConverter nesnesi ekleyin ve titleConvertern anahtar deerini belirtin. Baka bir kaynak olarak, aada gsterildii gibi, genderConverter anahtar deeri ile birlikte GenderConverter nesnesi ekleyin:
<Window.Resources> <cust:Customer x:Key=customerData /> <cust:TitleConverter x:Key=titleConverter /> <cust:GenderConverter x:Key=genderConverter /> ... </Window.Resources>

3. title alan kutusu tanmn bulun ve errorStyle stili kullanarak denetimi biimlendirin. Alan kutu eleri listesinden sonra, alan kutunun Text zelliini customerData nesnesindeki Title zelliine balamak iin aada gsterilen, evirici yntemlerini salayan nesne olarak titleConverter kaynan belirleyen XAML kodu ekleyin:
<ComboBox Style={StaticResource errorStyle} ... Name=title ...> <ComboBox.Items> ... </ComboBox.Items> <ComboBox.Text> <Binding Source={StaticResource customerData} Path=Title Converter={StaticResource titleConverter} > <Binding.ValidationRules> <ExceptionValidationRule /> </Binding.ValidationRules> </Binding> </ComboBox.Text> </ComboBox>

4. male seenek dmesinin tanmn deitirin. Aadaki kodda gsterildii gibi, errorStyle stilini uygulayn, seenek dmesi tanmndan IsChecked=True zelliini kaldrn ve customerData nesnesinin Gender zelliine IsChecked zelliini balamak iin XAML kodunu ekleyin. genderConverter nesnesini evirici yntemleri salayan kaynak olarak belirleyin ve ConverterParameter zelliini Male olarak ayarlayn.
<RadioButton Style={StaticResource errorStyle} Height=16 Name=male Width=120 Margin=0,20,0,0 > Male <RadioButton.IsChecked> <Binding Source={StaticResource customerData} Path=Gender Converter={StaticResource genderConverter} ConverterParameter=Male> <Binding.ValidationRules> <ExceptionValidationRule /> </Binding.ValidationRules>

488

Ksm IV

Windows Uygulamalar ile almak

</Binding> </RadioButton.IsChecked> </RadioButton>

5. Ayn ekilde female seenek dmesi tanmn deitirin ama ConverterParameter zelliini Female olarak ayarlayn.
<RadioButton Style={StaticResource errorStyle} Height=16 Name=female Width=120 Margin=0,10,0,0 > Female <RadioButton.IsChecked> <Binding Source={StaticResource customerData} Path=Gender Converter={StaticResource genderConverter} ConverterParameter=Female> <Binding.ValidationRules> <ExceptionValidationRule /> </Binding.ValidationRules> </Binding> </RadioButton.IsChecked> </RadioButton>

6. CustomerForm.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gemek iin View mensnde, Codeu tklayn. 7. saveCustomer_Click yntemindeki kodu aadaki gibi deitirin:
private void saveCustomer_Click(object sender, RoutedEventArgs e) { Binding customerBinding = BindingOperations.GetBinding(this.title, ComboBox.TextProperty); Customer customer = customerBinding.Source as Customer; MessageBox.Show(customer.ToString(), Saved); }

Bu kod mteri bilgisini ileti kutusunda grntler. (mteri bilgisi hl herhangi bir yere kaydedilmemitir.) BindingOperations snfnn statik GetBinding yntemi, belirlenen zelliin bal olduu nesneye bir bavuru dndrr. Bu durumda, GetBinding yntemi, title alan kutusunun Text zelliine bal nesneyi bulacaktr. Bu, customerData kaynann bavurduu nesne ile ayn olmaldr. Aslnda kod, ayn bavuruyu elde etmek iin foreName, lastName, male ve female denetimlerinin balanma zelliklerini sorgulayabilmeliydi. Bavuru, bir Binding nesnesi olarak dndrlr. Kod daha sonra bu Binding nesnesini, mterinin bilgilerini grntlemeden nce Customer nesnesine dndrr. nemli Bu altrmadaki sonraki admlar, .NET Frameworkn geerli srmndeki

hatadan dolay gereklidir. Bir seenek dmesi setiinizde, ayn gruptaki dier seenek dmeleri otomatik olarak temizlenir. Bununla birlikte, temizlenen seenek dmeleri de balantlarn kaybeder ve bu dmeleri tekrar seerseniz dorulama artk almaz. zm, seenek dmesi her seildiinde temizlenen tm seenek dmeleri iin balamalar yeniden oluturmak ve yeniden balamaktr. Bu rnekte, kullanc male seenek dmesini setiinde uygulamann female dmesi iin balamay yeniden oluturmas ve yeniden balamas gerekir. Bu hata .NET Frameworkn gelecekteki srmlerinde dzeltilmelidir.

Blm 24

Dorulamay Gerekletirmek

489

8. CustomerForm snfna aada gsterilen zel yntemi ekleyin:


public partial class CustomerForm : Window { ... private Binding rebuildBinding(string parameter) { Binding customerBinding = BindingOperations.GetBinding(this.title, ComboBox.TextProperty); Customer customer = customerBinding.Source as Customer; Binding binding = new Binding(); binding.Source = customer; binding.Path = new PropertyPath(Gender); binding.Converter = new GenderConverter(); binding.ConverterParameter = parameter; binding.ValidationRules.Add(new ExceptionValidationRule()); return binding; } }

Bu yntem Gender seenek dmeleri iin yeni bir balama yaratr. lk iki ifade size tandk gelmelidir; form tarafndan yaratlan customerData nesnesine bir bavuru elde ederler. Kalan admlar, kaynak olarak customerData nesnesinin Gender zelliine bavuran yeni bir balama nesnesi yaratr ve seenek dmeleri tarafndan istenildii gibi, GenderConverter evirici nesnesine bir bavuru ekler. parameter deikeni, bu ynteme geirilecek olan ve yntemin hangi seenek dmesi iin balamay yeniden yarattna bal olarak Male ya da Female metni ierecek olan bir dizedir. Son olarak kod, yntemi arana balamay dndrmeden nce balamaya ExceptionValidationRule dorulama kuraln ekler. ki seenek dmesinin her ikisi iin balamann XAML tanm ile bu kodu karlatrn. 9. CustomerForm.xaml dosyasn grntleyen Design View penceresine dnn. XAML blmesinde, male seenek dmesi tanmn bulun ve male_Checked adnda (<New Event Handler> komutu tarafndan retilen varsaylan ad) bir Checked olay yntemi belirleyin.
<RadioButton ... Name=male ... Checked=male_Checked>

10. female seenek dmesi tanmnda, female_Checked adnda bir Checked olay yntemi belirleyin.
<RadioButton ... Name=female ... Checked=female_Checked>

11. CustomerForm.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. Aada gsterilen kodu male_Checked ve female_Checked yntemlerine ekleyin:
public partial class CustomerForm : Window { ... private void male_Checked(object sender, RoutedEventArgs e)

490

Ksm IV

Windows Uygulamalar ile almak


{ Binding binding = rebuildBinding(Female); if (this.female != null) { this.female.SetBinding(RadioButton.IsCheckedProperty, binding); BindingExpression femaleBe = this.female.GetBindingExpression(RadioButton.IsCheckedProperty); femaleBe.UpdateTarget(); } } private void female_Checked(object sender, RoutedEventArgs e) { Binding binding = rebuildBinding(Male); if (this.male != null) { this.male.SetBinding(RadioButton.IsCheckedProperty, binding); BindingExpression maleBe = this.male.GetBindingExpression(RadioButton.IsCheckedProperty); maleBe.UpdateTarget(); } }

Bu male_Checked yntemi, female seenek dmesi iin balamay yeniden oluturur ve yeniden balar. Kod daha sonra, form zerindeki female seenek dmesinin durumunu, temelde yatan Customer nesnesinin Gender zellii ile eitleyen BindingExpression nesnesini yaratr. UpdateTarget yntemi, female seenek dmesinin Gender zellii iin doru deer gsterdiinden emin olur; Customer nesnesinin Gender zellii Female ise, female seenek dmesinin IsChecked zellii true olarak ayarlanacaktr; aksi durumda false olarak ayarlanacaktr. female_Checked yntemi, male seenek dmesi iin ayn ilemi gerekletirir.

Uygulamay altrn ve dorulamay snayn


1. Uygulamay oluturmak ve altrmak iin Debug mensnde, Start Without Debuggingi tklayn. Varsaylan hitap biiminin Mr olduuna ve varsaylan cinsiyetin de Male olduuna dikkat edin. 2. Title alan kutusunda Mrsi tklayn. Customer snfndaki checkTitleAndGender yntemi, hitap biimi ve cinsiyet uyumadndan bir zel durum oluturur. Title kutusu krmz ereve ile belirgin hale gelmitir. Fare iaretcisini Title alan kutusu zerinde brakn ve The title must match the gender of the customer (Hitap biiminin mterinin cinsiyetine uygun olmas gerekir) iletisinin belirdiini dorulayn. 3. Title alan kutusunda Mr tklayn. Hata iletisinin yok olduunu dorulayn.

Blm 24

Dorulamay Gerekletirmek

491

4. Gender grup kutusunda, Female seenek dmesini tklayn. Ayn ekilde, checkTitleAndGender yntemi bir zel durum oluturur ve krmz ereve ile belirgin hale getirilmi Female seenek dmesi belirir. Fare iaretcisini Female alan kutusu zerinde brakn ve The gender must match the title of the customer (Cinsiyet, mteriye hitap biimine uygun olmaldr) iletisinin belirdiini dorulayn. 5. File mensnde Savei tklayn. Mteriye hitap biimini (Mr) ve mterinin cinsiyetini (Female) gsteren bir ileti kutusu belirir. Form hatal ve eksik veri (bir ad girmediniz) ierse de, veriyi kaydedebilirsiniz! 6. OKi tklayn ve daha sonra foreName ve lastName metin kutularna bir ad yazn fakat lastName metin kutusu dnda bir yeri tklamayn. 7. File mensnde Savei tekrar tklayn. leti kutusu imdi mterinin ilk adn ierir fakat soyadn iermez. Bunun nedeni, formdaki lastName metin kutusunun odak dnda kalmasdr. Metin kutusu iin veri balama dorulamann, sadece kullanc formda baka bir denetimi tklarsa meydana geldiini hatrlayn. Ayn ey verinin kendisine de uygulanr; varsaylan ayar olarak, sadece metin kutusu odak dnda kaldnda veri customerDetails nesnesine kopyalanr. Aslnda, bu veriyi formdan dorulamay tetikleyen customerDetails nesnesine kopyalama eylemidir. 8. OKi tklayn ve daha sonra Title alan kutusunu tklayn. Hitap biimini Mrs olarak ayarlayn. File mensnde Savei tklayn. Bu defa, ileti kutusu mterinin ilk adn ve soyadn gsterir. Ayrca, hitap biimi (Mrs) ve cinsiyet (Female) elemese de seenek dmesi bir hata bayra meydana getirir. 9. OK i tklayn, uygulamay kapatn ve Visual Studio 2008e dnn.

Dorulamann Gerekletii Noktay Deitirmek


Mteri Ynetimi uygulamas ile ilgili problem dorulamann yanl zamanda yaplmas, tutarszca uygulanmas ve kullancnn tutarsz veriyi kaydetmesini gerekte engellememesidir. Dorulamay ilemek iin alternatif bir yaklama ihtiyacnz var. zm, sadece kullanc veriyi kaydettiinde kullancnn giriini denetlemektir. Bu yntemle, kullancnn veri giriini tamamladndan ve verilerin tutarl olduundan emin olabilirsiniz. Herhangi bir problem olursa, bir hata iletisi grntleyebilir ve hata dzeltilene kadar verinin kaydedilmesini engelleyebilirsiniz. Aadaki altrmada, kullanc mteri bilgisini kaydetmeye kalkana kadar dorulamay ertelemek iin Mteri Ynetimi uygulamasn deitireceksiniz.

492

Ksm IV

Windows Uygulamalar ile almak

Veriyi ak bir ekilde dorulayn


1. CustomerForm.xaml dosyasn grntleyen Design View penceresine dnn. XAML blmesinde, title alan kutusu iin balamay deitirin ve aada gsterildii gibi UpdateSourceTrigger zelliini Explicit olarak ayarlayn:
<ComboBox ... Name=title ...> ... <ComboBox.Text> <Binding Source={StaticResource customerData} Path=Title Converter={StaticResource titleConverter} UpdateSourceTrigger=Explicit > ... </Binding> </ComboBox.Text> </ComboBox>

UpdateSourceTrigger zellii, kullanc tarafndan girilen bilginin ne zaman temeldeki Customer nesnesine geri gnderildiini ve dorulandn belirler. Bu zellii Explicit olarak ayarlamak, uygulamanz ak bir ekilde kod kullanarak bunu gerekletirene kadar bu eitlemeyi erteler. 2. UpdateSourceTrigger zelliini Explicit olarak ayarlamak iin, foreName ve lastName metin kutular iin balamay deitirin:
<TextBox ... Name=foreName ... > <TextBox.Text> <Binding Source={StaticResource customerData} Path=ForeName UpdateSourceTrigger=Explicit > ... </Binding> </TextBox.Text> </TextBox> ... <TextBox ... Name=lastName ... > <TextBox.Text> <Binding Source={StaticResource customerData} Path=LastName UpdateSourceTrigger=Explicit > ... </Binding> </TextBox.Text> </TextBox>

Uygulama, kullanc mteri bilgisini kaydedene kadar mteriye hitap biimi ve mterinin cinsiyeti arasnda tutarll denetlemeyecektir. Title zellii iin dorulama kural geerse, Gender zelliini dorulamak gerekmez. Benzer ekilde, Title zellii iin dorulama kural baarsz olursa, Gender zelliini incelemek gerekmez. Dier bir deyile, form zerindeki Gender seenek dmeleri iin dorulama kural gereksizdir, o nedenle kaldrn. Bunu yapmak iin, male ve female seenek dmeleri iin balamalardan Binding.ValidationRules ve ExceptionValidationRule elerini kaldrn. Balamann UpdateSourceTrigger zelliini Explicit olarak ayarlamayn.

Blm 24

Dorulamay Gerekletirmek

493

3. CustomerForm.xaml.cs dosyasn grntleyen Code and Text Editor penceresine dnn. rebuildBinding ynteminde, balamaya dorulama kural ekleyen ifadeyi bulun ve aklama satrna dntrn:
private Binding rebuildBinding(string parameter) { ... // binding.ValidationRules.Add(new ExceptionValidationRule()); ... }

4. saveCustomer_Click ynteminde, yntemin balangcna aadaki ifadeleri ekleyin:


private void saveCustomer_Click(object sender, RoutedEventArgs e) { BindingExpression titleBe = this.title.GetBindingExpression(ComboBox.TextProperty); BindingExpression foreNameBe = this.foreName.GetBindingExpression(TextBox.TextProperty); BindingExpression lastNameBe = this.lastName.GetBindingExpression(TextBox.TextProperty); ... }

Bu ifadeler, denetimin her biri iin balama dorulama kurallar ile birlikte BindingExpression nesneleri yaratr. Bu blmde daha nceki altrmada, form zerinde grntlenen verinin Customer nesnesindeki veri ile UpdateTarget ynteminin arlarak eitlenmesi iin bir BindingExpression nesnesi kullanabileceinizi grdnz. BindingExpression snf da ayrca, UpdateSource yntemi salar. Bu yntem veri eitlemeyi baka bir yolla, form zerindeki denetimlerin balama zelliklerindeki deerleri Customer nesnesine geri gndererek yapar. Byle olduunda, veri de dorulanacaktr. 5. saveCustomer_Click yntemine, nceki admda eklediiniz koddan sonrasna aadaki ifadeleri ekleyin:
private void saveCustomer_Click(object sender, RoutedEventArgs e) { ... titleBe.UpdateSource(); foreNameBe.UpdateSource(); lastNameBe.UpdateSource(); ... }

Bu ifadeler Customer nesnesindeki zellikleri, kullancnn form zerinde girdii deerlerle gnceller ve olabildii kadar veriyi dorular. Gender zelliini el ile gncellemenin gerekmediine dikkat edin. nk seenek dmelerinin balamas iin UpdateSourceTrigger zelliini Explicit olarak ayarlamadnz; Gender zellii yine otomatik olarak gncellenir.

494

Ksm IV

Windows Uygulamalar ile almak

BindingExpression snf, UpdateSource ynteminin baarl olup olmadn gsteren HasError adnda bir zellik salar. 6. Her BindingExpression nesnesinin HasError zelliini test etmek ve dorulama baarz olduysa bir ileti grntlemek iin saveCustomer_Click yntemine aadaki kodu ekleyin. Mteri bilgilerini grntleyen orijinal kodu, if ifadesinin else ksmna tayn.
private void saveCustomer_Click(object sender, RoutedEventArgs e) { ... if (titleBe.HasError || foreNameBe.HasError || lastNameBe.HasError) { MessageBox.Show(Please correct errors, Not Saved); } else { Binding customerBinding = BindingOperations.GetBinding(this.title, ComboBox.TextProperty); Customer customer = customerBinding.Source as Customer; MessageBox.Show(customer.ToString(), Saved); } }

Uygulamay tekrar snayn


1. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. 2. Mteri Bilgileri (Customer Details) formu belirdiinde, Title alan kutusunu Mrs olarak ayarlayn. Henz dorulanmadndan alan kutunun belirgin hale getirilmediine dikkat edin . 3. File mensnde Savei tklayn. Please correct errors, (Ltfen hatalar dzeltin) yazan bir ileti kutusu belirmeli ve form zerinde Title ve Name alanlar belirgin hale gelmelidir. Bunun nedeni, Title alan kutusundaki deer ile cinsiyetin elememesi ve Name alanlarn bo brakmanzdr. Fare iaretisini krmz ereve ile vurgulanm olan alanlarn zerinde brakrsanz, Ekran pucu hata iletisinin nedenini grntler. 4. leti kutusunu kapatmak iin OKi tklayn. 5. Female seenek dmesini tklayn ve mterinin ilk adn ve soyadn girin. Hatal denetimlerin vurgularnn yok olmadna dikkat edin. 6. File mensnde tekrar Savei tklayn. Bu defa, veri tam ve tutarldr. Mterinin tm bilgilerini grntleyen bir ileti kutusu belirmeli ve form zerindeki vurgu yok olmaldr. 7. OK i tklayn ve uygulamadan kn.

Blm 24

Dorulamay Gerekletirmek

495

Bu blmde, veri balamay kullanarak salanan varsaylan zel durum dorulama kural ilemeyi kullanarak basit dorulamay nasl gerekletireceinizi grdnz. Daha karmak denetimler gerekletirmek isterseniz kendi dorulama kurallarnz da tanmlayabilirsiniz. Daha fazla bilgi iin Visual Studio 2008 ile salanan belgelere bakn.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 25e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 24 Hzl Bavuru


Bunun in
Bir form zerindeki bir denetimin zelliini bir nesne zelliine balamak iin veri balamay kullanmak

unu Yapn
Denetimin zellii iin XAML kodunda, nesneyi ve nesnede balanacak zelliin adn tanmlayan bir balama kayna belirtin. rnein:
<TextBox ...> <TextBox.Text> <Binding Source={StaticResource customerData} Path=ForeName /> </TextBox.Text> </TextBox>

Kullanc tarafndan girilen veriyi dorulamak iin bir veri dorulamay etkinletirmek.

Balama paras olarak Binding.ValidationRules esi belirleyin. rnein:


<Binding Source={StaticResource customerData} Path=ForeName /> <Binding.ValidationRules> <ExceptionValidationRule/> </Binding.ValidationRules> </Binding>

496

Ksm IV

Windows Uygulamalar ile almak

Birbirini engellemeyecek biimde hata bilgisini grntlemek

Denetimin Validation.HasError zelliindeki bir deiiklii saptayan bir stil tanmlayn ve daha sonra denetimin ToolTip zelliine, zel durum tarafndan dndrlen iletiyi atayn. Bu stili dorulama gerektiren tm denetimlere uygulayn. rmein:
<Style x:Key=errorStyle TargetType=Control> <Style.Triggers> <Trigger Property=Validation.HasError Value=True> <Setter Property=ToolTip Value={Binding RelativeSource= {x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent} /> </Trigger> </Style.Triggers> </Style>

Bir formdaki tm denetimleri, kullanc bir denetimden dier denetime getiinde deil, programl olarak denetim altnda dorulamak

Balama iin XAML kodunda, uygulama isteyene kadar dorulamay ertelemek iin balamann UpdateSourceTrigger zelliini Explicit olarak ayarlayn. Tm denetimler iin veriyi dorulamak iin, her denetimin balama zellii iin bir BindingExpression nesnesi yaratn ve UpdateSource yntemini arn. Her BindingExpression nesnesinin HasError zelliini inceleyin. Bu zellik true ise, dorulama baarsz olmutur.

Adm Adm Microsoft Visual C# 2008

Veriyi Ynetmek
Bu ksmdaki konular: Blm 25 . Bir Veritabannda Bilgi Sorgulamak . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Blm 26 . Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek . . 529

Ksm V

497

Blm 25

Bir Veritabannda Bilgi Sorgulamak


Bu blm tamamladktan sonra renecekleriniz:
n

Microsoft ADO.NET kullanarak Microsoft SQL Server veritabanndan veri almak ve grntlemek. Bir veritabanndan alnan veriyi tutmak iin varlk snflar tanmlamak. Bir veritabann sorgulamak ve varlk snflarnn rneklerini yerletirmek iin DLINQ kullanmak. Tr gvenlikli olarak bir veritabanna erimek iin istee bal bir DataContext snf yaratmak.

n n

Bu kitabn IV. ksmnda, Microsoft Visual C# kullanarak kullanc arabirimleri yaratmay, bilgi sunmay ve dorulamay rendiniz. Ksm Vte ise Microsoft Visual Studio 2008 ve Microsoft .NET Frameworknde bulunan veri eriim ilevselliini kullanarak veri ynetmeyi reneceksiniz. Kitabn bu ksmnda yer alan blmler, veritaban kullanan uygulamalar yazmay kolaylatrmak iin zellikle tasarlanm bir nesneler ktphanesi olan ADO.NETi aklar. Bu blmde ayrca DLINQ (Veritabanndan veri almak iin tasarlanm ADO.NET'e dayal olarak LINQ geniletmesi) kullanarak nasl veri sorgulayacanz reneceksiniz. Blm 26da, veri gncellemek iin ADO.NET ve DLINQ kullanmakla ilgili daha fazla ey reneceksiniz. nemli Bu blmdeki altrmalar tamamlamak iin Microsoft SQL Server 2005 Express Edition, Service Pack 2i yklemeniz gerekir. Bu yazlm, Microsoft Visual Studio 2008 ve Visual C# 2008 Express Edition DVD'sinde mevcuttur ve varsaylan ayar olarak yklenir.

nemli Bu blmdeki ve kitabn geri kalan blmlerindeki altrmalar tamamlamak iin Ynetici hesabn kullanmanz nerilir.

ADO.NET Kullanarak Veritaban Sorgulamak


ADO.NET snf ktphanesi, bir ilikisel veritabannda tutulan veriyi almas ve gncellemesi gereken uygulamalar oluturmak iin kapsaml bir at ierir. ADO.NET tarafndan tanmlanan model, veri salayclar kavramna dayanr. Her veritaban ynetim sistemi (SQL Server, Oracle, IBM DB2 vb.) veritabanna balanmak, sorgular bildirmek ve veriyi
499

500

Ksm V

Veriyi Ynetmek

gncellemek iin tekniklerin soyutlamasn uygulayan kendi veri salaycsna sahiptir. Bu soyutlamalar kullanarak, temeldeki veritaban ynetim sisteminden bamsz olan tanabilir kod yazabilirsiniz. Bu blmde, SQL Server 2005 Express Edition tarafndan ynetilen bir veritabanna balanacaksnz fakat reneceiniz tekniklerin farkl veritaban ynetim sistemine de uygulanabilir olduunu greceksiniz.

Northwind Veritaban
Northwind Traders, mterilerine egzotik adlar olan yiyecek ve iecek rnleri satan kurmaca bir irkettir. Northwind veritaban, Northwind Traders irketinin satt mallar, mterileri, mteriler tarafndan verilen sipariler, mal aldklar toptanclar, mterilere mallar gndermek iin kullandklar nakliyeciler ve irketteki alanlarla ilgili bilgileri tutan birok tablo ierir. ekil 25-1 Northwind Traders veritabanndaki tm tablolar ve bunlarn birbirleriyle olan ilikilerini gstermektedir. Bu blmde kullanacanz tablolar Orders (Sipariler) ve Products (rnler) tablolardr.

Veritaban Yaratmak
Devam etmeden nce Northwind Traders veritabann yaratmanz gerekir.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

501

Bir SQL Server 2005 Veritaban Yaratmak in zinler Atamak


Bir veritaban yaratmadan nce SQL Server 2005 Express iin ynetici haklarna sahip olmanz gerekir. Windows Vista iletim sistemi kullanyorsanz, varsaylan ayar olarak, Bilgisayar Yneticisi hesab ve Yneticiler grubu yeleri bu haklara sahip deildir. SQL Server 2005 User Provisioning Tool for Vista kullanarak bu haklar salayabilirsiniz:

1. Ynetici eriimlerine sahip olarak bilgisayarnza balann. 2. C:\Program Files\Microsoft SQL Server\90\Shared klasrnde yer alan sqlprov.exe programn altrn. 3. User Account Control iletiim kutusunda Continueu tklayn. Bir konsol penceresi belirir ve sonra SQL Server User Provisioning on Vista penceresi grntlenir. 4. User to provision metin kutusuna, altrmalar tamamlamak iin kullandnz hesap adn yazn. (YourComputer\YourAccount yerine bilgisayarnzn ve hesabnzn adn yazn.) 5. Available privileges kutusunda, Member of SQL Server SysAdmin role on SQLEXPRESSi tklayn ve daha sonra >> dmesini tklayn.

6. OKi tklayn. Haklar belirtilen kullanc hesabna salanacak ve SQL Server 2005 User Provisioning Tool for Vista otomatik olarak kapanacaktr.

502

Ksm V

Veriyi Ynetmek

Northwind veritabann yaratn


1. Windows Start mensnde srasyla Tm Programlar (All Programs), Donatlar (Accessories ) ve ardndan Komut stemini (Command Prompt) tklayp bir komut istemi penceresi an. Vista kullanyorsanz, komut istemi penceresinde Belgeler klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 25 klasrne gitmek iin aadaki komutu yazn.
cd \Users\Name\Documents\Microsoft Press\Visual CSharp Step by Step\Chapter 25

Windows XP kullanyorsanz, komut istemi penceresinde My Documents klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 25 klasrne gitmek iin aadaki komutu yazn, Name yerine kullanc adnz yazn.
cd \Documents and Settings\Name\My Documents\Microsoft Press\Visual CSharp Step by Step\Chapter 25

2. Komut istemi penceresinde aadaki komutu yazn:


sqlcmd S YourComputer\SQLExpress E iinstnwnd.sql

YourComputer yerine bilgisayarnzn adn yazn. Bu komut, sizin yerel SQL Server 2005 Expressinize balanmak iin sqlcmd yardmc programn kullanr ve instnwnd.sql komut dosyasn altrr. Bu komut dosyas Northwind Traders veritabann ve veritabanndaki tablolar oluturan SQL komutlarn ierir ve bunlar baz rnek verilerle doldurur. pucu Northwind Traders veritabann oluturmaya almadan nce SQL Server 2005

Expressin altndan emin olun (Varsaylan ayar olarak otomatik balamaya ayarlanmtr. Balamamsa, sqlcmd komutunu altrdnzda bir hata alrsnz). Gerekirse Microsoft SQL Server 2005 CTP program grubunun Configuration Tools klasrndeki SQL Configuration Manager kullanarak SQL Server 2005 Expressin durumunu denetleyebilir ve onu altrmaya balayabilirsiniz.

3. Komut dosyas almay bitirince komut istemi penceresini kapatn. Not Northwind Traders veritabann sfrlamanz gereken herhangi bir zamanda 2.

admdaki komutu altrabilirsiniz. Veritaban mevcutsa, instnwnd.sql komutu veritabann kaldrr ve daha sonra yeniden oluturur. Daha fazla bilgi iin Blm 26ya bakn.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

503

Sipari Bilgisini Sorgulamak in ADO .NET Kullanmak


Sonraki altrma grubunda, Northwind veritabanna erimek ve basit bir konsol uygulamasnda bilgiyi grntlemek iin kod yazacaksnz. Altrmann amac, ADO.NET hakknda daha fazla bilgi elde etmenize ve uygulad nesne modelini anlamanza yardmc olmaktr. Daha sonraki altrmalarda, veritabann sorgulamak iin DLINQ kullanacaksnz. Blm 26da, veritabanndan veriyi alan, gncelleyen ve bir Windows Presentation Foundation (WPF) uygulamasnda grafiksel olarak grntleyen kodu retmek iin Visual Studio 2008 ile sunulan sihirbazlar kullanmay reneceksiniz. lk olarak oluturacanz uygulama, mteri sipari bilgisini grntleyen basit bir rapor salayacak. Program, kullancdan mteri numarasn (ID) girmesini isteyecek ve sonra o mterinin siparilerini grntleyecek.

Veritabanna balann
1. Visual Studio 2008i balatn. 2. Console Application ablonunu kullanarak ReportOrders adnda yeni bir proje oluturun. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\ Chapter 25 klasrne kaydedin ve OKi tklayn. Not Visual C# 2008 Express Edition kullanyorsanz, Tools mensndeki Options iletiim
kutusunun Projects and Solutions ksmndaki Visual Studio projects location ayaryla projenizi kaydetmek iin bir konum belirleyebilirsiniz.

3. Solution Explorerda, Program.cs dosyasnn adn Report.cs olarak deitirin. Microsoft Visual Studio iletisinde, Program snfnn tm bavurularn Reporta bavuru olarak deitirmek iin Yesi tklayn. 4. Code and Text Editor penceresinde, aadaki using ifadesini dosyann en stndeki listeye ekleyin:
using System.Data.SqlClient;

System.Data.SqlClient ad alan, ADO.NET iin SQL Server veri salayc snflar ierir. Bu snflar, ADO.NET snflarnn zelletirilmi bir srmdr, SQL Server ile almaya en uygun hale getirilmitir. 5. Report snfnn Main yntemine, bir SqlConnection nesnesi bildiren aadaki ifadeyi ekleyin:
static void Main(string[] args) { SqlConnection dataConnection = new SqlConnection(); }

504

Ksm V

Veriyi Ynetmek

SqlConnection, Connection adndaki ADO.NET snfnn bir alt snfdr. SQL Server veritabanlarna balantlar ilemek iin tasarlanmtr. 6. Main yntemine, deiken bildiriminden sonra, bir try/catch blou ekleyin. Veritabanna eriim salamak iin yazacanz kodlarn tm bu bloun try ksmnda yer alr. catch blouna SqlException zel durumlarn yakalayan basit bir ileyici ekleyin. Yeni kod aada gsterilmitir:
static void Main(string[] args) { ... try { // You will add your code here in a moment } catch(SqlException e) { Console.WriteLine(Error accessing the database: {0}, e.Message); } }

SQL Server veritabanna eriimde hata olursa, bir SqlException zel durumu oluturulur. 7. try bloundaki aklama satrn aadaki kodla deitirin:
try { dataConnection.ConnectionString = Integrated Security=true;Initial Catalog=Northwind; + Data Source=YourComputer\\SQLExpress; dataConnection.Open(); }

nemli ConnectionString zelliinde, YourComputer terimini bilgisayarnzn ad ile


deitirin. Dizeyi tek bir satrda yazdnzdan emin olun.

Bu kod, Northwind veritabanna bir balant yaratmaya alr. SqlConnection nesnesinin ConnectionString zellii ierii, SQL Server 2005 Express Editionn yerel oluumunuzda Northwind veritabanna balanmak iin Windows Kimlik Dorulama kullanacak olan balanty belirleyen eler ierir. Bu tercih edilen eriim yntemidir, nk kullancdan hibir form iin kullanc ad ve parola istemeniz ve bunlar kodunuzun iine yazmanz gerekmez. Noktal virgln, ConnectionStringdeki elerin tmn ayrdna dikkat edin. Balant dizesindeki birok dier eyi de kodlayabilirsiniz. Ayrntlar iin Visual Studio 2008in sunduu belgelendirmelere bakn.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

505

SQL Server Kimlik Dorulamay Kullanmak


Tm bir Windows alannn yeleri olan kullanclarn kimlik dorulamas iin Windows Kimlik Dorulama kullanldr. Bununla birlikte, bir Windows hesab olmayan bir kullancnn da veritabanna eritii durumlar olabilir; rnein, Internet zerinden uzaktaki kullanclarn erimesi iin tasarlanm bir uygulama oluturuyorsanz. Bu durumlarda, aadaki gibi User ID ve Password parametrelerini kullanabilirsiniz:
string userName = ...; string password = ...; // Kullancnn ad ve parolasn isteyip bu deikenleri doldur string connString = String.Format( User ID={0};Password={1};Initial Catalog=Northwind; + Data Source=YourComputer\\SQLExpress, username, password); myConnection.ConnectionString = connString;

Bu noktada, bir nerimiz var: kullanc adlar ve parolalarn uygulamanzn iine kodlamayn. Kaynak kodun bir kopyasn elde eden birisi bu bilgiyi grebilir ve tm gvenlik nlemleri anlamn yitirir. Bir sonraki adm, kullancnn Customer ID (Mteri No) girmesini istemek ve bu mterinin verdii tm siparileri bulmak iin veritabann sorgulamaktr.

Orders (Sipariler) tablosunu sorgulayn


1. Aadaki ifadeleri dataConnection.Open() ifadesinden sonra try blouna ekleyin:
try { ... Console.Write(Please enter a customer ID (5 characters): ); string customerId = Console.ReadLine(); }

Bu ifadeler, kullancdan mteri numaras girmesini ister ve kullancnn girdii numaray customerId dize deikenine atar. 2. Biraz nce yazdnz koddan sonra aadaki ifadeleri yazn:
try { ... SqlCommand dataCommand = new SqlCommand(); dataCommand.Connection = dataConnection;

506

Ksm V

Veriyi Ynetmek
dataCommand.CommandText = SELECT OrderID, OrderDate, ShippedDate, ShipName, ShipAddress, + ShipCity, ShipCountry + FROM Orders WHERE CustomerID= + customerId + ; Console.WriteLine(About to execute: {0}\n\n, dataCommand.CommandText);

lk ifade bir SqlCommand nesnesi yaratr. SqlConnection gibi, bu nesne de, SQL Server veritabannda sorgular gerekletirmek iin tasarlanm olan Command ADO .NET snfnn zelletirilmi bir srmdr. likisel veritabannda komut metni bir SQL ifadesidir. kinci kod satr, SqlCommand nesnesinin Connection zelliini nceki altrmada atnz veritaban balantsna ayarlar. Sonraki iki ifade, Orders tablosundan, customerId deikenindeki deerle eleen CustomerID deerine sahip tm siparileri bulan bir SQL SELECT ifadesi ile CommandText zelliini yerletirir. Console.WriteLine ifadesi sadece uygulanan komutu ekrana tekrar yazar. nemli Deneyimli bir veritaban gelitiricisi iseniz, SQL sorgular oluturmak iin dize

birleimi kullanmann kt bir uygulama olduunu dnebilirsiniz. Bu yaklam, uygulamanz SQL saldrlarna kar savunmasz yapar. Bununla birlikte, bu kodun amac ADO.NET kullanarak bir SQL Server veritabannda nasl sorgulama yapacanz size hzl biimde gstermektir, bu nedenle kod zellikle basit tutulmutur. retim uygulamalarnzda bunun gibi bir kod yazmayn.

SQL saldrsnn ne olduu, ne kadar tehlikeli olabilecei ve bu tr saldrlardan korunmak iin nasl kod yazmanz gerektiini anlatan, SQL Server Books Onlineda, SQL Saldrs konusunu http://msdn2.microsoft.com/en-us/library/ms161953.aspx adresinde bulabilirsiniz.

3. Yeni girdiiniz koddan sonra aadaki ifadeyi ekleyin:


try { ... SqlDataReader dataReader = dataCommand.ExecuteReader(); }

SqlCommand nesnesinin ExecuteReader yntemi, SQL ifadesi tarafndan tanmlanan satrlar bulmak iin kullanabileceiniz bir SqlDataReader nesnesi kurar. SqlDataReader snf, SQL Serverdan veriyi bulmak iin mmkn olan en hzl (anzn izin verdii kadar hzl) teknii salar. Sonraki grev tm sipariler zerinde yineleme yapmak ve siparileri grntlemektir.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

507

Veriyi bulun ve siparileri grntleyin


1. SqlDataReader nesnesini yaratan ifadeden sonra aadaki while dngsn ekleyin:
try { ... while (dataReader.Read()) { // Geerli satr grntleyen kod } }

SqlDataReader snfnn Read yntemi, veritabanndaki sonraki satr bulur. Baka bir satr baarl olarak okunursa true dndrr; aksi takdirde, genellikle baka bir satr olmadndan false dndrr. while dngs, dataReader deikeninden satrlar okumaya devam eder ve baka satr kalmaynca sona erer. 2. nceki admda yarattnz while dngsnn gvdesine aadaki ifadeleri ekleyin:
while (dataReader.Read()) { int orderId = dataReader.GetInt32(0); DateTime orderDate = dataReader.GetDateTime(1); DateTime shipDate = dataReader.GetDateTime(2); string shipName = dataReader.GetString(3); string shipAddress = dataReader.GetString(4); string shipCity = dataReader.GetString(5); string shipCountry = dataReader.GetString(6); Console.WriteLine( Order: {0}\nPlaced: {1}\nShipped: {2}\n + To Address: {3}\n{4}\n{5}\n{6}\n\n, orderId, orderDate, shipDate, shipName, shipAddress, shipCity, shipCountry); }

Bu kod blou, bir SqlDataReader nesnesini kullanarak veritabanndan veriyi nasl okuyacanz gsterir. SqlDataReader nesnesi, veritababndan son alnan satr ierir. Satrdaki her stundaki bilgiyi almak iin GetXXX yntemlerini kullanabilirsiniz. (Yaygn veri trlerinin her biri iin bir GetXXX yntemi vardr.) rnein, bir int deerini okumak iin GetInt32 yntemini; bir dizeyi okumak iin GetString yntemini kullanrsnz. Bir DateTime deerini nasl okuyacanz tahmin edebilirsiniz. GetXXX yntemleri, hangi stunun okunduunu gsteren bir parametre alr: 0 ilk stun, 1 ikinci stun ve bunun gibi. nceki kod geerli Orders satrndan eitli stunlar okur, deerleri bir deikenler kmesinde saklar ve daha sonra bu deikenlerin deerlerinin ktsn alr.

508

Ksm V

Veriyi Ynetmek

Salt leri mleler


ok kullancl veritaban uygulamalarnn ana sorunlarndan birisi kilitlenmi veridir. Ne yazk ki, uygulamalarn veritabanndan satrlar almalar ve uygulama o satrlar kullanrken baka kullanclarn deitirmesini nlemek iin kilitli tutmalar sk rastlanlan bir durumdur. Baz koullarda, uygulama kilitledii veriyi dier kullanclarn okumasn bile engeller. Uygulama ok sayda satr almsa bir tablonun ok byk bir ksmn kilitler. Ayn anda uygulamay kullanan ok sayda kullanc varsa, birbirlerinin kilitlenmi satrlar brakmasn beklemeye balayabilirler ve bu da sonuta yava alan ve skc bir dzensizlie yol aar. SqlDataReader snf bu sorunu zmek iin tasarlanmtr. Her seferinde bir satr getirir ve bir satr brakldktan sonra o satr kilitli kalmaz. Bu, uygulamalarnzdaki birlikte alma verimini ok byk lde artrr. SqlDataReader snf salt ileri imle (firehose cursor) olarak anlr. (mle olarak evirdiimiz cursor szc current set of rowsun (geerli satrlar kmesi) ksaltmasdr.) Bir veritaban ile iiniz bittiinde, kullanmakta olduunuz kaynaklar brakmak iyi bir alkanlktr.

Veritabanyla balanty kesin ve uygulamay test edin


1. Aadaki ifadeyi, try bloundaki while dngsnden sonrasna ekleyin:
try { ... while(dataReader.Read()) { ... } dataReader.Close(); }

Bu ifade SqlDataReader nesnesini kapatr. iniz bittiinde bir SqlDataReader kapatmalsnz nk bunu yapana kadar baka komutlar altrmak iin bu SqlConnection nesnesini kullanamazsnz. Bir sonraki admnz SqlConnection kapatmak olsa bile bunu yapmanz iyi olur. Not SQL Server 2005 ile birden fazla etkin sonu kmesini (multiple active result sets,

MARS) etkinletirirseniz, ayn SqlConnection nesnesi iin birden fazla SqlDataReader nesnesi aabilir ve birden fazla veri kmesini ileyebilirsiniz. MARS varsaylan ayar olarak etkin deildir. MARS hakknda daha fazlasn ve nasl etkinletirerek kullanabileceinizi renmek isterseniz, SQL Server 2005 Books Onlinea bavurun.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

509

2. catch bloundan sonra aadaki finally blounu ekleyin:


catch(SqlException e) { ... } finally { dataConnection.Close(); }

Veritaban balantlar kt kaynaklardr. Bunlarla iiniz bitince bunlar kapattnzdan emin olmalsnz. Bu ifadeyi bir finally blounun iine koymak, zel bir durum olusa bile SqlConnectionn kapatlacan garantiler; catch ileyicisi bitince finally bloundaki kodun altrlacan unutmayn. pucu Bir finally blou kullanmaya alternatif bir yaklam, aadaki kodda gsterildii gibi, SqlDataConnection nesnesini yaratan kodu bir using ifadesinde sarmalamaktr. using ifadesi tarafndan tanmlanan bloun sonunda, SqlConnection nesnesi bir zel durum olusa bile otomatik olarak kapatlr:
using (SqlConnection dataConnection = new SqlConnection()) { try { dataConnection.ConnectionString = ...; ... } catch (SqlException e) { Console.WriteLine(Error accessing the database: {0}, e.Message); } }

3. Uygulamay oluturup altrmak iin Debug mensnde Starting Without Debuggingi tklayn. 4. Sorulduunda customer ID olarak VINET yazp Entera basn. Aada gsterildii gibi, SQL SELECT ifadesi ve ardndan bu mterinin siparileri grnr.

510

Ksm V

Veriyi Ynetmek

Tm veriyi grmek iin konsol penceresinde geriye doru kaydrma yapabilirsiniz. iniz bitince konsol penceresini kapatmak iin Enter tuuna basn. 5. Uygulamay yeniden altrn ve bu kez customer ID olarak BONAP yazn. Baz satrlar belirdikten sonra bir hata oluur. Windows Vista kullanyorsanz, ReportOrders has stopped working. (Rapor Siparileri almay durdurdu) iletisini gsteren bir ileti kutusu belirir. Close program tklayn (ya da Visual C# Express kullanyorsanz Close the program tklayn). Windows XP kullanyorsanz, ReportOrders has encountered a problem and needs to close. We are sorry for the inconvenience. (Bir sorunla karlald ve kapatlmas gerekiyor. Rahatszlktan dolay zgnz) yazan bir ileti kutusu belirir. Dont Sendi tklayn. Konsol penceresinde, Data is Null. This method or property cannot be called on Null values (Veri Null. Bu yntem ya da zellik Null deerler zerinde arlamaz) yazan bir hata iletisi belirir. Sorun, ilikisel veritabanlarnn baz stunlarnda null deerler ierebilmesidir. Bir null deer, C#daki null deikene biraz benzer. Bir deere sahip deildir fakat okumaya alrsanz, hata alrsnz. Orders tablosunda, ShippedDate stunu sipari henz nakledilmediyse null deer alabilir. Bunun ayrca bir SqlNullValueException zel durumu olduunu ve dolaysyla SqlException ileyici tarafndan yakalanmadn belirtmelisiniz. 6. Pencereyi kapatarak Visual Studio 2008e dnmek iin Enter tuuna basn.

Balantlar Kapatmak
Eski uygulamalarda, uygulama baladnda bir balantnn aldn ve uygulama sonlanana kadar bu balantnn ak kaldn grm olabilirsiniz. Bu stratejinin arkasndaki mantk veritabanlarna balant amann ve kapatmann kaynak tketen ve zaman alan bir ilem olmasyd. Bu stratejinin, uygulamalarn leklenebilirlii zerinde ok byk etkisi olurdu nk uygulamay altran her kullanc uygulama alt srece, birka saatliine le yemeine gitmi olsa bile veritabanna bal kalrd. Birok veritabannn ayn anda ak tutabilecei balant says snrldr. (Bunun nedeni bazen lisanstr ama daha ounlukla her balantnn veritaban sunucusundan belirli miktarda kaynak tketiyor olmas ve bu kaynaklarn snrsz olmamasdr.) Sonu olarak veritaban, ayn anda ilem yapan kullanc saysnda st snra gelebilir. Birok modern .NET Framework salaycs (SQL Server salaycs da dahil), connection pooling (balant havuzu) oluturma yntemi kullanr. Veritaban balantlar yaratlr ve bir havuzda tutulur. Bir uygulama balantya gereksinim duyduunda veri eriim salaycs havuzdan sradaki uygun balanty kullanr. Uygulama balanty kapattnda, balant havuza geri dner ve balant isteyen bir sonraki uygulamay bekler. Bunun anlam balant amann ve kapatmann artk kaynak tketen bir i olmaddr. Balanty kapatmak veritabanndan balanty kesmez; yalnzca balanty havuza geri verir. Bir balant amaksa, yalnzca ak olan bir balanty havuzdan almaktr. Bu yzden, bir balanty gereinden ok ak tutmamalsnz.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

511

SqlCommand snfnn bir SqlDataReader yaratan ExecuteReader ynteminin ar yklenmi olduuna dikkat etmelisiniz. SqlDataReader kapandnda SqlDataReader tarafndan kullanlan balanty otomatik olarak kapatan bir System.Data. CommandBehaviour parametresi belirtebilirsiniz. rnein:
SqlDataReader dataReader = dataCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

SqlDataReader nesnesindeki verileri okurken, okuduunuz verinin null olmadn denetlemeniz gerekir. Sonraki altrmada bunu nasl yapacanz greceksiniz.

Null veritaban deerlerini ileyin:


1. Main ynteminde, while dngsn aadaki gibi if else blou ierecek ekilde deitirin:
while (dataReader.Read()) { int orderId = dataReader.GetInt32(0); if (dataReader.IsDBNull(2)) { Console.WriteLine(Order {0} not yet shipped\n\n, orderId); } else { DateTime orderDate = dataReader.GetDateTime(1); DateTime shipDate = dataReader.GetDateTime(2); string shipName = dataReader.GetString(3); string shipAddress = dataReader.GetString(4); string shipCity = dataReader.GetString(5); string shipCountry = dataReader.GetString(6); Console.WriteLine( Order {0}\nPlaced {1}\nShipped{2}\n + To Address {3}\n{4}\n{5}\n{6}\n\n, orderId, orderDate, shipDate, shipName, shipAddress, shipCity, shipCountry);

}
}

if ifadesi ShippedDate stununun (tablodaki ikinci stun) null olup olmadn belirlemek iin IsDBNull yntemini kullanr. Null ise onu getirmek iin (ya da ShippedDate deeri yoksa zaten bo olmas gereken dier btn stunlar getirmek iin) giriimde bulunulmaz; aksi durumda nceki gibi stunlar okunur ve yazdrlr. 2. Uygulamay yeniden oluturun ve altrn. 3. stenildiinde customer ID olarak BONAP girin. Bu defa, herhangi bir hata almazsnz, fakat henz nakledilmemi siparilerin bir listesini elde edersiniz. 4. Uygulama sona erdiinde Visual Studio 2008e dnmek iin Enter tuuna basn.

512

Ksm V

Veriyi Ynetmek

DLINQ Kullanarak Veritabann Sorgulamak


Blm 20de, bellekte tutulan numaralandrlabilir koleksiyonlarn ieriklerini incelemek iin LINQ kullanmn grmtnz. LINQ, sorgular gerekletirmek ve daha sonra zerinde alabileceiniz bir sonu kmesi retmek iin SQL benzeri szdizimi kullanan sorgu deyimleri salar. Bir veritaban ieriini sorgulamak ve ilemek iin, DLINQ ad verilen, geniletilmi LINQ biimi kullanabilirsiniz. DLINQ, ADO.NET zerinde oluturulmutur. DLINQ, bir ADO.NET Command nesnesini ina etmenin ayrntlarn dnmeniz gerekmeyen, bir DataReader nesnesi tarafndan dndrlen bir sonu kmesi zerinde tekrarlanan ya da deiik GetXXX yntemleri kullanarak stun stun veriyi bulan, yksek seviye soyutlama salar.

Bir Varlk Snf Tanmlamak


Blm 20de, LINQ kullanmnn, sorguladnz nesnelerin numaralandrlabilir olmasn gerektirdiini; IEnumerable arabirimini uygulayan koleksiyonlar olmak zorunda olduklarn grdnz. DLINQ, tanmladnz snfa dayanarak, nesnelerin kendi numaralandrlabilir koleksiyonlarn yaratabilir ve dorudan veritabanndaki tablolara gnderebilir. Bu snflar entity classes (varlk snflar) olarak adlandrlr. Bir veritabanna balanarak bir sorgu gerekletirdiinizde, DLINQ, sorgunuz tarafndan tanmlanan veriyi bulabilir ve bulunan her satr iin bir varlk snf rnei yaratr. DLINQyu aklamann en iyi yolu, bir rnekle grmek olacaktr. Northwind veritabanndaki Products tablosu, Northwind Tradersn satt deiik rnlerin farkl grnmleri hakknda bilgi ieren stunlar ierir. Bu blmdeki ilk altrmada altrdnz instnwnd.sql program paras, aadakine benzer bir CREATE TABLE ifadesi ierir (baz stunlar, kstlamalar ve dier ayrntlar ihmal edilmitir):
CREATE TABLE Products ( ProductID int NOT NULL , ProductName nvarchar (40) NOT NULL , SupplierID int NULL , UnitPrice money NULL, CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (ProductID), CONSTRAINT FK_Products_Suppliers FOREIGN KEY (SupplierID) REFERENCES dbo.Suppliers (SupplierID) )

Aadaki gibi, Products tablosuna uygun bir varlk snf tanmlayabilirsiniz:


[Table(Name = Products)] public class Product { [Column(IsPrimaryKey = true, CanBeNull = false)] public int ProductID { get; set; } [Column(CanBeNull = false)] public string ProductName { get; set; }

Blm 25
[Column] public int? SupplierID { get; set; } [Column(DbType = money)] public decimal? UnitPrice { get; set; } }

Bir Veritabannda Bilgi Sorgulamak

513

Product snf, Products tablosunda ilgilendiiniz stunlarn her biri iin bir zellik ierir. Temeldeki tablodan her stunu belirtmeniz gerekmez, fakat bu varlk snfna dayal sorguyu altrdnzda ihmal ettiiniz stunlardaki deerler bulunmayacaktr. Dikkat edilmesi gereken nemli noktalar, Table ve Column znitelikleridir. Table znitelii, bu snf varlk snf olarak tanmlar. Name parametresi, veritabanndaki uygun tablonun adn belirler. Name parametresini ihmal ederseniz, DLINQ, varlk snf adnn veritabanndaki uygun tablonun ad ile ayn olduunu varsayar. Column znitelii, Products tablosundaki bir stunun Product snfndaki bir zellikle nasl eletiini tanmlar. Column znitelii ok sayda parametre alabilir. Bu rnekte gsterilen ve aadaki listede tanmlananlar en yaygn olanlardr:
n

IsPrimaryKey parametresi, zelliin birincil anahtar paras olduunu belirtir. (Tablo birden fazla stunu kapsayan bileik bir birincil anahtara sahipse, varlk snfndaki her zellik iin IsPrimaryKey parametresini belirtmelisiniz.) DbType parametresi, veritabanndaki stunun trn belirtir. Birok durumda, DLINQ veritabanndaki bir stundaki veri trn saptar ve varlk snfndaki uygun zellik trne dntrr, fakat baz durumlarda veri tr elemesini kendinizin belirlemesi gerekir. rnein, Products tablosundaki UnitPrice stunu SQL Server para trn kullanr. Varlk snf uygun zellii decimal deer olarak belirtir. Not SQL Serverdaki para (money) verisinin varsaylan elemesi, varlk snfndaki decimal
trdr, bu nedenle burada gsterilen DbType parametresi gerekten gereksizdir. Yine de, szdizimini size gstermek istedik.

CanBeNull parametresi, veritabanndaki stunun null deer ierip ieremeyeceini gsterir. CanBeNull parametresi iin varsaylan deer truedur. Product snfndaki, veritabannda null deerlere izin veren stunlara (SupplierID ve UnitPrice) uygun olan iki zelliin, varlk snfnda null olabilen trler olarak tanmlandna dikkat edin.

514

Ksm V

Veriyi Ynetmek

Not DataContext nesnesinin CreateDatabase yntemini kullanarak varlk snfnzn tanmlamalarna dayal yeni veritabanlar ve tablolar yaratmak iin de DLINQ kullanabilirsiniz. DLINQnun geerli srmnde, tablolar yaratan ktphane ksm, bir stunun null deerlere izin verip vermemesi gerektiini belirlemek iin DbType parametresinin tanmn kullanr. Yeni bir veritaban yaratmak iin DLINQ kullanyorsanz, her tablodaki her stunun null deer alp alamayacan, aadaki gibi, DbType parametresinde belirtmelisiniz:
[Column(DbType = NVarChar(40) NOT NULL, CanBeNull = false)] public string ProductName { get; set; } ... [Column(DbType = Int NULL, CanBeNull = true)] public int? SupplierID { get; set; }

Table zniteliindeki gibi, Column znitelii de, veritabannda temeldeki stunun adn belirtmek iin kullanabileceiniz bir Name parametresi salar. Bu parametreyi ihmal ederseniz, DLINQ, stun adnn varlk snfndaki zellik ad ile ayn olduunu varsayar.

Bir DLINQ Sorgusu Yaratmak ve altrmak


Products tablosundan veriyi bulmak ve grntlemek iin, sahip olduunuz tanmlanm varlk snfn kullanabilirsiniz. Aadaki kod, bunu yapmann basit admlarn gsterir:
DataContext db = new DataContext(Integrated Security=true; + Initial Catalog=Northwind;Data Source=YourComputer\\SQLExpress); Table<Product> products = db.GetTable<Product>(); var productsQuery = from p in products select p; foreach (var product in productsQuery) { Console.WriteLine(ID: {0}, Name: {1}, Supplier: {2}, Price: {3:C}, product.ProductID, product.ProductName, product.SupplierID, product.UnitPrice); }

Not Bu balamda, from, in ve select anahtar szcklerinin C# tanmlayclar olduunu hatrlayn. Bu szckleri kk harfle yazmak zorundasnz. DataContext snf, varlk snflarnz ile veritabanndaki tablolar arasndaki ilikiyi ynetmekle sorumludur. Veritabanna bir balant kurmak ve varlk snflarnn koleksiyonlarn yaratmak iin bu snf kullanrsnz. DataContext kurucusu, parametre olarak kullanmak istediiniz veritabann belirten bir balant dizesi bekler. Bu balant dizesi, bir ADO.NET Connection

Blm 25

Bir Veritabannda Bilgi Sorgulamak

515

nesnesi zerinden balandnzda kullanacanz balant dizesi ile tam olarak ayndr. (DataContext snf gerekte bir ADO.NET balants yaratr.) DataContext snfnn GetTable<TEntity> yntemi, TEntity tr parametresi olarak bir varlk snf bekler. Bu yntem, TEntity trne dayal bir numaralandrlabilir koleksiyon kurar ve koleksiyonu Table<TEntity> tr olarak dndrr. Bu koleksiyon zerinde DLINQ sorgular gerekletirebilirsiniz. Bu rnekte gsterilen sorgu, Products tablosundaki her nesneyi bulur. Not LINQ sorgu deyimlerini hatrlamak isterseniz, Blm 20ye geri dnn. foreach ifadesi, bu sorgunun sonular zerinden tekrarlar ve her rnn ayrntlarn grntler. Aadaki resim, alan bu kodun sonularn gsterir. (Buradaki cretler tek tek paralar bana deil kasa bana creti gsterir.)

DataContext nesnesi, veritaban balantsn otomatik olarak kontrol eder; foreach ifadesindeki ilk veri satrn getirmeden hemen nce balanty aar ve son satr alndktan sonra balanty kapatr. nceki rnekte gsterilen DLINQ sorgusu, Products tablosundaki her satr iin tm stunlar eker. Bu durumda, aadaki gibi, products koleksiyonu zerinden dorudan yineleme yapabilirsiniz:
Table<Product> products = db.GetTable<Product>(); foreach (Product product in products) { ... }

foreach ifadesi altnda, DataContext nesnesi, Products tablosundan tm veriyi eken bir SQL SELECT ifadesi kurar. Products tablosunda tek bir satr ekmek isterseniz, Products varlk snfnn Single yntemini arabilirsiniz. Single yntemi, bulmak istediiniz satr tanmlayan

516

Ksm V

Veriyi Ynetmek

bir yntem alan ve bu satr varlk snfnn bir rnei olarak (Table koleksiyondaki satrlarn koleksiyonuna kar olarak) dndren geniletilmi bir yntemdir. Yntem parametresini bir lambda deyimi olarak belirleyebilirsiniz. Lambda deyimi tam olarak bir satr tanmlamyorsa, Single yntemi InvalidOperationException zel durumunu oluturur. Aadaki kod rnei, Northwind veritabannda ProductID deeri 27 olan rn sorgular. Dnen deer, Product snfnn bir rneidir ve Console.WriteLine ifadesi rnn adn ekrana yazar. Daha nceki gibi, DataContext nesnesi tarafndan veritaban balants otomatik olarak alr ve kapatlr.
Product singleProduct = products.Single(p => p.ProductID == 27); Console.WriteLine(Name: {0}, singleProduct.ProductName);

Ertelenmi ve Annda Veri Almak


Vurgulanmas gereken nemli bir nokta, varsaylan ayar olarak DLINQnun sadece siz istediinizde ve bir DLINQ sorgusu tanmladnzda ya da bir Table koleksiyonu yarattnzda veritabanndan veriyi ekmesidir. Bu, ertelenmi veri alma olarak bilinir. Products tablosundaki rnlerin tmn grntleyen daha nceki rnekte, productsQuery koleksiyonu sadece foreach dngs altnda yerletirilir. Bu ilem modu, LINQnun bellekteki nesneleri sorguladndaki ilemle eleir; productsQuery numaralandrlabilir koleksiyonu yaratan ifadeyi altrdktan sonra veri deimi olsa bile, her zaman verinin en gncel halini grrsnz. foreach dngs baladnda, DLINQ, bir ADO.NET DataReader nesnesi yaratmak iin DLINQ sorgusundan tretilmi bir SQL SELECT ifadesi oluturur ve altrr. foreach dngsnn her tekrar, o satrdan veriyi ekmek iin gerekli GetXXX yntemini altrr. foreach dngs tarafndan alnan ve ilenen son satrdan sonra, DLINQ veritaban balantsn kapatr. Ertelenmi veri alma ilemi, sadece uygulamann gerekten kulland verinin veritabanndan alndn garantiler. Bununla birlikte, uzaktaki bir SQL Server zerindeki bir veritabanna eriiyorsanz, veriyi satr satr almak a bant genilii asndan kt bir uygulamadr. Bu durumda, DLINQ sorgusunu hemen almaya zorlayarak, tek bir a istei ile tm veriyi alarak n bellekte saklayabilirsiniz. Bunu, aadaki gibi DLINQ sorgusu tanmladnzda veriyi bir liste ya da diziye alan ToList ya da ToArray geniletilmi yntemlerini ararak yapabilirsiniz:
var productsQuery = from p in products.ToList() select p;

Bu kod rneinde, productsQuery, imdi Products tablosundaki bilgilerin yerletirildii bir numaralandrlabilir listedir. Veri zerinde tekrarlama yaptnzda, DLINQ veritabanna veri alma istei gndermek yerine veriyi bu listeden alr.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

517

Tablolar Birletirmek ve liki Oluturmak


DLINQ, birden fazla tabloda tutulan ilikili veriyi almak ve birletirmek iin join sorgusunu destekler. rnein, Northwind veritabanndaki Products tablosu her rn iin retici numaras (ID) tutar. Her reticinin adn renmek istiyorsanz, Suppliers tablosunu sorgulamanz gerekir. Suppliers tablosu, retici firmann adn belirten CompanyName stununu ve retici firmadaki Northwind Traders irketinin siparileri ile ilgilenen kiinin adn belirten ContactName stunu ierir. Aadaki gibi, ilgili retici firmann bilgisini ieren bir varlk snf tanmlayabilirsiniz (veritabanndaki SupplierName stunu zorunludur, fakat ContactName stunu null deerler alabilir):
[Table(Name = Suppliers)] public class Supplier { [Column(IsPrimaryKey = true, CanBeNull = false)] public int SupplierID { get; set; } [Column(CanBeNull = false)] public string CompanyName { get; set; } [Column] public string ContactName { get; set; } }

Daha sonra Table<Product> ve Table<Supplier> koleksiyonlarnn rneklerini alabilir ve bu tablolar birletirmek iin bir DLINQ sorgusu tanmlayabilirsiniz:
DataContext db = new DataContext(...); Table<Product> products = db.GetTable<Product>(); Table<Supplier> suppliers = db.GetTable<Supplier>(); var productsAndSuppliers = from p in products join s in suppliers on p.SupplierID equals s.SupplierID select new { p.ProductName, s.CompanyName, s.ContactName };

productsAndSuppliers koleksiyonu zerinden tekrarlama yaptnzda, DLINQ, veritabanndaki Products ve Suppliers tablolarn SupplierID stunu zerinde birletiren ve veriyi alan bir SQL SELECT ifadesi altracaktr. Bununla birlikte, DLINQ ile, tablolar arasndaki ilikiyi varlk snflarnn tanmnn bir paras olarak belirleyebilirsiniz. Daha sonra, karmak ve hataya eilimli join ifadesi kodlamanz gerekmeden DLINQ otomatik olarak her rn iin retici bilgisini alabilir. rnler ve reticiler rneine dnersek, bu tablolar Northwind veritabannda okbir ilikisine sahiptir; her rn tek bir retici tarafndan salanr fakat tek bir retici birden fazla rn salayabilir. Bu ilikiyi biraz farkl ifade edersek, Products tablosundaki bir satr Suppliers tablosundaki tek bir satra, her iki tablodaki SupplierID stunlar zerinden bavurabilir fakat Suppliers tablosundaki bir

518

Ksm V

Veriyi Ynetmek

satr Products tablosundaki tm satrlara bavurabilir. DLINQ, bu tr bir ilikiyi modellemek iin EntityRef<TEntity> ve EntitySet<TEntity> trlerini salar. lk olarak Product varlk snfn ele alarak, aada gsterildii gibi, EntityRef<Supplier> trn kullanarak Supplier varlk snf ile ilikinin bir tarafn tanmlayabilirsiniz:
[Table(Name = Products)] public class Product { [Column(IsPrimaryKey = true, CanBeNull = false)] public int ProductID { get; set; } ... [Column] public int? SupplierID { get; set; } ... private EntityRef<Supplier> supplier; [Association(Storage = supplier, ThisKey = SupplierID, OtherKey = SupplierID)] public Supplier Supplier { get { return this.supplier.Entity; } set { this.supplier.Entity = value; } } }

zel supplier alan, Supplier varlk snfnn rneine bir bavurudur. Genel Supplier zellii bu bavuruya eriim salar. Association znitelii, LINQnun bu zellik iin veriyi nasl bulduunu ve yerletirdiini belirler. Storage parametresi, Supplier nesnesine bavuruyu saklamak iin kullanlan private alann tanmlar. ThisKey parametresi, DLINQnun bu rn iin bavuraca Supplier bilgisini bulmak iin Product varlk snfnda hangi zellii kullanmas gerektiini gsterir. OtherKey parametresi de, DLINQnun bu ThisKey parametresi deeri ile Supplier tablosundaki hangi zellii eletirmesi gerektiini gsterir. Bu rnekte, Product ve Supplier tablolar her iki varlktaki SupplierID zellii etrafnda birletirilir. Not Storage parametresi aslnda istee baldr. Bu parametreyi belirtirseniz, DLINQ, set eriimcisi zerinden gitmek yerine uygun veri yesine dorudan eriir. set eriimcisi, EntityRef<TEntity> zellii tarafndan bavurulan varlk nesnesini elle dolduran ya da deitiren uygulamalar iin gereklidir. Storage parametresi gerekte bu rnekte gereksiz olsa da, kapsanmas nerilir. Supplier zelliindeki get eriimcisi, EntityRef<Supplier> trnn Entity zelliini kullanarak Supplier varlna bir bavuru dndrr. set eriimcisi, bir Supplier varlna bavuru ile bu zellii yerletirir.

Blm 25

Bir Veritabannda Bilgi Sorgulamak

519

EntitySet<Product> tr ile, Supplier snfndaki ilikinin ok ynn tanmlayabilirsiniz:


[Table(Name = Suppliers)] public class Supplier { [Column(IsPrimaryKey = true, CanBeNull = false)] public int SupplierID { get; set; } ... private EntitySet<Product> products = null; [Association(Storage = products, OtherKey = SupplierID, ThisKey = SupplierID)] public EntitySet<Product> Products { get { return this.products; } set { this.products.Assign(value); } } }

pucu Varlk snf ve zelliklerinin ad iin tekil ad kullanmak geleneksel yntemdir. Bu kurala

istisna, EntitySet<TEntity> zelliklerinin, tek bir varlk deil, bir koleksiyon gsterdiklerinden oul ad almasdr.

Bu defa, Association zniteliinin Storage parametresinin zel EntitySet<Product> alann belirttiine dikkat edin. EntitySet<TEntity> nesnesi varlklara bavurularn bir koleksiyonunu tutar. Genel Products zelliinin get eriimcisi bu koleksiyonu dndrr. set eriimcisi, bu koleksiyonu yerletirmek iin EntitySet<Product> snfnn Assign yntemini kullanr. Bylece, EntityRef<TEntity> ve EntitySet<TEntity> trlerini kullanarak birok ilikisi modelleyebilen zellikler tanmlayabilirsiniz, fakat bu zellikleri veri ile nasl doldurursunuz? DLINQ veriyi aldnda sizin iin bu zellikleri doldurur. Aadaki kod, Table<Product> snfnn bir rneini ve tm rnlerin ayrntlarn almak iin bir DLINQ sorgusu oluturur. Bu kod, daha nce grdnz ilk DLINQ rneine benzer. Veriyi grntleyen foreach dngs farkldr.
DataContext db = new DataContext(...); Table<Product> products = db.GetTable<Product>(); var productsAndSuppliers = from p in products select p; foreach (var product in productsAndSuppliers) { Console.WriteLine(Product {0} supplied by {1}, product.ProductName, product.Supplier.CompanyName); }

520

Ksm V

Veriyi Ynetmek

Console.WriteLine ifadesi, daha nceki gibi, rn varlnn ProductName zelliindeki deeri okur, ayrca Supplier varlna eriir ve bu varln CompanyName zelliini grntler. Bu kodu altrrsanz, sonu yle olacaktr:

Kod, her Product varln aldka, DLINQ bir saniye gecikme ile o rnn reticisinin bilgisini alan sorguyu altrr. Bylece, Product varlk snfndaki bu zelliin Association znitelii tarafndan belirtilen ilikiye bal olarak Supplier zelliini yerletirebilir. Birok ilikisine sahip olarak Product ve Supplier varlklarn tanmladnzda, aadaki gibi, Table<Supplier> koleksiyonu zerinde bir DLINQ sorgusu altrrsanz benzer mantk uygulanr:
DataContext db = new DataContext(...); Table<Supplier> suppliers = db.GetTable<Supplier>(); var suppliersAndProducts = from s in suppliers select s; foreach (var supplier in suppliersAndProducts) { Console.WriteLine(Supplier name: {0}, supplier.CompanyName); Console.WriteLine(Products supplied); foreach (var product in supplier.Products) { Console.WriteLine(\t{0}, product.ProductName); } Console.WriteLine(); }

Bu durumda, foreach dngs bir retici bulduunda, o reticinin tm rnlerini elde etmek iin ikinci bir sorgu altrr (yine ertelemeli olarak) ve Products zelliini yerletirir. Bununla birlikte, bu defa, zellik bir koleksiyondur (EntitySet<Product>), bu nedenle, koleksiyon

Blm 25

Bir Veritabannda Bilgi Sorgulamak

521

zerinde tekrarlama yapmak iin, her rnn adn grntleyen yuvalanm bir foreach ifadesi kodlayabilirsiniz. Kodun kts u ekilde grnr:

Ertelenmi ve Annda Veri Almak (Tekrar)


Bu blmde daha nce, DLINQnun veri tam olarak istenilene kadar veriyi alma ilemini ertelediini fakat veriyi hemen almak iin ToList ya da ToArray geniletilmi yntemi uygulayabildiinizden bahsedilmiti. Bu teknik, EntitySet<TEntity> ya da EntityRef<TEntity> zellikleri olarak bavurulan veriye uygulanmaz; ToList ya da ToArray kullansanz bile, veri sadece gerekli olduunda alnacaktr. DLINQnun bavurulan veriyi hemen sorgulamasn ve almasn istiyorsanz, aadaki gibi DataContext nesnesinin LoadOptions zelliini ayarlayabilirsiniz:
DataContext db = new DataContext(...); Table<Supplier> suppliers = db.GetTable<Supplier>(); DataLoadOptions loadOptions = new DataLoadOptions(); loadOptions.LoadWith<Supplier>(s => s.Products); db.LoadOptions = loadOptions; var suppliersAndProducts = from s in suppliers select s;

DataLoadOptions snf, LoadWith yntemi salar. Bu yntemi kullanarak, bir rnek yerletirildiinde rnekteki EntitySet<TEntity> zelliin yklenip yklenmeyeceini belirleyebilirsiniz. LoadWith ynteminin parametresi, lambda deyimi olarak uygulayabileceiniz baka bir yntemdir. Burada gsterilen rnek, her Supplier varlnn Products zelliinin, her Product varl iin verinin ertelenmeden hemen alnmasna neden olmasdr. DataContext nesnesinin LoadOptions zelliini Table koleksiyonunun ToList ya da ToArray geniletilmi yntemi ile birlikte belirtirseniz, DLINQ sorgusu alr almaz DLINQ, o koleksiyondaki varlklarn bavurulan zelliklerinin verisi ile birlikte tm koleksiyonu bellee ykleyecektir.

522

Ksm V

Veriyi Ynetmek

pucu Birka tane EntitySet<TEntity> zelliine sahipseniz, her seferinde yklenecek

EntitySet<TEntity> zelliini belirterek, ayn LoadOptions nesnesinin LoadWith yntemini birka defa arabilirsiniz.

zel DataContext Snf Tanmlamak


DataContext snf, veritabanlarn ve veritaban balantlarn ynetmek, varlk snflarn yaratmak ve veritabanndaki veriyi almak ve gncellemek iin komutlar uygulama ilevsellii salar. .NET Framework ile salanan ham DataContext snfn kullanabilseniz de, kaltm kullanmak ve genel yeler olarak eitli Table<TEntity> koleksiyonlar bildiren kendi zel srmnz tanmlamak iyi bir uygulamadr. rnein, zel yeler olarak Products ve Suppliers Table koleksiyonlarn ortaya karan zelletirilmi DataContext snf aadadr:
public class Northwind : DataContext { public Table<Product> Products; public Table<Supplier> Suppliers; public Northwind(string connectionInfo) : base(connectionInfo) { } }

Northwind snfnn ayrca, parametre olarak bir balant dizesi alan bir kurucu saladna dikkat edin. Northwind snfnn yeni bir rneini yaratabilir ve daha sonra aadaki gibi, Table koleksiyon snflar zerinde DLINQ sorgular tanmlayabilir ve altrabilirsiniz:
Northwind nwindDB = new Northwind(...); var suppliersQuery = from s in nwindDB.Suppliers select s; foreach (var supplier in suppliersQuery) { ... }

Bu uygulama, kodunuzun bakmn kolaylatrr (zellikle de veriyi birden fazla veritabanndan alyorsanz). Sradan bir DataContext nesnesini kullanarak, DataContext nesnesinin balanaca veritaban ne olursa olsun, GetTable yntemini kullanarak herhangi bir varlk snfn rnekleyebilirsiniz. Veriyi almaya altnzda, yanl DataContext nesnesi kullandnz ve yanl veritabanna balandnz sadece alma zamannda anlarsnz. zel DataContext snf ile, DataContext nesnesi zerinden Table koleksiyonlarna bavurursunuz. (base DataContext kurucusu, yelerini incelemek iin reflection ad verilen bir teknik

Blm 25

Bir Veritabannda Bilgi Sorgulamak

523

kullanr ve Table koleksiyonlarnn yelerini otomatik olarak rneklendirir (yanstmann nasl altnn ayrntlar bu kitabn kapsam dndadr). zel bir tablodan veri almak iin hangi veritabanna balanmanz gerektii aktr; DLINQ sorgusu tanmladnzda IntelliSense tablonuzu grntlemezse, yanl DataContext snfn siz bulursunuz ve kodunuz derlenmez.

Sipari Bilgisini Sorgulamak in DLINQ Kullanmak


Aadaki altrmada, kullancdan mteri numaras (customer ID) bilgisini isteyen ve o mteri tarafndan verilen siparileri grntleyen nceki altrmada gelitirdiiniz konsol uygulamasnn bir srmn yazacaksnz. Veriyi almak iin DLINQ kullanacaksnz. Daha sonra, DLINQ ile ADO.NET kullanlarak yazlm edeer kodu karlatrabileceksiniz.

Order varlk snfn tanmlayn


1. Visual Studio 2008de, Console Application kullanarak DLINQOrders adnda yeni bir proje yaratn. Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 25 klasrne kaydedin ve daha sonra OKi tklayn. 2. Solution Explorerda, Program.cs dosyasnn adn DLINQReport.cs olarak deitirin. Microsoft Visual Studio iletisinde, Program snfnn tm bavurularn DLINQReporta olacak ekilde deitirmek iin Yesi tklayn. 3. Project mensnde Add Reference tklayn. Add Reference iletiim kutusunda, .NET sekmesini tklayn, System.Data.Linq derlemesini sein ve daha sonra OKi tklayn. Bu derleme DLINQ trlerini ve zniteliklerini tutar. 4. Code and Text Editor penceresinde, aadaki using ifadelerini dosyann en stne ekleyin:
using System.Data.Linq; using System.Data.Linq.Mapping; using System.Data.SqlClient;

5. DLINQReport.cs dosyasna, DLINQReport snfndan sonra aadaki gibi, Order varlk snfn ekleyin:
[Table(Name = Orders)] public class Order { }

Tablo, Northwind veritabannda Orders olarak adlandrlr. Bir varlk nesnesi veritabanndaki bir satr gsterdiinden, varlk snf ad olarak tekil ad kullanmann yaygn bir uygulama olduunu hatrlayn.

524

Ksm V

Veriyi Ynetmek

6. Aada gsterilen zellii Order snfna ekleyin:


[Table(Name = Orders)] public class Order { [Column(IsPrimaryKey = true, CanBeNull = false)] public int OrderID { get; set; } }

OrderID stunu, Northwind veritabanndaki bu tablo iin birincil anahtardr. 7. Order snfna aadaki zellikleri ekleyin:
[Table(Name = Orders)] public class Order { ... [Column] public string CustomerID { get; set; } [Column] public DateTime? OrderDate { get; set; } [Column] public DateTime? ShippedDate { get; set; } [Column] public string ShipName { get; set; } [Column] public string ShipAddress { get; set; } [Column] public string ShipCity { get; set; } [Column] public string ShipCountry { get; set; } }

Bu zellikler, bir sipari iin mteri numaras, sipari tarihi ve nakliye bilgisi gibi bilgileri tutar. Veritabannda, bu stunlarn tm null deerler alabilir, bu nedenle OrderDate ve ShippedDate zellikleri iin DateTime trnn null olabilen srmn kullanmak gerekir (string, otomatik olarak null deerlere olanak salayan bir bavuru trdr.) DLINQnun otomatik olarak, SQL Server NVarChar trn .NET Framework string trne ve SQL Server DateTime trn de .NET Framework DateTime trne eletirdiine dikkat edin. 8. DLINQReport.cs dosyasna Order varlk snfndan sonra aadaki Northwind snfn ekleyin:
public class Northwind : DataContext { public Table<Order> Orders;

Blm 25

Bir Veritabannda Bilgi Sorgulamak

525

public Northwind(string connectionInfo) : base (connectionInfo) { } }

Northwind snf, Order varlk snfna dayal bir Table zellii ortaya koyan bir DataContext snfdr. Sonraki altrmada, veritabanndaki Orders tablosuna erimek iin DataContext snfnn bu zelletirilmi srmn kullanacaksnz.

Bir DLINQ sorgusu kullanarak sipari bilgisini almak


1. DLINQReport snfnn Main yntemine, bir Northwind nesnesi yaratan aadaki ifadeyi ekleyin. YourComputer yerine kendi bilgisayarnzn adn yazdnzdan emin olun:
static void Main(string[] args) { Northwind northwindDB = new Northwind(Integrated Security=true; + Initial Catalog=Northwind;Data Source=YourComputer\\SQLExpress); }

Burada belirtilen balant dizesi, daha nceki altrmadaki ile tam olarak ayndr. northwindDB nesnesi, Northwind veritabanna balanmak iin bu dizeyi kullanr. 2. Main yntemine, deiken bildiriminden sonra, bir try/catch blou ekleyin:
static void Main(string[] args) { ... try { // You will add your code here in a moment } catch(SqlException e) { Console.WriteLine(Error accessing the database: {0}, e.Message); } }

Sradan ADO.NET kod kullandnzda olduu gibi, SQL Server veritabanna eriildiinde bir hata olursa, DLINQ bir SqlException zel durumu oluturur. 3. try bloundaki aklama satrn aadaki kod ile deitirin:
try { Console.Write(Please enter a customer ID (5 characters): ); string customerId = Console.ReadLine(); }

Bu ifadeler, kullancdan bir mteri numaras girmesini ister ve kullancnn girdii deeri customerId adndaki dize deikeninde saklar.

526

Ksm V

Veriyi Ynetmek

4. Aadaki ifadeyi, yeni yazdnz koddan sonrasna yazn:


try { ... var ordersQuery = from o in northwindDB.Orders where String.Equals(o.CustomerID, customerId) select o; }

Bu ifade, belirtilen mterinin siparilerini bulacak olan DLINQ sorgusunu tanmlar. 5. nceki admda eklediiniz koddan sonra, aadaki foreach ifadesi ve ifelse blounu ekleyin:
try { ... foreach (var order in ordersQuery) { if (order.ShippedDate == null) { Console.WriteLine(Order {0} not yet shipped\n\n, order.OrderID); } else { // Display the order details } } }

foreach ifadesi, mterinin siparileri zerinde tekrarlanr. Veritabanndaki ShippedDate stunundaki deer null ise, Order varlk nesnesindeki uygun zellik de null olur ve daha sonra if ifadesi uygun bir ileti kts verir. 6. nceki admda eklediiniz if ifadesinin else ksmndaki aklama satr yerine aadaki kodu yazn:
if (order.ShippedDate == null) { ... } else { Console.WriteLine(Order: {0}\nPlaced: {1}\nShipped: {2}\n + To Address: {3}\n{4}\n{5}\n{6}\n\n, order.OrderID, order.OrderDate, order.ShippedDate, order.ShipName, order.ShipAddress, order.ShipCity, order.ShipCountry); }

Blm 25

Bir Veritabannda Bilgi Sorgulamak

527

7. Uygulamay oluturmak ve altrmak iin Debug mensnde, Start Without Debuggingi tklayn. 8. Please enter a customer ID (5 characters): (Ltfen mteri numarasn(5 karakter) girin:) iletisini grntleyen konsol penceresine VINET yazn. Uygulama, bu mterinin siparilerinin listesini grntlemelidir. Uygulama sona erdiinde, Visual Studio 2008e dnmek iin Enter tuuna basn. 9. Uygulamay yeniden altrn. Mteri numaras istendiinde bu defa BONAP yazn. Bu mterinin son siparii henz nakledilmemitir ve ShippedDate stununda null deer ierir. Uygulamann bu null deeri saptadn ve ilediini dorulayn. Uygulama sona erdiinde, Visual Studio 2008e dnmek iin Enter tuuna basn. DLINQnun veritabanndan bilgi sorgulamak iin salad basit elemanlar grdnz. DLINQ, veriyi deitirmek ve veritabann gncellemek iin gerekli zellikler de dahil olmak zere, uygulamalarnzda kullanabileceiniz ok sayda zellie sahiptir. Sonraki blmde DLINQnun bu zelliklerini ksaca gzden geireceksiniz.

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 26ya gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 25 Hzl Bavuru


Bunun in
ADO.NET kullanarak bir SQL Server veritabanna balanmak. ADO.NET kullanarak bir veritaban sorgusu yaratmak ve altrmak.

unu Yapn
Bir SqlConnection nesnesi yaratn, ConnectionString zelliine kullanlacak veritaban bilgisini ayarlayn ve Open yntemini arn. Bir SqlCommand nesnesi yaratn. Connection zelliine geerli bir SqlConnection nesnesi atayn. CommandText zelliine geerli bir SQL SELECT ifadesi atayn. Sorguyu altrmak ve bir SqlDataReader nesnesi yaratmak iin ExecuteReader yntemini arn. IsDBNull yntemini kullanarak verinin null olmadndan emin olun. Veri null deilse, veriyi elde etmek iin uygun GetXXX yntemini (GetString ya da GetInt32 gibi) kullann.

Bir ADO.NET SqlDataReader nesnesi kullanarak veriyi almak.

528

Ksm V

Veriyi Ynetmek

Bir varlk snf tanmlamak.

Her stun iin genel zelliklerle bir snf tanmlayn. Snf tanmna, temeldeki veritabanndaki tablo adn belirten Table znitelik nekini ekleyin. Her zellie Column znitelii nekini ekleyin ve veritabanndaki uygun stunun null olabileceini, adn, trn gsteren parametreleri belirleyin. Bir DataContext deikeni yaratn ve veritaban iin bir balant dizesi belirleyin. Sorgulamak istediiniz tabloya uygun varlk snfna dayanarak bir Table koleksiyon deikeni yaratn. Veritabanndan elde edilen veriyi tanmlayan ve varlklarn numaralandrlabilir koleksiyonunu dndren bir DLINQ tanmlayn. Her satrdaki veriyi elde etmek iin numaralandrlabilir koleksiyon zerinde tekrarlayn ve sonular ileyin.

DLINQ kullanarak bir sorgu yaratmak ve altrmak

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek


Bu blm tamamladktan sonra renecekleriniz:
n n

Varlk snf retmek iin Object Relational Designer (Nesne likili Tasarmc) kullanmak. Bir veritabanndan elde edilen veriyi grntlemek ve gncellemek iin Microsoft Windows Presentation Foundation (WPF) uygulamasnda veri balamay kullanmak. DLINQ kullanarak bir veritabann gncellemek. Birden fazla kullanc tarafndan yaplan elikili gncellemeleri saptamak ve zmek .

n n

Blm 25te, Microsoft ADO.NET ve DLINQ kullanarak bir veritabannda sorgulamalar yapmann temellerini rendiniz. Bu blmde, veriyi deitirmek iin DLINQ kullanan uygulamalar nasl yazacanz reneceksiniz. Veritabanndan alnan veriyi kullancya sunmak ve kullancnn o veriyi gncellemesini salamak iin WPF uygulamasnda veri balamay reneceksiniz. Daha sonra bu gncellemeleri veritabanna nasl yayacanz reneceksiniz.

DLINQ ile Veri Balamay Kullanmak


Veri balama kavram ile ilk olarak Blm 24te, bir WPF form zerindeki denetimlerin zelliklerini bir snfn rneklerindeki zelliklerle ilikilendirmek iin bu teknii kullandnzda karlatnz. Benzer taktii ve denetimlerin balama zelliklerini varlk nesnelerine uygulayabilirsiniz, bylece bir veritabannda tutulan veriyi grafiksel kullanc arabirimi kullanarak grntleyebilir ve gncelleyebilirsiniz. Bununla birlikte, ilk olarak, DLNQ tarafndan istenen varlk snflarn tanmlamanz gerekir. Blm 25te bunu kendiniz nasl yapacanz grdnz ve imdiye kadar varlk snflarnn nasl altn anlam olmalsnz. Microsoft Visual Studio 2008, bir veritabanna balanabilen ve sizin iin varlk snflar yaratan Object Relational Designer salar. Object Relational Designer, EntityRef<TEntity> ve EntitySet<TEntity> iliki zelliklerini de oluturabilir. Aadaki altrmalarda bu arac kullanacaksnz.

529

530

Ksm V

Veriyi Ynetmek

SQL Server 2005 Veritaban Dosyasna ErimekVisual C# 2008 Express Edition


Microsoft Visual C# 2008 Express Edition kullanyorsanz, varlk sihirbaz iin bir Microsoft SQL Server veritaban balants tanmladnzda, dorudan SQL Server veritaban dosyasna balanrsnz. Visual C# 2008 Express Edition, veritabanna eriim iin kullanc rnei (user instance) ad verilen kendi SQL Server Express rneini balatr. Kullanc rnei, kullancnn uygulamay altrmasnn gvenliini kullanarak alr. Visual C# 2008 Express Edition kullanyorsanz, veritabann SQL Server Express varsaylan rneinden ayrmanz gerekir nk veritaban kullanmda olduundan kullanc rnei veritabanna balanamayacaktr. Aada bunu nasl yapacanz aklanmtr.

Northwind veritabann ayrn


1. Windows Start mensnde, All Programs tklayn, Accessoriesi tklayn ve daha sonra bir komut penceresi amak iin Command Prompt tklayn. Windows Vista kullanyorsanz, Documents klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 26 klasrne gemek iin komut penceresinde, aadaki komutu yazn. Name yerine kendi kullanc adnz yazn.
cd \Users\Name\Documents\Microsoft Press\Visual CSharp Step by Step\Chapter 26

Windows XP kullanyorsanz, My Documents klasrnzde bulunan \Microsoft Press\Visual CSharp Step by Step\Chapter 26 klasrne gitmek iin aadaki komutu yazn. Name yerine kendi kullanc adnz yazn.
cd \Documents and Settings\Name\My Documents\Microsoft Press\Visual CSharp Step by Step\Chapter 26

2. Komut satrna aadaki komutu yazn:


sqlcmd S YourComputer\SQLExpress E idetach.sql

YourComputer yerine bilgisayarnzn adn yazn. detach.sql komut dosyas, Northwind veritabann SQL Server rneinden ayran aadaki SQL Server komutunu ierir:
sp_detach_db Northwind

3. Komut dosyasnn almas bittiinde, komut penceresini kapatn. Not Northwind veritabann yeniden oluturmanz gerekiyorsa, Blm 25te tanmland

gibi instnwnd.sql komut dosyasn altrabilirsiniz. Bununla birlikte, Northwind veritabann ayrdysanz ilk olarak C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\ Data klasrndeki Northwind.mdf ve Northwind_log.ldf dosyalarn silmeniz gerekir; aksi takdirde komut dosyas baarsz olacaktr.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

531

Windows Vista iletim sistemiyle alyorsanz, bu kullancya veritabann tutan klasre erime hakk ve veritaban dosyalarnn zerinde Tam Denetim hakk salamanz gerekir. Aada bunu nasl yapacanz aklanmtr.

Windows Vista altnda Northwind veritaban dosyasna eriim hakk verin


1. Ynetici haklarna sahip bir hesapla bilgisayarnza balann. 2. Windows Gezgini kullanarak, C:\Program Files\Microsoft SQL Server\MSSQL.1\ MSSQL klasrne gidin. 3. You dont currently have permission to access this folder, (Bu klasre eriim hakkna sahip deilsiniz) yazan ileti kutusunda, Continueu tklayn. Sonra beliren User Account Control (Kullanc Hesab Denetimi) iletisinde tekrar Continueu tklayn. 4. Data klasrne gidin, Northwind dosyasn farenin sa dmesiyle tklayn ve Propertiesi tklayn. 5. Northwind Properties iletiim kutusunda, Security sekmesini tklayn. 6. Security sayfasnda Do you want to continue? (Devam etmek istiyor musunuz?) iletisi grnrse, Continueu tklayn. User Account Control ileti kutusunda Continueu tklayn. Security sayfasnda To change permissions, click Edit (zinleri deitirmek iin Editi tklayn) iletisi yazyorsa, Editi tklayn. User Account Control ileti kutusu belirirse, Continueu tklayn. 7. Kullanc hesabnz, Group or user names liste kutusunda yer almyorsa, Permissions for Northwind iletiim kutusunda, Addi tklayn. Select Users or Groups iletiim kutusunda, kullanc hesabnzn adn yazn ve OKi tklayn. 8. Permissions for Northwind iletiim kutusundaki, Group or user names liste kutusunda kullanc hesabnz tklayn. 9. Permissions for Account liste kutusunda (Account yerine sizin hesap adnz olacaktr), Full Control girdisi iin Allow onay kutusunu iaretleyin ve OKi tklayn. 10. Northwind Properties iletiim kutusunda OKi tklayn. 11. 4 ile 10. admlar arasnda yaptnz ilemleri Data klasrndeki Northwind_log dosyas iin tekrarlayn.

532

Ksm V

Veriyi Ynetmek

Suppliers ve Products tablolar iin varlk snflar oluturun


1. Visual Studio 2008i balatn. 2. WPF Application ablonunu kullanarak yeni bir proje yaratn. Projeye Suppliers adn verin ve projeyi Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step by Step\Chapter 26 klasrne kaydedin. Not Visual C# 2008 Express Edition kullanyorsanz, Tools mensndeki Options iletiim
kutusunun Projects and Solutions ksmndaki Visual Studio projects locationa projenizi kaydetmek istediiniz konumu atayabilirsiniz.

3. Project mensnde, Add Class tklayn. 4. Add New Item Suppliers iletiim kutusunda, LINQ to SQL Classes ablonunu sein, Name kutusuna Northwind.dbml yazn ve sonra Addi tklayn. Object Relational Designer penceresi belirir. Northwind veritabannda, varlk snflar yaratmak istediiniz tablolar belirtmek, dahil etmek istediiniz stunlar semek ve stunlar arasndaki ilikiyi tanmlamak iin bu pencereyi kullanabilirsiniz. Object Relational Designer sizden bir veritabanna balant yaplandrmanz ister. Bu ilemin aamalar, Visual Studio 2008 Professional Edition veya Enterprise Edition ya da Visual C# 2008 Express Edition kullanmanza bal olarak biraz farkllk gsterir. 5. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, aadaki ilemleri yapn: 5.1. View mensnde Server Explorer tklayn. 5.2. Server Explorer penceresinde, Data Connections farenin sa dmesiyle tklayn ve sonra Add Connection tklayn. 5.3. Choose Data Source iletiim kutusu belirirse, Microsoft SQL Server ardndan da Continueu tklayn. 5.4. Add Connection iletiim kutusunda, Data source kutusuna bitiik olan Change dmesini tklayn. 5.5. Change Data Source iletiim kutusunda, Microsoft SQL Server veri kaynan tklayn, veri salayc olarak .NET Framework Data Provider for SQL Server seili olduundan emin olun ve sonra OKi tklayn. 5.6. Add Connection iletiim kutusunda, Server name kutusuna YourServer\ SQLExpress yazn.YourServer yerine bilgisayarnzn adn yazn.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

533

5.7. Use Windows Authentication seenek dmesini sein. Bu seenek, veritabanna balanmak iin Microsoft Windows hesap adnz kullanr ve SQL Servera balanmak iin nerilen yntemdir. 5.8. letiim kutusunun Connect to a database ksmnda, Select or enter a database namei tklayn, Northwind veritabann sein ve sonra OKi tklayn. 6. Visual C# 2008 Express Edition kullanyorsanz, aadaki ilemleri yapn: 6.1. View mensnde, Other Windows iaret edin ve daha sonra Database Explorer tklayn. 6.2. Database Explorer penceresinde, Data Connections farenin sa dmesiyle tklayn ve sonra Add Connection tklayn. 6.3. Choose Data Source iletiim kutusu belirirse, Microsoft SQL Server Database File veri kaynan tklayn, .NET Framework Data Provider for SQL Server seildiinden emin olun ve daha sonra Continueu tklayn. 6.4. Add Connection iletiim kutusunda, Data source kutusunun Microsoft SQL Server Database File (SqlClient) grntlediini dorulayn. Grntlemiyorsa, Changei tklayn ve Change Data Source iletiim kutusunda Microsoft SQL Server Database File veri kaynan tklayn, veri salayc olarak .NET Framework Data Provider for SQL Server seildiinden emin olun ve OKi tklayn. 6.5. Add Connection iletiim kutusunda, Database file name metin kutusunun sandaki Browseu tklayn. 6.6. Select SQL Server Database File iletiim kutusunda, C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data klasrne gidin, Northwind veritaban dosyasn ve ardndan Open tklayn. 6.7. Sunucuya balanmak iin Use Windows Authentication seeneini sein ve OKi tklayn. Not Baz veri kaynaklar, birden fazla veri salayc kullanlarak eriilebilir. rnein, Visual

Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, Microsoft .NET Framework Data Provider for SQL Server (SQL Server iin Microsoft .NET Framework Veri Salayc) ya da .NET Framework Data Provider for OLE DB (OLE DB iin .NET Framework Veri Salayc) kullanarak SQL Servera balanabilirsiniz. .NET Data Provider for SQL Server, SQL Server veritabanlarna balanmak iin iyiletirilmitir. Fakat, .NET Framework Data Provider for OLE DB, sadece SQL Server deil, eitli veri kaynaklarna balanmak iin kullanlabilen daha genel bir salaycdr.

7. Server Explorer ya da Database Explorerda, yeni veri balantsn geniletin (Visual Studio 2008de alyorsanz YourComputer\sqlexpress.Northwind.dbo ya da Visual C# 2008 Express Editionda alyorsanz Northwind.mdf) ve sonra Tables geniletin.

534

Ksm V

Veriyi Ynetmek

8. Suppliers tablosunu tklayn ve Object Relational Designer penceresine srkleyin. Object Relational Designer, Suppliers tablosuna ve tablodaki her stunun zelliklerine dayanarak, Supplier bir varlk snf yaratr. Not Visual C# 2008 Express Edition kullanyorsanz, projenize Northwind veritaban iin veri dosyas eklemek isteyip istemediinizi soran bir ileti kutusu belirir. 9. Supplier snfnda, HomePage stununu tklayn ve Delete tuuna basn. Object Relational Designer, Supplier snfndan HomePage zelliini kaldrr. 10. Benzer teknii kullanarak, Supplier snfndan, SupplierID, CompanyName ve ContactName dndaki tm stunlar kaldrn. 11. Server Explorer ya da Database Explorerda, Products tablosunu tklayn ve Object Relational Designer penceresine srkleyin. Object Relational Designer, Products tablosuna dayanarak Product adnda bir varlk snf yaratr. Object Relational Designern Suppliers ve Products tablolar arasndaki ilikiyi saptadna dikkat edin. 12. Product snfndan Discontinued, ReorderLevel, UnitsOnOrder, UnitsInStock ve CategoryID zelliklerini kaldrn. Tm snflar aadaki resimdeki gibi grnmelidir.

pucu Properties penceresinde snf ya da zellii seerek ve deerlerini deitirerek varlk


snf zniteliklerini ve varlk snf zelliklerini deitirebilirsiniz.

13. Solution Explorerda, Northwind.dbml klasrn geniletin ve sonra Northwind.designer.csyi ift tklayn. Object Relational Designer tarafndan oluturulan kod, Code and Text Editor penceresinde belirir. Bu kodu incelerseniz, NorthwindDataContext adnda bir DataContext snf ve iki varlk snf ierdiini grrsnz. Bu varlk snflar, Blm 25te kendi oluturduunuz snflardan biraz daha karmaktr fakat genel ilkeleri ayndr.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

535

Varlk snflarnn INotifyPropertyChanging ve INotifyPropertyChanged arabirimlerini uygulamas da karmakl artrr. Bu arabirimler, zellik deerleri deitiinde varlk snflarnn ortaya kard olaylar tanmlar. WPF ktphanesindeki eitli kullanc arabirim denetimleri, verideki deiiklikleri saptamak ve WPF form zerinde en son gncel bilginin grntlendiinden emin olmak iin bu olaylara abone olurlar. ki varlk snfn yaratmadan nce belirlediiniz balantyla ilgili bilgi, bir uygulama yaplandrma dosyasnda kaydedilir. Bir yaplandrma dosyasnda balant dizesi saklamak, uygulamay yeniden oluturmadan balant dizesini deitirebilmenizi salar; uygulama yaplandrma dosyasn dzenlersiniz. Veritabann yeniden konumlandrmaya ve yeniden adlandrmaya ya da bir yerel gelitirme veritaban kullanmaktan ayn tablo kmesine sahip bir rn veritabanna gemeye gerek duymayacanz dnyorsanz bu yararldr.

Bir Uygulama Yaplandrma Dosyas Kullanmak


Bir uygulama yaplandrma dosyas, uygulamann kendisini yeniden oluturmadan kullancnn uygulama tarafndan kullanlan kaynaklarn bazlarn deitirmesini salayan olduka yararl bir tekniktir. Bir veritabanna balanmak iin kullanlan balant dizesi byle bir kaynaa bir rnektir. Varlk snflar retmek iin Object Relational Designer kullandnzda, projenize app.config adnda yeni bir dosya eklenir. Bu uygulama yaplandrma dosyas kaynadr ve Solution Explorer penceresinde belirir. app.config dosyasn ift tklayarak ieriini inceleyebilirsiniz. Aada gsterildii gibi, bunun bir XAML dosyas olduunu greceksiniz (kitabn sayfasna smas iin metin yeniden biimlendirilmitir):
<?xml version=1.0 encoding=utf-8 ?> <configuration> <configSections> </configSections> <connectionStrings> <add name=DisplayProducts.Properties.Settings.NorthwindConnectionString connectionString=Data Source=YourComputer\SQLExpress; Initial Catalog=Northwind;Integrated Security=True providerName=System.Data.SqlClient /> </connectionStrings> </configuration>

Balant dizesi, dosyann <connectionStrings> esinde tutulur. Uygulamay oluturduunuzda, C# derleyicisi app.config dosyasn derlenen kodun tutulduu dosyaya kopyalar ve application.exe.config olarak yeniden adlandrr (Burada application yerine uygulamanzn ad gelecek). Uygulamanz veritabanna balandnda, C# kodunuzda kodlanm olan balant dizesini deil yaplandrma dosyasndaki balant dizesi deeri okunmaldr. Bu blmde, oluturulan varlk snflarn kullandnzda bunu nasl yapacanz greceksiniz.

536

Ksm V

Veriyi Ynetmek

Uygulama yaplandrma dosyasn (application.exe.config dosyas) uygulamann altrlabilir kodu ile konulandrmalsnz. Kullancnn farkl bir veritabanna balanmas gerekirse, <connectionStrings> esinin <connectionString> zniteliini deitirmek iin bir metin dzenleyici kullanarak yaplandrma dosyasn dzenleyebilir. Uygulama altnda, otomatik olarak yeni deeri kullanacaktr. Uygulama yaplandrma dosyasn korumak ve kullancnn uygun olmayan deiiklikler yapmasn engellemek iin gerekli ilemleri yapm olmalsnz.

Suppliers uygulamas iin kullanc arabirimi yaratn


1. Solution Explorerda, Window1.xaml dosyasn farenin sa dmesiyle tklayn, Renamei tklayn, SupplierInfo.xaml dosyasn yeniden adlandrn. 2. Design View penceresinde grntlemek iin App.xaml dosyasn ift tklayn. XAML blmesinde, StartupUri esini aada gsterildii gibi SupplierInfo.xaml olarak deitirin:
<Application x:Class=Suppliers.App xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml StartupUri=SupplierInfo.xaml> ... </Application>

3. Solution Explorerda, SupplierInfo.xaml dosyasn ift tklayarak Design View penceresinde grntleyin. XAML blmesinde, aada koyu harfle gsterildii gibi, x:Class esinin deerini Suppliers.SupplierInfo olarak deitirin, Title Supplier Information (retici Firma Bilgisi) olarak ayarlayn, Heighti 362 ve Width da 614 olarak ayarlayn:
<Window x:Class=Suppliers.SupplierInfo xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml Title=Supplier Information Height=362 Width=614> ... </Window>

4. Code and Text Editor penceresinde SupplierInfo.xaml.cs dosyasn grntleyin. Window1 snfnn adn SupplierInfo olarak ve kurucunun adn da aada gsterildii gibi deitirin:
public partial class SupplierInfo : Window { public SupplierInfo() { InitializeComponent(); } }

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

537

5. Solution Explorerda, SupplierInfo.xaml dosyasn ift tklayarak Design View penceresinde grntleyin. retici Firma Bilgisi formuna Toolboxdan, bir ComboBox denetimi, bir ListView denetimi ve bir Button denetimi ekleyin. 6. Properties penceresini kullanarak, bu denetimlerin zelliklerini aadaki tablodaki deerlere atayn.
Denetim
comboBox1

zellik
Name Height Width Margin VerticalAlignment HorizontalAlignment

Deer
suppliersList 21 Auto 40,16,42,0 Top Stretch productsList Auto Auto 40,44,40,60 Stretch Stretch saveChanges Save Changes False (onay kutusunu temizleyin) 23 90 40,0,0,10 Bottom Left

listView1

Name Height Width Margin VerticalAlignment HorizontalAlignment

button1

Name Content IsEnabled Height Width Margin VerticalAlignment HorizontalAlignment

538

Ksm V

Veriyi Ynetmek

Design View penceresinde, retici Firma Bilgisi formu aadaki gibi grnmelidir:

7. XAML blmesinde, aadaki Window kaynan Window esine ekleyin:


<Window x:Class=Suppliers.SupplierInfo ...> <Window.Resources> <DataTemplate x:Key=SuppliersTemplate> <StackPanel Orientation=Horizontal> <TextBlock Text={Binding Path=SupplierID} /> <TextBlock Text= : /> <TextBlock Text={Binding Path=CompanyName} /> <TextBlock Text= : /> <TextBlock Text={Binding Path=ContactName} /> </StackPanel> </DataTemplate> </Window.Resources> <Grid> ... </Grid> </Window>

Bir denetimde veriyi nasl grntleyeceinizi belirtmek iin bir DataTemplate ablonu kullanabilirsiniz. Sonraki admda bu ablonu suppliersList alan kutusuna uygulayacaksnz. Bu ablon, bir StackPanel kullanlarak yatay olarak yerletirilmi TextBlock denetimi ierir. Birinci, ikinci ve beinci TextBlock denetimleri, daha sonra balayacanz Supplier varlk nesnesinin SupplierID, CompanyName ve ContactName zelliklerindeki veriyi grntleyecektir. Dier TextBlock denetimleri sadece bir : (iki nokta st ste) ayrac gsterir. 8. XAML blmesinde, suppliersList alan kutusunun tanmn deitirin ve aadaki gibi, IsSynchronizedWithCurrentItem, ItemsSource ve ItemTemplate zelliklerini belirleyin:
<ComboBox ... Name=suppliersList IsSynchronizedWithCurrentItem=True ItemsSource={Binding} ItemTemplate={StaticResource SuppliersTemplate} />

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

539

suppliersList denetiminde Table<Supplier> koleksiyonundaki veriyi grntleyeceksiniz. IsSynchronizedWithCurrentItem zelliini ayarlamak, denetimin SelectedItem zelliinin koleksiyondaki geerli e ile eitlendiini garantiler. Bu zellii True olarak ayarlamazsanz, uygulama baladnda ve koleksiyon ile balama kurulduunda, alan kutu otomatik olarak bu koleksiyondaki ilk eyi grntlemeyecektir. ItemsSource u an bo bir balamaya sahiptir. Blm 24te, statik kaynak olarak bir snfn rneini tanmladnz ve balama kayna olarak kaynak belirlediniz. Bir balama kayna belirtmezseniz, WPF denetimin DataContext zelliinde belirtilen nesneye balar. (Denetimin DataContext zellii ile veritabanyla iletiim kurmak iin kullanlan DataContext nesnesini kartrmayn.) Denetimin DataContext zelliini, koddaki Tables<Supplier> koleksiyon nesnesine ayarlayacaksnz. ItemTemplate zellii, balama kaynandan elde edilen veriyi grntlemek iin kullanlacak ablonu belirtir. Bu durumda, suppliersList denetimi balama kaynandan SupplierID, CompanyName ve ContactName alanlarn grntleyecektir. 9. productsList liste kutusunun tanmn deitirin ve IsSynchronizedWithCurrentItem ve ItemsSource zelliklerini belirtin:
<ListView ... Name=productsList IsSynchronizedWithCurrentItem=True ItemsSource={Binding} />

Supplier varlk snf, retici firmann salad rnlere bavuran bir EntitySet<Product> zellii ierir. productsList denetiminin DataContext zelliini, kodda seilmi olan Supplier nesnesinin Products zelliine ayarlayacaksnz. Son altrmada, kullancnn rnleri eklemesi ve kaldrmas iin ilevsellik salayacaksnz. Bu kod, balama kayna olarak grev yapan rnler listesini deitirecek. IsSynchronizedWithCurrentItem zelliini True olarak ayarlamak, kullanc yeni bir rn eklediinde listede yeni eklenen rnn seildiini ya da bir rn sildiinde mevcut rnlerden birinin seildiini garanti eder. (Bu zellii False olarak ayarlarsanz, bir rn sildiinizde, sonradan hibir rn seilmeyecektir, bu da kodunuz seili eye erimeye altnda problemlere neden olabilir.) 10. Bir GridView ve stun tanmlarn ieren aadaki ListView.View alt esini productsList denetimine ekleyin. ListView esinin kapanan snrlaycsn(/>), sradan snrlayc (>) ile deitirdiinizden ve bir sonlandrc</ListView> esi eklediinizden emin olun.
<ListView ... Name=productsList ...> <ListView.View> <GridView> <GridView.Columns> <GridViewColumn Width=75 Header=Product ID

540

Ksm V

Veriyi Ynetmek

DisplayMemberBinding={Binding Path=ProductID} /> <GridViewColumn Width=225 Header=Name DisplayMemberBinding={Binding Path=ProductName} /> <GridViewColumn Width=135 Header=Quantity Per Unit DisplayMemberBinding={Binding Path=QuantityPerUnit} /> <GridViewColumn Width=75 Header =Unit Price DisplayMemberBinding={Binding Path=UnitPrice} /> </GridView.Columns> </GridView> </ListView.View> </ListView>

View zelliini ayarlayarak, ListView denetiminin eitli biimlerde veri grntlemesini salayabilirsiniz. Bu Extensible Application Markup Language (XAML) kod bir GridView bileeni kullanr. GridView, veriyi izelge biiminde grntler; tablodaki her satr GridViewColumn zellikleri tarafndan tanmlanan belirli stun kmesine sahiptir. Her stun, stunun adn gsteren kendi balna sahiptir. Her stunun DisplayMemberBinding zellii, stunun balama kaynandan grntlemesi gereken veriyi belirtir. UnitPrice stunundaki veri, decimal? zelliidir. WPF bu bilgiyi dizeye dntrecek ve varsaylan saysal biimi uygulayacaktr. deal olarak, bu stundaki veri, geerli deer olarak grntlenmelidir. Bir converter snf yaratarak GridView stunundaki veriyi yeniden biimlendirebilirsiniz. evirici snflar ile ilk olarak Blm 24te, bir seenek dmesinin durumunu gsteren bir Boolean deeri, bir numaralandrmaya dntrdnzde karlamtnz. Bu defa, evirici snf, bir decimal? deeri, geerli deerin gsterimini ieren bir string deere dntrecek. 11. SupplierInfo.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. Bu dosyaya, SupplierInfo snfndan sonra aadaki PriceConverter snfn ekleyin:
[ValueConversion(typeof(string), typeof(decimal?))] class PriceConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value != null) return String.Format({0:C}, value); else return ; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

541

Convert yntemi, bilgisayarnzn yerel geerli biimini kullanan bir dize yaratmak iin String.Format yntemini arr. Kullanc, liste grnmnde birim fiyat gerekten deitiremeyecektir, bu nedenle string deeri tekrar decimal? deere dntrmek iin ConvertBack yntemini altrmaya gerek yoktur. 12. SupplierInfo.xaml formunu grntleyen Design View penceresine dnn. Window esine aadaki XML ad alan bildirimini ekleyin ve aada gsterildii gibi, Window kayna olarak PriceConverter snfnn bir rneini tanmlayn:
<Window x:Class=Suppliers.SupplierInfo ... xmlns:app=clr-namespace:Suppliers ...> <Window.Resources> <app:PriceConverter x:Key=priceConverter /> ... </Window.Resources> ... </Window>

13. Unit Price (Birim Fiyat) GridViewColumn stununun tanmn deitirin ve aadaki gibi, balamaya evirici snfn uygulayn:
<GridViewColumn ... Header =Unit Price DisplayMemberBinding= {Binding Path=UnitPrice, Converter={StaticResource priceConverter}} />

Formu hazrladnz. imdi, form tarafndan grntlenen veriyi elde etmek iin biraz kod yazmanz ve balamann doru olarak almas iin suppliersList ve productsList denetimlerinin DataContext zelliklerini ayarlamanz gerekir.

retici firma bilgisini elde etmek ve veri balamalarn kurmak iin kod yazn
1. Window esinin tanmn deitirin ve Window_Loaded adnda (Bu, <New Event Handler> tkladnzda retilen, yntemin varsaylan addr.) bir Loaded olay yntemi belirleyin. Window esi XAML kodu yle grnmelidir:
<Window x:Class=Suppliers.SupplierInfo ... Title=Supplier Information ... Loaded=Window_Loaded> ... </Window>

2. SupplierInfo.xaml.cs dosyasn grntleyen Code and Text Editor penceresinde, aadaki using ifadelerini dosyann st ksmna ekleyin:
using System.ComponentModel; using System.Collections;

542

Ksm V

Veriyi Ynetmek

3. Aadaki zel alan SupplierInfo snfna ekleyin.


public partial class SupplierInfo : Window { private NorthwindDataContext ndc = null; private Supplier supplier = null; private BindingList<Product> productsInfo = null; ... }

Northwind veritabanna balanmak ve Suppliers tablosundan veriyi elde etmek iin ndc deikenini kullanacaksnz. supplier deikeni, suppliersList denetiminde grntlenen firma bilgisini tutacaktr. productsInfo deikeni, grntlenen retici firma tarafndan salanan rnleri tutacaktr. productsList denetimine balanacaktr. productsInfo deikeninin bu tanm hakknda endieleriniz olabilir; sonu olarak, Supplier snf, retici firma tarafndan salanan rnlere bavuran bir EntitySet<Product> zellie sahiptir. Gerekte bu EntitySet<Product> zelliini productsList denetimine balayabilirdiniz fakat bu yaklamla ilgili nemli bir problem vardr. Supplier ve Product varlk snflarnn InotifyPropertyChanging ve INotifyPropertyChanged arabirimlerini uyguladndan daha nce bahsedilmiti. Bir WPF denetimini bir veri kaynana baladnzda, denetim otomatik olarak, veri deitiinde grnty gncellemek iin bu arabirimler tarafndan ortaya karlan olaylara abone olur. Bununla birlikte, EntitySet<Product> snf bu arabirimleri uygulamaz, bu nedenle, rnler eklenir ya da karlrsa, liste grnm denetimi gncellenmeyecektir. (Bununla birlikte, mevcut rn deiirse gncellenecektir, nk EntitySet<Product>daki her e, bal olduu WPF denetimlerine uygun bildirimleri gnderen bir Product nesnesidir.) 4. Window_Loaded yntemine aadaki kodu ekleyin:
private void Window_Loaded(object sender, RoutedEventArgs e) { ndc = new NorthwindDataContext(); this.suppliersList.DataContext = ndc.Suppliers; }

Uygulama baladnda ve pencereyi yklediinde, bu kod, Northwind veritabanna balanan bir NorthwindDataContext deikeni yaratr. Object Relational Designern bu snf nceden yarattn hatrlayn. Bu snfn varsaylan kurucusu, uygulama yaplandrma dosyasndan veritaban balant dizesini okur. Yntem daha sonra, suppliersList alan kutusunun DataContext zelliini, ndc deikeninin Suppliers Table koleksiyon zellii olarak ayarlar. Bu eylem, alan kutu iin balamay zer ve bu alan kutu tarafndan kullanlan ablon, bu koleksiyondaki her Supplier nesnesi iin SupplierID, CompanyName ve ContactNamedeki deerleri grntler.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

543

Not Bir denetim bir dier denetimin alt denetimi ise (rnein, ListViewdeki GridViewColumn stunu) sadece st denetimin DataContext zelliini ayarlamanz gerekir. Alt denetimin DataContext zellii ayarlanmazsa, WPF alma zaman st denetimin DataContext zelliini kullanacaktr. Bu teknik, birka alt denetim ve bir st denetim arasnda bir veri ieriini paylaabilmenizi salar.
Anlk st denetimi bir veri ieriine sahip deilse, WPF alma zaman, formu tanmlayan Window denetimine doru stteki tm denetimleri inceleyecektir. Bir veri ierii mevcut deilse, bir denetim iin olan veri balama ihmal edilir.

5. Design View penceresine dnn. suppliersList_SelectionChanged olay yntemini yaratmak iin suppliersList alan kutusunu ift tklayn. (suppliersList alan kutusunu tklayamyorsanz, Design View penceresinde SupplierInfo.xaml dosyasn kapatp yeniden amay deneyin.) Bu yntem, kullanc alan kutuda farkl bir e sese de alacaktr. 6. Code and Text Editor penceresinde, suppliersList_SelectionChanged yntemine aadaki ifadeleri ekleyin:
private void suppliersList_SelectionChanged(object sender, SelectionChangedEventArgs e) { supplier = this.suppliersList.SelectedItem as Supplier; IList list = ((IListSource)supplier.Products).GetList(); productsInfo = list as BindingList<Product>; this.productsList.DataContext = productsInfo; }

Bu yntem, seili olan retici firma bilgisini elde eder ve bu firmann EntitySet<Product> zelliindeki veriyi, bir BindingList<Product> koleksiyona evirdikten sonra productsInfo deikenine atar. EntitySet<Product> snfnn, varlk kmesindeki veriyi bir IList nesnesine kopyalamak iin GetList yntemini salayan IListSource arabirimini gerekletirdiine dikkat edin. Son olarak, yntem productsList denetiminin DataContext zelliine rnlerin listesini atar. 7. Uygulamay oluturmak ve altrmak iin Debug mensnde, Start Without Debuggingi tklayn. Form altnda, ilk retici firmann rnlerini (Egzotik ecekler) grntlemelidir. Form sonraki sayfadaki resim gibi grnmelidir. Not Baz koullarda, SQL Server belirli bir sre iinde bir yant vermezse, uygulama zaman
amndan dolay baarsz olabilir. (SQL Servern veritabanna bir balant amas birka saniye srebilir.) Byle bir durum olursa, uygulamay tekrar altrn.

544

Ksm V

Veriyi Ynetmek

8. Alan kutudan farkl bir retici firma sein ve liste grnmnn o firmann bilgilerini grntlediini dorulayn. Veriyi inceledikten sonra formu kapatn ve Visual Studio 2008e dnn. Son aama, kullancnn rn bilgilerini deitirebilmesini, rnleri kaldrabilmesini ve yeni rnler ekleyebilmesini salamaktr. Bunu yapabilmeniz iin ncelikle veriyi gncellemek iin DLINQ kullanmn renmeniz gerekir.

Veri Gncellemek in DLINQ Kullanmak


DLINQ, bir veritaban ile iki ynl iletiim kanal salar. Veriyi elde etmek iin DLINQyu nasl kullanacanz grdnz ancak ayrca aldnz veriyi deitirerek veritabanna geri gnderebilirsiniz.

Mevcut Veriyi Gncellemek


Herhangi bir sradan nesnedeki verileri deitirdiiniz ekilde (zelliklerini ayarlayarak), Table<Product> koleksiyonundaki Product nesnelerinin verilerini deitirebilirsiniz. Bununla birlikte, bellekteki bir nesneyi gncellemek veritabann gncellemez. Deiiklikleri veritabanna yanstmak iin, uygun SQL UPDATE komutunu oluturmanz ve veritaban sunucusu tarafndan altrlacak ekilde dzenlemeniz gerekir. Bunu DLINQ ile olduka kolay yapabilirsiniz. Aadaki kod paras 14 nolu retici firma bilgisini elde eder ve adn Bean Curd olarak deitirir (14 nolu firma Northwind veritabannda Tofu adyla kaytlyd) ve daha sonra veritabanna geri gnderir:
NorthwindDataContext ndc = new NorthwindDataContext(); Product product = ndc.Products.Single(p => p.ProductID == 14); product.ProductName = Bean Curd; ndc.SubmitChanges();

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

545

Bu kod rneindeki anahtar ifade, DataContext nesnesinin SubmitChanges yntemine yaplan ardr. Bir sorgunun almasyla ortaya kan DLINQ varlk nesnesindeki bilgiyi deitirdiinizde, orijinal sorguyu altrmak iin kullanlan balanty yneten DataContext nesnesi, veride yaptnz deiiklikleri izler. SubmitChanges yntemi bu deiiklikleri veritabanna yayar. DataContext nesnesi bir SQL UPDATE ifadesi uygular ve kurar. Birka rn bilgisini alp deitirirseniz, SubmitChanges yntemini son deiiklikten sonra sadece bir defa armanz yeterlidir. SubmitChanges yntemi, tm gncellemeleri biraraya toplar. DataContext nesnesi bir veritaban ilemi yaratr ve bu ilemdeki tm SQL UPDATE ifadelerini altrr. Gncellemelerden biri baarsz olursa, ilem iptal edilir ve SubmitChanges yntemi tarafndan veritabannda yaplan tm deiiklikler geri alnr ve SubmitChanges yntemi bir zel durum oluturur. Tm gncellemeler baarl olursa, ilem tamamlanr ve deiiklikler veritabannda kalc olur. SubmitChanges yntemi baarsz olursa, sadece veritabanndaki deiikliklerin geri alndna; bellekteki varlk nesnelerinde yaptnz deiikliklerin hala geerli olduuna dikkat edin. SubmitChanges yntemi baarsz olduunda oluturulan zel durum, baarszln nedeni hakknda bilgi salar. Problemi giderip SubmitChanges yntemini tekrar armay deneyebilirsiniz. DataContext snf ayrca Refresh yntemi salar. Bu yntem ile, veritabanndan Table koleksiyonunu yeniden alabilir ve yaptnz deiiklikleri yok edebilirsiniz. Bu yntemi aadaki gibi kullanrsnz:
ndc.Refresh(RefreshMode.OverwriteCurrentValues, ndc.Products);

lk parametre, System.Data.Linq.RefreshMode numaralandrmasnn bir yesidir. RefreshMode.OverwriteCurrentValues deeri belirlemek, verinin veritabanndan yeniden elde edilmesini salar. (Sonraki blmde greceiniz gibi, bu numaralandrma baka deerler de ierir.) kinci parametre, yenilenen tablodur. Aslnda, Refresh yntemi ikinci parametre olarak bir params dizisi alr, bu nedenle birden ok defa yenileme yapmanz gerekiyorsa tablolarn tm listesini temin edebilirsiniz. pucu Deiiklii izleme, bir DataContext nesnesi iin gerekletirilmesi zor bir ilemdir. Veriyi

gncellemeyeceinizi biliyorsanz (rnein uygulamanz salt okunur rapor retiyorsa), ObjectTrackingEnabled zelliini false olarak ayarlayarak deiiklik izlemeyi iptal edebilirsiniz. Bir veri almadan nce bu zellii ayarlamanz gerekir. Bir salt okunur DataContext nesne zerinde SubmitChanges yntemini arma giriimi InvalidOperationException zel durumunu oluturacaktr.

Gncelleme akmalarnn stesinden Gelmek


Bir gncelleme ileminin baarsz olmas iin birok neden olabilir fakat en yaygn nedenlerden biri, iki kullanc ayn anda ayn veriyi gncellemeye kalktnda meydana gelen karklktr. DLINQ kullanan bir uygulamay altrdnzda neler meydana

546

Ksm V

Veriyi Ynetmek

geldiini dnrseniz, pek ok karklk olabilecek alan olduunu grebilirsiniz. Bir DataContext nesnesi zerinden veri aldnzda, varlk nesnelerinin koleksiyonunda, uygulamanzn belleinde saklanr. Baka bir kullanc, ayn sorguyu altrabilir ve ayn veriyi elde edebilir. Her iki kullanc da veriyi deitirirse ve daha sonra SubmitChanges yntemini arrsa, veritabannda bir kullancnn yapt deiiklik dierinin yapt deiikliklerin zerine yazlacaktr. Bu olay, kayp gncelleme (lost update) olarak adlandrlr. SubmitChanges yntemi bu durumu saptar ve bu durumun stesinden gelmesi gereken ChangeConflictException zel durumunu oluturur. ChangeConflictException zel durumu olutuunda, DataContext nesnesinin ChangeConflicts zelliini inceleyerek bu akmann nedenini anlayabilirsiniz. Bu zellik, her akmann nedeni hakknda bilgi ieren ObjectChangeConflict nesnelerini kapsayan bir koleksiyondur. ObjectChangeConflict snfndaki nemli zellikler, gncellemeye altnz satr baka bir kullancnn silmesinden dolay akma olup olmadn gsteren bir Boolean deer olan IsDeleted ve MemberChangeConflict nesnelerinin salt okunur koleksiyonu olan MemberConflicts zellikleridir. MemberChangeConflict snf, uygulamanzdaki verinin o anki deerini ve veritabanndan aldnz orijinal deeri kapsayan ok sayda zellik ierir. SubmitChanges yntemini altrdnzda bir akma saptarsanz, uygulamanz her akmann nedenini ve nasl giderebileceini inceleyebilir. Uygulamanzn doasna bal olarak, kullancya akma ile ilgili bilgi sunabilir ve kullancnn seim yapmasna izin verebilirsiniz. ObjectChangeConflict snf, akmadan kaynaklanan problemleri gidermenize yardmc olan Resolve adnda bir yntem ierir. DataContext nesnesinin ChangeConflicts koleksiyon zelliindeki her akma iin, tercih ettiiniz zm stratejisini gsteren bir parametre ile Resolve yntemini arabilirsiniz. Bu parametre, RefreshMode numaralandrmasnn bir yesi olmaldr. Aadaki deerleri belirleyebilirsiniz:
n

RefreshMode .KeepCurrentValues Bu deer, bellekteki deerin, veritabannda akan deiikliklerin zerine yazlmas gerektiini gsterir; O anki kullanc kazanan kiidir. RefreshMode .OverwriteCurrentValue Bu deer, veritabanndaki verinin kullanlmas gerektiini gsterir. Veritabanndaki deer, bellekteki deerin zerine yazlacaktr; O anki kullanc kaybeden kiidir. RefreshMode .KeepChanges Bu deer, iki kullanc ayn anda, ayn satrdaki farkl stunlar gncellerse ne olacan belirler. Bu durumda, iki kullanc tarafndan yaplan deiiklikler birletirilir; her iki kullanc da kazanandr.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

547

Aadaki kod, akan veriyi grntleyen ve RefreshMode.OverwriteCurrentValues seeneini kullanarak problemi gideren ChangeConflictException ileyicisini gsterir.
try { ndc.SubmitChanges(); } catch (ChangeConflictException) { foreach (ObjectChangeConflict conflict in ndc.ChangeConflicts) { foreach (MemberChangeConflict changeConflict in conflict.MemberConflicts) { Console.WriteLine(Conflict Details); Console.WriteLine(Original value retrieved from database: {0}, changeConflict.OriginalValue.ToString()); Console.WriteLine(Current value in database: {0}, changeConflict.DatabaseValue.ToString()); Console.WriteLine(Current value in memory: {0}, changeConflict.CurrentValue.ToString()); } conflict.Resolve(RefreshMode.OverwriteCurrentValues); } }

Not DataContext snfnn ChangeConflicts koleksiyonu, tm akmalar zmek iin ayn RefreshMode deerine uygulayacanz, ResolveAll yntemi salar. akma problemini giderdiinizde, deiikliklerin geerli olmas iin tekrar SubmitChanges yntemini armalsnz. Bu teknikle ilgili hala bir problem vardr: Kullanc birka satr gncellemise, birden fazla akma olmu olabilir. lk akma saptandnda ChangeConflictException zel durumu oluturulur ve yukarda tarif edildii gibi problemi giderebilirsiniz. Fakat ChangeConflicts koleksiyonunda sadece bir ObjectChangeConflict nesnesi ayarlanacaktr. Gncellemeyi veritabanna gndermek iin tekrar SubmitChanges yntemini ardnzda, bir sonraki akma iin ChangeConflictException zel durumu oluacaktr. Size yardmc olmas iin, SubmitChanges yntemi ar yklenecektir, bylece ChangeConflictException zel durumunu nasl dzelteceinizi belirleyebilirsiniz. ConflictMode.ContinueOnConflict parametre deeri ile SubmitChanges yntemini armak, bir ya da daha fazla akma meydana gelirse, SubmitChanges ynteminin tm gncellemeleri gerekletirmeye almas ve ilemlerin sonunda sadece bir ChangeConflictException zel durumu oluturmas gerektiini gsterir. Ar yklenmi yntemi aadaki gibi arn:
ndc.SubmitChanges(ConflictMode.ContinueOnConflict);

548

Ksm V

Veriyi Ynetmek

ChangeConflictException ileyicinizdeki kod daha sonra, DataContext nesnesinin ObjectChangeConflict zelliindeki tm eler zerinde yineleme yapabilir ve SubmitChanges yntemini tekrar armadan nce tm zel durumlar zebilir (daha nce gsterilen rnek bunu yapmaktadr). SubmitChanges yntemini ardnzda, ayn zamanda parametre deerini ConflictMode.FailOnFirstConflict olarak belirlersiniz. Bu varsaylan harekettir ve ilk akma saptanr saptanmaz bir ChangeConflictException zel durumu meydana gelir.

Veri Eklemek ve Silmek


DLINQ ile mevcut veriyi dzenlemenin yansra, Table koleksiyonuna yeni eler ekleyebilir ve Table koleksiyonundan eleri kaldrabilirsiniz. Yeni bir e eklemek iin, Add yntemini arn ve aadaki gibi, yeni bilgi ile bir varlk nesnesi salayn:
NorthwindDataContext ndc = new NorthwindDataContext(...); Table<Product> products = ndc.Products; Product newProduct = new Product() {ProductName = New Product, ... }; products.Add(newProduct);

SubmitChanges yntemini ardnzda, DataContext nesnesi, Table koleksiyonundaki her e iin bir SQL INSERT ifadesi retecektir. Not Table koleksiyonuna yeni bir varlk nesnesi eklediinizde, veritabannda null deere izin

vermeyen her stun iin deerler salamak zorundasnz. Bu kurala istisna olan tek stun, veritabannda IDENTITY (kimlik) stunlar olarak tasarlanm olan birincil anahtar stunlardr; SQL Server bu stunlar iin deerler retecek ve kendiniz bir deer belirlemeye alrsanz hata verecektir.

Table koleksiyonundan bir varlk nesnesi silmek ayn derecede kolaydr. Remove yntemini arr ve silinecek varl belirlersiniz. Aadaki kod, products koleksiyonundan 14 numaral rn siler.
Product product = products.Single(p => p.ProductID == 14); products.Remove(product);

SubmitChanges yntemini ardnzda, DataContext nesnesi, Table koleksiyonundan kaldrlan her satr iin bir SQL DELETE ifadesi retecektir. Not Veritabann gncellediinizde baz silme ilemleri veri tutarll hatalarna neden

olabileceinden, dier tablolarla ilikili tablolardaki satrlar silerken dikkatli olun. rnein, Northwind veritabannda, o an rnler salayan firmay silmeye kalkrsanz, gncelleme ilemi baarsz olacaktr. lk olarak, o firmann mevcut rnlerinin tm iin Products tablosundaki SupplierID stununu deitirmeniz ve null ya da farkl bir firma ad olarak ayarlamanz gerekir.

imdi retici Firmalar (Suppliers) uygulamasn tamamlamak iin yeterli bilgiye sahipsiniz.

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

549

rnleri deitirmek, silmek ve yeni rnler yaratmak iin kod yazn


1. retici Firmalar uygulamasn dzenleyeceiniz Visual Studio 2008e dnn. 2. Design View penceresinde, XAML blmesinde, KeyDown olayn yakalamak ve productsList_KeyDown adnda (olay ynteminin varsaylan addr) bir olay yntemini armak iin productsList denetiminin tanmn deitirin. IntelliSense, KeyDown anahtar szcn tanmazsa, SupplierInfo.xaml dosyasn kapatp yeniden amay deneyin. 3. Code and Text Editor penceresinde, aadaki kodu productsList_KeyDown yntemine ekleyin.
private void productsList_KeyDown(object sender, KeyEventArgs e) { switch (e.Key) { case Key.Enter: editProduct(this.productsList.SelectedItem as Product); break; case Key.Insert: addNewProduct(); break; case Key.Delete: deleteProduct(this.productsList.SelectedItem as Product); break; } }

Bu yntem, kullancnn bast tuu inceler. Kullanc Enter tuuna basarsa, kod editProduct yntemini arr, parametre olarak rn bilgisini geirir. Kullanc Insert tuuna basarsa, kod geerli retici firma listesine yeni rn eklenmesi ve yaratlmas iin addNewProduct yntemini arr ve kullanc Delete tuuna basarsa, kod rn silmek iin deleteProduct yntemini arr. Sonraki birka basamakta editProduct, addNewProduct ve deleteProduct yntemlerini yazacaksnz. 4. SupplierInfo snfna aadaki gibi deleteProduct yntemini ekleyin:
private void deleteProduct(Product prod) { MessageBoxResult response = MessageBox.Show(Delete + prod.ProductName, Confirm, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); if (response == MessageBoxResult.Yes) { supplier.Products.Remove(prod); productsInfo.Remove(prod); this.saveChanges.IsEnabled = true; } }

550

Ksm V

Veriyi Ynetmek

Bu yntem, kullancya gerekten seilen rn silmek isteyip istemediini sorar. if ifadesi, bu koleksiyondan rn silmek ve ayrca productsInfo balama listesinden de kaldrmak iin Products EntitySet<TEntity> zelliinin Remove yntemini arr. (Bu basamak, grntlenen bilgilerin deiikliklerle eitlendiinden emin olmak iin gereklidir.) Son olarak, yntem saveChanges dmesini etkinletirir. Products EntitySet<TEntity> zelliinde yaplan deiiklikleri sonraki admda veritabanna gndermek iin bu dmeye gerekli ilevsellii ekleyeceksiniz. rnler eklemek ve dzenlemek iin kullanabileceiniz birka yaklam vardr; ListView denetimindeki stunlar salt okunur metin eleridir fakat metin kutular ya da kullanc giriini salayan dier denetimleri ieren kiiselletirilmi liste grnm yaratabilirsiniz. Bununla birlikte, en basit strateji, kullancnn rn bilgisi eklemesi ya da dzenlemesine olanak salayan bir baka form yaratmaktr. 5. Project mensnde, Add Class tklayn. Add New Items Suppliers iletiim kutusunda, Window (WPF) ablonunu sein, Name kutusuna ProductForm.xaml yazn ve Addi tklayn. 6. Design View penceresinde, ProductForm formunu tklayn ve Properties penceresinde, ResizeMode zelliini NoResize olarak ayarlayn, Height zelliini 225 ve Width zelliini de 515 olarak ayarlayn. 7. Forma Label denetimi, TextBox denetimi ve iki Button denetimi ekleyin. Properties penceresini kullanarak, bu denetimlerin zelliklerine aadaki tabloda gsterilen deerleri atayn.
Denetim
label1

zellik
Content Height Width Margin VerticalAlignment HorizontalAlignment

Deer
Product Name 23 120 17,20,0,0 Top Left Quantity Per Unit 23 120 17,60,0,0 Top Left

label2

Content Height Width Margin VerticalAlignment HorizontalAlignment

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

551

Denetim
label3

zellik
Content Height Width Margin VerticalAlignment HorizontalAlignment

Deer
Unit Price 23 120 17,100,0,0 Top Left productName 21 340 130,24,0,0 Top Left quantityPerUnit 21 340 130,64,0,0 Top Left unitPrice 21 120 130,104,0,0 Top Left ok OK 23 75 130,150,0,0 Top Left

textBox1

Name Height Width Margin VerticalAlignment HorizontalAlignment

textBox2

Name Height Width Margin VerticalAlignment HorizontalAlignment

textBox3

Name Height Width Margin VerticalAlignment HorizontalAlignment

button1

Name Content Height Width Margin VerticalAlignment HorizontalAlignment

552

Ksm V

Veriyi Ynetmek

Denetim
button2

zellik
Name Content Height Width Margin VerticalAlignment HorizontalAlignment

Deer
cancel Cancel 23 75 300,150,0,0 Top Left

retici Firma Bilgisi formu, Design View penceresinde aadaki gibi grnmelidir:

8. click olayna bir olay ileyici yaratmak iin OK dmesini ift tklayn. Code and Text Editor penceresinde, ProductForm.xaml.cs dosyasna aadaki kodu ekleyin.
private void ok_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrEmpty(this.productName.Text)) { MessageBox.Show(The product must have a name, Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } decimal result; if (!Decimal.TryParse(this.unitPrice.Text, out result)) { MessageBox.Show(The price must be a valid number, Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } if (result < 0) {

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

553

MessageBox.Show(The price must not be less than zero, Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } this.DialogResult = true; }

Uygulama ShowDialog yntemini ararak bu formu grntleyecektir. Bu yntem formu tipik iletiim kutusu olarak grntler. Kullanc form zerinde bir dmeyi tkladnda, click olaynn DialogResult zellii ayarlanmsa otomatik olarak formu kapatacaktr. Kullanc OKi tklarsa, bu yntem kullanc tarafndan girilen bilginin doruluunu gerekletirir. Veritabanndaki Quantity Per Unit stunu null deerler alr, bu nedenle kullanc formda bu alan bo brakabilir. Kullanc geerli bir rn ad ve fiyat girerse, yntem formun DialogResult zelliine true deeri atar. Bu deer ShowDialog yntemi arsna geri dndrlr. 9. ProductForm.xaml dosyasn grntleyen Design View penceresine dnn. Cancel dmesini sein ve Properties penceresinde IsCancel zelliini true olarak ayarlayn (onay kutusunu iaretleyin). Kullanc Cancel dmesini tklarsa, otomatik olarak formu kapatr ve ShowDialog yntemine DialogResult deeri olarak false deeri dndrr. 10. SupplierInfo.xaml.cs dosyasn grntleyen Code and Text Editor penceresine gein. SupplierInfo snfna aada gsterilen addNewProduct yntemini ekleyin.
private void addNewProduct() { ProductForm pf = new ProductForm(); pf.Title = New Product for + supplier.CompanyName; if (pf.ShowDialog().Value) { Product newProd = new Product(); newProd.SupplierID = supplier.SupplierID; newProd.ProductName = pf.productName.Text; newProd.QuantityPerUnit = pf.quantityPerUnit.Text; newProd.UnitPrice = Decimal.Parse(pf.unitPrice.Text); supplier.Products.Add(newProd); productsInfo.Add(newProd); this.saveChanges.IsEnabled = true; } }

addNewProduct yntemi ProductForm formunun yeni bir rneini yaratr, retici firmann adn kapsamas iin bu formun Title zelliini ayarlar ve daha sonra formu tipik iletiim kutusu olarak grntlemek iin ShowDialog yntemini arr. Kullanc geerli veri girerse ve form zerindeki OK dmesini tklarsa, if bloundaki kod yeni bir Product nesnesi yaratr ve ProductForm rneinden bilgi ile doldurur. Yntem

554

Ksm V

Veriyi Ynetmek

daha sonra bu nesneyi geerli retici firma iin Products EntitySet<TEntity> iine ve ayrca formdaki liste grnmne de ekler. Son olarak, kod Save Changes dmesini etkinletirir. Sonraki aamada, kullancnn deiiklikleri veritabanna kaydedebilmesi iin, bu dmenin click olay ileyicisini ekleyeceksiniz. 11. SupplierInfo snfna aada gsterilen editProduct yntemini ekleyin.
private void editProduct(Product prod) { ProductForm pf = new ProductForm(); pf.Title = Edit Product Details; pf.productName.Text = prod.ProductName; pf.quantityPerUnit.Text = prod.QuantityPerUnit; pf.unitPrice.Text = prod.UnitPrice.ToString(); if (pf.ShowDialog().Value) { prod.ProductName = pf.productName.Text; prod.QuantityPerUnit = pf.quantityPerUnit.Text; prod.UnitPrice = Decimal.Parse(pf.unitPrice.Text); this.saveChanges.IsEnabled = true; } }

editProduct yntemi ayrca ProductForm formunun bir rneini yaratr. Bu defa, Title zelliini ayarlamann yansra, ayrca formdaki alana seilen rn bilgisini yerletirir. Form grntlendiinde, kullanc bu deerleri dzenleyebilir. Kullanc formu kapatmak iin OK dmesini tklarsa, if bloundaki kod, Save Changes dmesini etkinletirmeden nce yeni deerleri seilen rne kopyalar. Bu defa, Product snf liste grnm denetimi verisini otomatik olarak deitirmesi iin uyardndan, productsInfo listesindeki geerli eyi sizin gncellemenize gerek olmadna dikkat edin. 12. SupplierInfo.xaml dosyasn grntleyen Design View penceresine dnn. click olay ileyici yntemini yaratmak iin Save Changes dmesini ift tklayn. 13. Code and Text Editor penceresinde, saveChanges_Click yntemine aadaki kodu ekleyin:
private void saveChanges_Click(object sender, RoutedEventArgs e) { try { ndc.SubmitChanges(); saveChanges.IsEnabled = false; } catch (Exception ex) { MessageBox.Show(ex.Message, Error saving changes); } }

Blm 26

Veri Balamay Kullanarak Veriyi Grntlemek ve Dzenlemek

555

Bu yntem, tm deiiklikleri veritabanna gndermek iin DataContext nesnesinin SubmitChanges yntemini arr. Basitlik asndan, bu yntem sadece olduka ilkel zel durum ileme gerekletirir ve dier kullanc tarafndan yaplan gncellemelerin akmasndan kaynaklanan hatalar gidermeye almaz.

retici Firmalar uygulamasn test edin


1. Uygulamay oluturmak ve altrmak iin Debug mensnde Start Without Debuggingi tklayn. Egzotik ecekler firmasnn rnlerini grntleyen form belirdiinde, 3 numaral rn (Anason Tohumu urubu) tklayn ve Enter tuuna basn. Edit Product Details formu grnmelidir. Unit Price alanndaki deeri 12.5 olarak deitirin ve sonra OKi tklayn. Yeni fiyatn liste grnmne kopyalandn dorulayn. 2. Insert tuuna basn. New Product for Exotic Liquids formu grnmelidir. Bir rn ad, birim miktar ve fiyat girin, daha sonra OKi tklayn. Yeni rnn liste grnmne eklendiini dorulayn. Product ID stunundaki deer 0 olmaldr. Bu deer veritabanndaki kimlik stunudur, bu nedenle SQL Server deiiklikleri kaydettiinizde bu stun iin kendi esiz deerini retir. 3. Save Changesi tklayn. Veri kaydedildikten sonra, yeni rnn ID deeri liste grnmnde grntlenir. 4. Yeni rn tklayn ve Delete tuuna basn. Confirm iletiim kutusunda Yesi tklayn. rnn form zerinden kaybolduunu dorulayn. Tekrar Save Changesi tklayn ve ilemin hatasz tamamlandn dorulayn. Dier retici firmalar iin de rn ekleme, kaldrma ve dzenlemeyi deneyin. Save Changesi tklamadan nce birka deiiklik yapabilirsiniz. SubmitChanges yntemi, veri alndndan ya da son deiiklik kaydedildikten sonra yaplan tm deiiklikleri kaydeder. pucu Bir rn verisini yanllkla sildiyseniz ya da zerine yazdysanz, Save Changesi
tklamadan uygulamay kapatn. Kullanc deiiklikleri kaydetmeden kmaya alrsa uygulamann bir uyarda bulunmadna dikkat edin.

Alternatif olarak, veritabanndaki tablolar yeniden yerletirmek iin ndc DataContext nesnesinin Refresh yntemini aran bir Discard Changes dmesi ekleyebilirsiniz. Ayrca daha sonra, seili rn iin productsInfo balama listesini yeniden oluturmanz gerekecektir. Bununla birlikte, retici Firmalar uygulamasnda olduu gibi, az sayda satr iliyorsanz, en basit teknik geerli DataContext nesnesini terk ederek yeni bir tane yaratmak ve daha sonra aadaki gibi suppliersList alan kutusu iin balamay yeniden uygulamaktr:
ndc = new NorthwindDataContext(); this.suppliersList.DataContext = ndc.Suppliers;

5. Formu kapatn ve Visual Studio 2008e dnn.

556

Ksm V
n

Veriyi Ynetmek

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 27e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 26 Hzl Bavuru


Bunun in
Object Relational Designer kullanarak varlk snflar yaratmak

unu Yapn
LINQ to SQL Classes ablonunu kullanarak projeye yeni bir snf ekleyin. Server Explorer (Visual Studio 2008 Professional Edition ya da Enterprise Edition) ya da Database Explorer (Visual C# 2008 Express Edition) kullanarak veritabanna balann. Veritabanndan tablolar Object Relational Designera srkleyin. Denetimin uygun zellii iin bir balama tanmlayn. Denetim nesnelerin bir listesini grntlerse, denetimin DataContext zelliini varlk nesnelerinin koleksiyonuna ayarlayn. Denetim tek bir nesne iin veriyi grntlerse, denetimin DataContext zelliine bir varlk nesnesi atayn ve balamann Path zniteliinde grntlemek iin varlk nesnesinin zelliini belirleyin. lk olarak aadakilerden birini yapn: n Veritabanndaki bir tablodaki satr gncellemek iin, satrdaki veriyi bir varlk nesnesine aln ve varlk nesnesinin uygun zelliklerine yeni deerleri atayn. Veritabanndaki bir tabloya yeni bir satr eklemek iin, uygun varlk nesnesinin yeni bir rneini yaratn, zelliklerini ayarlayn ve daha sonra uygun Table koleksiyonunun Add yntemini arn, parametre olarak yeni varlk nesnesini belirtin. Veritabanndaki bir tablodan bir satr silmek iin, uygun Table koleksiyonunun Remove yntemini arn, parametre olarak silinecek varlk nesnesini belirtin.

Varlk snfndan ya da bir WPF denetimindeki koleksiyondan veriyi grntlemek.

DLINQ kullanarak veritabanndaki bilgiyi deitirmek

Tm deiiklikleri yaptktan sonra, deiiklikleri veritabanna aktarmak iin DataContext nesnesinin SubmitChanges yntemini arn. DLINQ kullanarak, veritabann gncellerken meydana gelen akmalar saptamak. ChangeConflictException iin bir ileyici salayn. zel durum ileyicide, DataContext nesnesinin ChangeConflicts zelliindeki ObjectChangeConflict nesneleri inceleyin. Her akma iin, en uygun zm belirleyin ve uygun RefreshMode parametresi ile Resolve yntemini arn.

Adm Adm Microsoft Visual C# 2008

Web Uygulamalar Oluturmak


Bu ksmdaki konular: Blm 27 . ASP .NETe Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 28 . Web Formlar Dorulama Denetimlerini Anlamak . . . . . . . . . . . . . . . Blm 29 . Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blm 30 . Bir Web Servisi Yaratmak ve Kullanmak . . . . . . . . . . . . . . . . . . . . . . . . 559 587 597 623

Ksm VI

557

Blm 27

ASP .NETe Giri


Bu blm tamamladktan sonra renecekleriniz:
n n n n

Basit Microsoft ASP.NET sayfalar yaratmak. Bir Web taraycsnda alacak uygulamalar oluturmak. ASP.NET Server denetimlerini etkin biimde kullanmak. ASP.NET temalar yaratp uygulamak.

Bu kitabn nceki ksmlarnda, Microsoft Windows altnda masastnde alan Microsoft Visual C# uygulamalarnn nasl oluturulacan rendiniz. Bu uygulamalar ounlukla ADO.NET ve DLINQ kullanarak kullanclarn veritabanna erimelerini salar. Kitabn bu son ksmnda Web uygulamalarnn dnyasna gireceksiniz. Bunlar nternet zerinden eriilen uygulamalardr. Masastnz kullanmak yerine, Web uygulamalar bir kullanc arabirimi sunabilmek iin Web taraycnza dayanrlar. Bu ksmn ilk blmnde Microsoft .NET Framework tarafndan Web uygulamalar oluturmak iin salanan snflar inceleyeceksiniz. ASP.NETin mimarisi, Web formlar ve Server denetimleri hakknda bilgiler edineceksiniz. Web zerinde alan uygulamalarn yaplarnn masastnzde alanlardan farkl olduunu renecek, verimli, leklenebilir ve bakm kolay Web uygulamalar olutururken kullanacanz en iyi uygulamalar greceksiniz. Bu ksmdaki son blmde, Web servisleri hakknda bilgiler edineceksiniz. Web servisleri ile, nternet (ya da intranet) boyunca yaylabilen servisler ve bileenlerden oluan datlm uygulamalar oluturabilirsiniz. Bir Web servisinin nasl yaratlacan reneceksiniz ve Web servislerinin Simple Object Access Protocol (SOAP) zerinde nasl oluturulduklarn anlayacaksnz. Ayrca bir istemci uygulamasnn bir Web servisine balanmak iin kullanabilecei teknikleri de greceksiniz. nemli Microsoft Visual C# 2008 Express Edition ile Web uygulamalar ve Web servisleri oluturamazsnz. Visual C# 2008 Express Edition kullanyorsanz, kitabn geri kalan blmlerindeki altrmalar Microsoft Visual Web Developer 2008 Express Edition kullanarak altrabilirsiniz. Microsoft Web sitesinden Visual Web Developer 2008 Express Edition cretsiz olarak indirebilirsiniz.

559

560

Ksm VI

Web Uygulamalar Oluturmak

Bir Altyap Olarak nterneti Anlamak


nternet gerekten ok byk bir adr ve sonu olarak onun zerinden ulaabileceiniz bilgi ve veri olduka uzakta olabilir. Bunu uygulamalarnz tasarlarken dikkate almalsnz. rnein, bir kullanc veritabannzdaki kk, yerel bir masast uygulamasnda gezinirken veriyi kilitleyebilirsiniz, ama bu strateji nternet zerinden eriilen bir uygulamada pek de uygulanabilir deildir. Kaynak tketimi, yerel uygulamalar yerine nternette leklenebilirlii daha fazla etkiler. An geniliinin kendisi de tutumlu biimde kullanlmas gereken kt bir kaynaktr. Gnn saatlerine (alar genellikle her eyin hafta sonundan nce tamamlanmaya alld Cuma leden sonralar ok yavalar), irketinizdeki alanlarn kullandklar uygulamalara ve dier birok etkene bal olarak anzn performansnda oluan deiimleri fark etmisinizdir. Ama kendi yerel a performansnz ne kadar deiken olursa olsun nternet ok daha az nceden tahmin edilebilir. steinizi, Web taraycnzdan erimeye altnz siteye kadar ileten sunucularn saysna bamlsnzdr ve yantlar ayn derecede yava bir yoldan gelebilir. nterneti destekleyen a protokolleri ve veri sunum mekanizmalar, alarn gvenilir olmayabilecekleri (zamanla pek ou yle olacak) ve bir sunucuda alan bir uygulamaya ok saydaki iletim sistemlerinden biri zerinde alan ok sayda Web taraycsndan birini kullanan bir kullanc tarafndan eriilebilecei gereini yanstrlar.

Web Sunucu steklerini ve Yantlarn Anlamak


Bir Web taraycs, nternet zerinden bir Web uygulamas ile Hypertext Transfer Protocol (HTTP) kullanarak iletiim kurar. Uygulamalar, genellikle HTTP isteklerini okuyan ve bu istei yantlamak iin hangi uygulamann kullanlmas gerektiini belirleyen bir Web sunucusu zerinde alrlar. Bu balamda kullanlan uygulama (application) terimi biraz belirsiz bir terimdir; Web sunucusu bir ilemi yerine getirmek iin altrlabilir bir program harekete geirebilir ya da istei kendi i mant ya da baka biimlerde kendisi ileyebilir. stek ne ekilde ilenirse ilensin Web sunucusu istemciye yine HTTP kullanarak yant gnderir. Bir HTTP yantnn ierii genelde bir Hypertext Markup Language (HTML) sayfas olarak sunulur. HTML, birok taraycnn anlad ve grntlemeyi bildii bir dildir. Not Kullanclar tarafndan altrlan ve nternet zerinden baka uygulamalara erien
uygulamalar sklkla istemciler ya da istemci uygulamalar olarak adlandrlr.

Blm 27

ASP .NETe Giri

561

Durumu Ynetmek
HTTP balantsz bir protokoldr. Bunun anlam, bir istein (ya da yantn) tek bana bir veri paketi olduudur. Bir istemci ile bir Web sunucusu zerinde alan bir uygulama arasndaki basit bir alveri birok istek ierebilir. rnein, kullanc bir sayfa grntleyebilir, veri girebilir, baz dmeleri tklayabilir ve sonu olarak daha fazla veri girebilmesini salamak zere grntnn deimesini bekler. Bir istemci tarafndan bir sunucuya gnderilen her istek, ayn istemciden ya da ayn sunucuyu kullanan (belki de ayn uygulamay altran) baka istemcilerden gnderilen dier btn isteklerden ayrdr. Bir istemci istei genellikle bir tr balam ya da duruma gereksinim duyar. rnein, aadaki sk rastlanabilecek senaryoyu dnn. Kullanc bir Web uygulamas kullanarak satlan rnlere gz atabilir. Kullanc, her birini sanal alveri sepetine ekleyerek birden ok mal satn almak isteyebilir. Byle bir Web uygulamasnn kullanl bir zellii de alveri sepetinin o anki ieriini grntleyebilmesidir. Alveri sepetinin ierii (istemcinin durumu) nerede tutulmaldr? Bu bilgi Web sunucusunda tutulursa Web sunucusunun farkl HTTP isteklerini bir araya getirebilmesi ve hangi istein hangi istemciden geldiini belirlemesi gerekir. Bu uygulanabilir fakat istemci isteklerini durum bilgilerine uzlatrmak iin ek ilemler ve tabii ki bu istemci istekleri arasndaki durum bilgisini barndrmak iin bir tr veritaban gerekir. Bu yntemdeki olas bir sorun, bir kez durum bilgisi tutulduktan sonra istemcinin bu bilgiyi kullanan ya da silen baka bir istek gndereceine dair Web sunucusunun hibir garantisi olmamasdr. Web sunucusu, onu kullanan her istemci iin durum bilgisinin her bitini kaydetseydi, gerekten ok byk bir veritabanna gereksinim duyard! Baka bir seenek de durum bilgisini istemci makinede tutmaktr. Cookie Protocol, Web sunucularnn bilgileri istemci bilgisayar zerinde cookies (tanmlama bilgileri; (kk dosyalar) iinde nbellee almalar iin gelitirilmitir. Bu yaklamn dezavantaj, Web sunucusunun tanmlama bilgisine eriebilmesi iin uygulamann, verileri her HTTP isteinin bir paras olarak Web zerinden aktarlacak tanmlama bilgisi iinde dzenlemesinin gerekmesidir. Uygulamann ayrca tanmlama bilgilerinin boyutlarnn kk olduundan emin olmas gerekir. Tanmlama bilgilerinin en byk sorunlar, kullanclarn onlar devre d brakp Web taraycsnn kendi makinelerinde depolamasn engelleyebilmeleridir; bu da durum bilgisinin her kaydetme abasnn baarszlkla sonulanmasna neden olur.

ASP .NETi Anlamak


nceki blmde grdnz gibi Web uygulamalar oluturan ve altran btn yaplarn karlamas gereken gereklilikler vardr. Aadakileri salamaldr:
n n

Standart HTTPyi desteklemelidir. stemci durumunu verimli biimde ynetebilmelidir.

562

Ksm VI
n n n

Web Uygulamalar Oluturmak

Web uygulamalarnn kolay gelitirilebilmelerini salayan aralar sunmaldr. HTMLi destekleyen btn tarayclarn eriebilecekleri uygulamalar gelitirmelidir. Yant veren ve leklenebilir olmaldr.

Bu gereksinimlerin birounu karlamak iin Microsoft, Active Server Pages (ASP) modelini gelitirmiti. ASP, program gelitiricilerin uygulama kodunu HTML sayfalarna gmmelerini salamtr. Microsoft Internet Information Services (IIS) gibi bir Web sunucusu uygulama kodunu altrabilir ve onu bir HTML yant oluturmak iin kullanabilir. Ancak, balangta ASPnin de kendi sorunlar vard: Bir veritabanndan alnan verileri grntlemek gibi basit eyleri gerekletirmek iin bile ok fazla uygulama kodu yazmanz gerekirdi; uygulama kodu ile HTMLi kartrmak okunabilirlik ve bakm sorunlar yaratrd; ve performans her zaman olabilecei kadar yksek olmazd nk ASPnin, her gnderiliinde ayn kod bile olsa bir HTML isteindeki uygulama kodlarn yorumlamas gerekirdi. .NET Frameworkn ortaya k ile Microsoft, ASP modelini gncelletirdi ve ASP.NETi yaratt. ASP.NETin balca zellikleri unlardr:
n

Sunum mantn ieren Web formlarn ve i mantn ayr tutan kod dosyalarn kullanan gereki bir program modeli. Kodu, C# dahil, .NET Framework tarafndan desteklenen herhangi bir dil ile yazabilirsiniz. ASP.NET Web formlar derlenir ve performans artrmak iin Web sunucuda nbellee kaydedilir. Sunucu taraf olaylarn destekleyen ama btn HTML uyumlu tarayclarda doru biimde ilenmelerini salamak iin HTML haline getirilen sunucu denetimleri. Microsoft ayrca, kodunuzun iinde dzenlemenizi salayacak biimde, birok standart HTML denetimini de gelitirmitir. Veritabanndan alnan verileri grntlemek, dzenlemek ve bakmn yapmak iin gl veri denetimleri. Tanmlama bilgileri kullanarak istemci durumunu istemci bilgisayarnda, Web sunucusu stnde zel bir serviste (ASP.NET State servisi) ya da bir Microsoft SQL Server veritabannda nbellee almak iin seenekler. nbellee alnan bu durum bilgileri, kod kullanarak kolayca programlanabilir . Master Pages, Themes (temalar) ve Web Parts kullanarak gelitirilen sayfa tasarm ve dzeni. Bir uygulamadaki tm Web sayfalar iin hzla ortak bir dzen salamak iin Master Pagesi kullanabilirsiniz. Themes ise gerekirse tm denetimlerin ayn biimde grnmelerini salayarak Web sitesinde tutarl bir grnm ve hava yaratmanza yardmc olur. Web Parts, kullanclarn kendi gereksinimleri dorultusunda zelletirebilecei kalc Web sayfalar oluturmanza olanak verir. Bu blmde daha sonra temalar kullanacaksnz. Ancak, Master Pages ve Web Parts kullanmak bu kitabn kapsam dndadr. Veriyi Web sayfalarna balamak iin yeni veri kayna denetimleri. Bu yeni denetimleri kullanarak, veriyi hzla ve kolayca grntleyip dzenleyebilen uygulamalar oluturabilirsiniz. Veri kayna denetimleri DLINQ varlk nesneleri, SQL Server

Blm 27

ASP .NETe Giri

563

veritabanlar, Microsoft Access veritabanlar, XML dosyalar, Web servisleri ve dier i nesneleri gibi eitli veri kaynaklaryla alabilir. Veri kayna denetimleri, veri kaynandan bamsz olarak, size veriyle almak iin tutarl bir dzenek salar. Blm 29da veri kayna denetimlerinden yararlanacaksnz.
n

Veriyi grntlemek ve dzenlemek iin gl denetimler. Microsoft her seferinde bir kayt olmak zere veriyi dzenlemek ve veriyi grntlemek iin FormView denetimi ve blme biiminde bilgiyi sunmak iin GridView denetimini salar. Hiyerarik veriyi grntlemek iin TreeView grnmn kullanabilirsiniz. Ve SiteMapPath ile Menu denetimlerini Web uygulamanzda gezinen kullancya yardmc olmak iin kullanabilirsiniz. GridView denetimini Blm 29da kullanacaksnz. stemci uygulamas ile Web sunucu arasndaki veri iletimi iin gerekli a bant geniliini en aza indirebilen yksek derecede etkileimli ve karlk veren Web uygulamalar oluturabilmeniz iin AJAX uzantlar. AJAX kullanarak, Web sayfasnn ksmlarn gncellenebilir olarak tanmlayabilirsiniz. Sayfann gncellenebilir ksmnda grntlenen bilgi deitiinde, sadece sayfann o ksm iin gerekli bilgi Web sunucusu tarafndan aktarlr. Kullanc kimlik dorulamas ve yetkilendirmesi iin yerleik destek ieren gelimi gvenlik zellikleri. Kullanclarn Web uygulamanza eriebilmesine kolayca izin verebilir, oturum amaya alan kullanclar dorulayabilir ve Web sitenize kimin eritiini bilebilmeniz iin kullanc bilgisini sorgulayabilirsiniz. Kullancnn kimlik bilgilerini istemek ve bunlar dorulamak iin Login, kullanclarn parolalarn anmsamalarna ya da sfrlamalarna yardmc olmak iin PasswordRecovery denetimlerini kullanabilirsiniz. Bu gvenlik denetimlerini Blm 29da kullanacaksnz ASP.NET Web Administration Toolu kullanarak Web sitesi yaplandrmas ve ynetimi. Bu ara ASP.NET Web uygulamalarn yaplandrmak ve gvenceye almak iin sihirbazlar salar. ASP.NET Web Site Administration Toolu Blm 29da kullanacaksnz.

Bu blmn geri kalannda bir ASP.NET uygulamasnn yaps hakknda daha fazla ey reneceksiniz.

ASP.NET ile Web Uygulamalar Yaratmak


ASP.NET kullanan bir Web uygulamas tipik olarak bir ya da daha ok ASP.NET sayfas ya da Web formu, kod dosyalar ve yaplandrma dosyalarndan oluur. Bir Web formu, temelde, Microsoft.NETe zel baz etiketler ieren bir HTML dosyas olan bir .aspx dosyasnda tutulur. Bir .aspx dosyas, bir sayfann grnmn ve dzenini tanmlar. Genellikle, her .aspx dosyasnn, olay ileyicileri ve yardmc yntemler gibi .aspx dosyasndaki bileenler iin uygulama mantn ieren ilgili bir kod dosyas vardr. Her .aspx dosyasnn bandaki bir etiket (tag) ya da bir ynerge, ilgili kod dosyasnn adn ve yerini belirtir. ASP.NET ayrca, Global.asax dosyalarnda tanmlanan uygulama dzeyi olaylarn da destekler.

564

Ksm VI

Web Uygulamalar Oluturmak

Her Web uygulamasnn Web.config adl bir yaplandrma dosyas vardr. XML biiminde olan bu dosya, gvenlik, nbellek ynetimi, sayfa derlenmesi vb. gibi ilemleri ilgilendiren bilgileri ierir.

Bir ASP .NET Uygulamas Oluturmak


imdiki altrmada, Litware adnda kurmaca bir yazlm irketinin alanlar hakkndaki bilgileri kullancdan almak iin Server denetimlerini kullanan basit bir ASP.NET uygulamas oluturacaksnz. Uygulama size tipik bir Web uygulamasnn yapsn gsterecek. Not Web uygulamalar gelitirmek iin bilgisayarnzda IISin alyor olmas gerekmez.

Microsoft Visual Studio 2008 kendi Development sunucusunu ierir. Bir Web uygulamas oluturup altrdnzda, varsaylan ayar olarak, Visual Studio 2008 uygulamay bu sunucuyu kullanarak altrr. Ancak, gelitirme ve snamay bitirdikten sonra retim Web uygulamalarn bulundurmak iin yine IIS kullanmanz gerekir.

Web uygulamasn yaratn


1. Visual Studio 2008 ya da Visual Web Developer 2008 Express Edition balatn. Not Kitabn geri kalannda, Visual Studio 2008 Standard Edition, Visual Studio 2008

Professional Edition ya da Visual Web Developer 2008 Express Edition amanz gerektiinde, bu ilem basite Visual Studio 2008i balat olarak ifade edilmitir. Ayrca, aka belirtilmedike, Visual Studio 2008e yaplan tm bavurular ayn zamanda Visual Web Developer 2008 Express Editiona da uygulanr.

2. Visual Studio 2008 kullanyorsanz, File mensnde, Newi tklayn ve sonra Web Site tklayn. 3. Visual Web Developer 2008 Express Edition kullanyorsanz File mensnde New Web Site tklayn. 4. New Web Site iletiim kutusunda, ASP.NET Web Site ablonunu tklayn. Location liste kutusunda File Systemi sein ve Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 27\Litware klasrn belirleyin. Language olarak Visual C# ayarlayn ve sonra OKi tklayn.

Blm 27

ASP .NETe Giri

565

Not Location File System olarak ayarlamak, Development Server sunucusunu kullanarak Web sitesi oluturur. Location HTTP olarak ayarlayarak ve bir dosya ad yerine yaratmak istediiniz Web Sitesi URLsini belirterek IIS de kullanabilirsiniz. Visual Studio 2008, App_Data adl bir Web klasr ile Default.aspx adl bir Web formu ieren bir uygulama yaratr. Varsaylan sayfann HTML kodu Code and Text Editor penceresinde grnr. 5. Solution Explorerda Default.aspx dosyasn sein. Properties penceresinde Default.aspx dosyasnn File Name zelliini EmployeeForm.aspx olarak deitirin. Not Properties penceresi, CSS Properties penceresi, Manage Styles penceresi ve Apply

Styles penceresi ile Visual Studionun sa alt kesindeki ayn blmeyi paylar. Varsaylan ayar olarak CSS Properties penceresi grntlenir. Properties penceresine bakmak iin, bu blmenin altnda bulunan Properties sekmesini tklayn.

6. Formun Design View grnmn grntlemek iin Code and Text Editor penceresinin altndaki Design dmesini tklayn. Design View penceresi neredeyse botur. (Formun en stnde bo bir <DIV> esi vardr.) Design View penceresinde Toolboxtan Web formunun zerine denetimler srkleyebilirsiniz; Visual Studio 2008 uygun HTMLi sizin iin oluturur. Bu, formu Source View penceresinde izlediinizde grdnz HTMLdir. sterseniz HTMLi dorudan da dzenleyebilirsiniz. imdiki altrmada form tarafndan kullanlacak bir stil tanmlayacak ve formu ilevsel klmak iin ona denetimler ekleyeceksiniz. Bir stil kullanmak form zerindeki tm denetimlerin ortak

566

Ksm VI

Web Uygulamalar Oluturmak

bir grnme ve havaya (renk ve yaz tipi gibi) sahip olduundan emin olmanz salamann yan sra formun arka plan rengi gibi eleri ayarlamanz salar.

Web formunu oluturun


1. Website mensnde, Add Existing Item i tklayn. Add Existing Item iletiim kutusunda, Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 27 klasrne gidin, Computer.bmp dosyasn tklayn ve Addi tklayn. Bu dosya, Web formunuzun arka plannda grntlenecek resmi ierir. 2. Design View penceresindeki formu tklayn. Properties penceresinde, DOCUMENT nesnesinin Title zelliini Employee Information olarak deitirin. Title zellii iin belirlediiniz deer, Web uygulamasn altrdnzda Web taraycsnn balk ubuunda grnr. Not Properties penceresi, DOCUMENT yerine <DIV> esi iin zellikleri grntlerse,
Properties penceresinin en stndeki listeden DOCUMENT sein.

3. Properties penceresinin altndaki Manage Styles sekmesini tklayn. Manage Styles penceresinde New Style balantsn tklayn. New Style iletiim kutusu alr. Formun stilini yaratmak iin bu iletiim kutusunu kullanabilirsiniz.

Blm 27

ASP .NETe Giri

567

4. font-family alr liste kutusunda, Arial tklayn. 5. color alr listesinde, ikinci satrdaki koyu mavi kareyi sein. Renk kutusunda #0000FF deeri grnmelidir. 6. Category liste kutusunda Background tklayn. 7. background-image alr kutusunun bitiiindeki Browse dmesini tklayn. Picture iletiim kutusunda, computer.bmp dosyasn tklayn ve sonra da OKi tklayn. background-image alr kutusunda url(computer.bmp) deeri yer alr. 8. Category liste kutusunda Position tklayn. 9. height alr kutusuna 500 yazn. 10. Selector alr kutusundaki iletiim kutusunun st ksmna .employeeFormStyle (ndeki nokta iaretini yazdnzdan emin olun) yazn, Apply new style to document selection onay kutusunu iaretleyin ve sonra OKi tklayn. Design View penceresinde, Web form arka plandaki resmi grntler. 11. Toolbox grntleyin ve denetimin Standard kategorisinin geniletilmi olduundan emin olun. Toolbox, ASP.NET formlar zerine srkleyebileceiniz denetimler ierir. Bu denetimler birok ynden, imdiye kadar Microsoft Windows Presentation Foundation (WPF) formlar yaratrken kullanmakta olduunuz denetimlere benzer. Fark, bu denetimlerin bir HTML ortamnda alacak biimde tasarlanm olmalar ve alma annda normal HTML etiketlerine dntrlyor olmalardr. 12. Toolboxtan Web form zerine drt Label ve TextBox denetimi ekleyin. Denetimlerin Web formunun stili tarafndan belirtilen yaz tipi ve renkleri nasl aldklarna dikkat edin. Not Design View penceresinde soldan saa ak yerleimi kullanlarak denetimler otomatik olarak konumlandrlr. Henz bunlarn konumlar konusunda endielenmeyin nk zelliklerini ayarladktan sonra bunlar tayacaksnz.

Not Bir Label denetimi kullanmann yan sra, metni bir Web sayfasna dorudan da yazabilirsiniz. Ancak, bu metni o kadar kolay biimlendiremez, zelliklerini ayarlayamaz ya da ona temalar uygulayamazsnz. Franszca ya da Almanca gibi farkl dil destei salamas gereken bir Web sitesi oluturuyorsanz Label denetimlerini kullann, nk bylelikle Resource dosyalar kullanarak bunlarn grntledii metinleri daha kolay yerelletirebilirsiniz. Ayrntl bilgi iin Microsoft Visual Studio 2008 belgelerindeki Resources in ASP.NET Applications balna bakn.

568

Ksm VI

Web Uygulamalar Oluturmak

13. Properties penceresini kullanarak bu denetimlerin zelliklerini aadaki tabloda gsterilen deerlere ayarlayn.
Denetim
Label1

zellik
Font Bold (Font zelliini genilet) Font Name Font Size Text Height Width

Deer
True Arial Black X-Large Litware, Inc. Software Developers 36px 630px First Name Last Name Employee Id firstName 24px 230px lastName 24px 230px employeeID 24px 230px

Label2 Label3 Label4 TextBox1

Text Text Text (ID) Height Width

TextBox2

(ID) Height Width

TextBox3

(ID) Height Width

14. Design View penceresinin altndaki Source dmesini tklayn. Aadaki gibi formun HTML tanmn ve Code and Text Editor penceresinde stili grmelisiniz. (Sayfaya smas iin koddaki baz satrlar paralanm olabilir):
<%@ Page Language=C# AutoEventWireup=true CodeFile=EmployeeForm.aspx.cs Inherits=_Default %> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml> <head runat=server> <title>Employee Information</title> <style type=text/css> .employeeFormStyle { font-family: Arial; color: #0000FF;

Blm 27
background-image: url(computer.bmp); height: 500px; } </style> </head> <body> <form id=form1 runat=server> <div class=employeeFormStyle> <asp:Label ID=Label1 runat=server Font-Bold=True Font-Names=Arial Black Font-Size=X-Large Height=36px Text=Litware, Inc. Software Developers Width=630px></asp:Label> <asp:Label ID=Label2 runat=server Text=First Name></asp:Label> <asp:Label ID=Label3 runat=server Text=Last Name></asp:Label> <asp:Label ID=Label4 runat=server Text=Employee Id></asp:Label> <asp:TextBox ID=firstName runat=server Height=24px Width=230px></asp:TextBox> <asp:TextBox ID=lastName runat=server Height=24px Width=230px></asp:TextBox> <asp:TextBox ID=employeeID runat=server Height=24px Width=230px></asp:TextBox> </div> </form> </body> </html>

ASP .NETe Giri

569

15. Label1 denetiminin HTML kodunu deitirin ve form zerinde konumunu belirlemek iin aadaki gibi bir Style znitelii ekleyin:
<asp:Label ID=Label1 ... Style=position: absolute; left: 96px; top: 24px></asp:Label>

Style zniteliinin position zelliini absolute olarak ayarlayarak, denetimlerin konumunu, Visual Studio 2008in otomatik olarak atamas yerine, kendiniz belirleyebilirsiniz. pucu Design View penceresini kullandnzda Format mens zerindeki komutlar kullanarak, denetimlerin aralklarn, hizalamasn ve yerleimini belirleyebilirsiniz. 16. Dier etiket ve metin kutusu denetimlerinin HTML kodunu dzenleyin ve aada gsterildii gibi, Web formu zerindeki konumlarn ayarlamak iin Style znitelikleri ekleyin:
<asp:Label ID=Label2 ... Style=position: absolute; left: 62px; top: 104px></asp:Label> <asp:Label ID=Label3 ... Style=position: absolute; left: 414px; top: 104px></asp:Label> <asp:Label ID=Label4 ... Style=position: absolute; left: 62px; top: 168px></asp:Label> <asp:TextBox ID=firstName ... Style=position: absolute; left: 166px; top: 102px></asp:TextBox>

570

Ksm VI

Web Uygulamalar Oluturmak

<asp:TextBox ID=lastName ... Style=position: absolute; left: 508px; top: 102px></asp:TextBox> <asp:TextBox ID=employeeID ... Style=position: absolute; left: 166px; top: 166px></asp:TextBox>

17. Pencerenin alt ksmndaki Design dmesini tklayn. Web formu, Design View penceresinde u ekilde grnmelidir:

18. Web formuna bir tane daha Label ve drt tane RadioButton denetimi ekleyin. Properties penceresini kullanarak, bu denetimlerin zelliklerini aadaki tabloda gsterilen deerlere ayarlayn. Denetimlerin formun st ksmnda bir satr zerinde grndne dikkat edin. Konumlarn bir sonraki basamakta ayarlayacaksnz.
Denetim
Label5 RadioButton1

zellik
Text (ID) Text TextAlign GroupName Checked

Deer
Position workerButton Worker Left positionGroup True bossButton Boss Left positionGroup False vpButton Vice President Left

RadioButton2

(ID) Text TextAlign GroupName Checked

RadioButton3

(ID) Text TextAlign

Blm 27

ASP .NETe Giri

571

Denetim

zellik
GroupName Checked

Deer
positionGroup False presidentButton President Left positionGroup False

RadioButton4

(ID) Text TextAlign GroupName Checked

GroupName zellii, bir seenek dmeleri kmesinin nasl gruplandn belirler; ayn GroupNamee sahip seenek dmeleri ayn gruba dahildirler ve ilerinden yalnzca biri seilebilir. 19. Design View penceresinin alt ksmndaki Source dmesini tklayn ve aada gsterildii gibi bu denetimlerin konumunu ayarlayn:
<asp:Label ID=Label5 ... Style=position: absolute; left: 86px; top: 224px> </asp:Label> <asp:RadioButton ID=workerButton ... Style=position: absolute; left: 192px; top: 224px/> <asp:RadioButton ID=bossButton ... Style=position: absolute; left: 206px; top: 260px/> <asp:RadioButton ID=presidentButton ... Style=position: absolute; left: 174px; top: 332px/> <asp:RadioButton ID=vpButton ... Style=position: absolute; left: 138px; top: 296px/>

20. Design dmesini tklayn, daha sonra Web formuna baka bir Label denetimi ve bir DropDownList denetimi ekleyin. Bu denetimlerin zelliklerini aadaki tabloda gsterilen deerlere ayarlayn.
Denetim
Label6 DropDownList1

zellik
Text (ID) Width

Deer
Role positionRole 230px

positionRole alr listesi, bir alann irkette olabilecei farkl pozisyonlar grntleyecektir. Bu liste alann pozisyonuna gre deiecektir. Bu listeyi dinamik olarak dolduracak kodu yazacaksnz. 21. Source dmesini tklayn ve bu denetimlerin konumunu ayarlamak iin aada gsterilen HTML kodunu ekleyin:
<asp:Label ID=Label6 ... Style=position: absolute; left: 456px; top: 224px> </asp:Label> <asp:DropDownList ID=positionRole ... Style=position: absolute; left: 512px; top: 224px></asp:DropDownList>

572

Ksm VI

Web Uygulamalar Oluturmak

22. Design dmesini tklayn, forma iki Button denetimi ve baka bir Label denetimi ekleyin. Bu denetimlerin zelliklerini aadaki tabloda gsterilen deerlere ayarlayn.
Denetim
Button1

zellik
(ID) Text Width

Deer
saveButton Save 75px clearButton Clear 75px infoLabel leave blank 48px 680px

Button2

(ID) Text Width

Label7

(ID) Text Height Width

Bu dmelerin olay ileyicilerini bir sonraki altrmada yazacaksnz. Save dmesi kullanc tarafndan girilen bilgileri sraya koyacak ve formun en altndaki InfoLabelda grntleyecek. Clear dmesi ise metin kutularn temizleyecek ve dier denetimleri varsaylan deerlerine dndrecek. 23. Source dmesini tklayn ve bu denetimlerin her biri iin aada gsterilen HTML kodu ekleyin:
<asp:Button ID=saveButton ... Style=position: absolute; left: 328px; top: 408px/> <asp:Button ID=clearButton ... Style=position: absolute; left: 424px; top: 408px/> <asp:Label ID=infoLabel ... Style=position: absolute; left: 62px; top: 454px> </asp:Label>

24. Design dmesini tklayn. Tamamlanm form aadaki resimdeki gibi grnmelidir:

Blm 27

ASP .NETe Giri

573

Web formunu snayn:


1. Debug mensnde Start Debuggingi tklayn. Debugging Not Enabled ileti kutusunda, Modify the Web.config file to enable debuggingi ve sonra OKi tklayn. Script Debugging Disabled ileti kutusu grnrse, Yesi tklayn. Visual Studio 2008 uygulamay oluturur, ASP.NET Development Server ve ardndan Windows Internet Explorer balar ve formu grntler. pucu Internet Explorer, Web formu yerine dosyalarn bir listesini grntlerse, Internet
Explorer kapatn ve Visual Studio 2008e dnn. Solution Explorerda, EmployeeForm. aspxi farenin sa dmesiyle tklayn ve daha sonra Set As Start Pagei tklayn. Web uygulamasn tekrar altrn.

Not Start Debugging komutunu kullanarak bir Web sitesini ilk kez altrdnzda, hata ayklamann etkin olmadn bildiren bir ileti kutusu grrsnz. Hata ayklamay etkinletirmek iin Run without debugging ya da Modify the Web.config file to enable debugging seeneini seebilirsiniz. Hata ayklama kipinde almak balang iin yararldr, nk Blm 3te anlatld gibi, hata ayklaycy kullanarak kesme noktalar ayarlayabilir ve kod iinde adm adm ilerleyebilirsiniz. Ancak, hata ayklamay etkinletirmek uygulamay yavalatr ve uygulamay bir retim Web sitesine datmadan nce kapatlmas gerekir. web.config dosyasn dzenleyerek ve compilation esinin debug zniteliini ayarlayarak bunu yapabilirsiniz:
<compilation debug=false> <assemblies> ... </assemblies> </compilation>

2. Hayali bir irket alan iin bilgiler girin. Seenek dmelerinin, her seferinde yalnzca biri seilecek biimde olup olmadklarn denetleyin. Role liste kutusundaki aa oku tklayn; bu liste botur. Save ve Clear dmelerini tklayn ve formun yeniden grntlenmesinden baka bir ey yapmadn dorulayn. 3. Internet Explorer kapatn ve Visual Studio 2008e dnn.

574

Ksm VI

Web Uygulamalar Oluturmak

Bir Web Sitesini IISye Datmak


Visual Studio 2008 ve Visual Web Developer 2008 Express Editionda bulunan kullanl bir zellik, Website mensnde bulunan ve bir Web sayfasn bir yerden baka bir yere kopyalayan Copy Web Site komutudur. Bu zellii, ASP.NET Development Server kullanlarak oluturulmu ve snanm bir Web sitesini hzla bir retim IIS sitesine datmak iin kullanabilirsiniz. (nce, Internet Information Services ynetim konsolunu kullanarak bir Web sayfas ya da bo bir sanal dizin yaratmanz gerekir.) Aadaki resim bu zellii gstermektedir.

retim IIS sitesindeki sanal dizine balanabilir ve ardndan dosyalar seip ayr ayr retim Web sitesine kopyalayabilir ya da Web sitesinden bunlar kopyalayabilir veya Web siteleri arasndaki dosyalar eitleyebilirsiniz. Not Windows Vista iletim sistemi kullanyorsanz, Copy Web Site penceresinde, IISe
balanmak iin Ynetici hesab kullanarak Visual Studio 2008i altrmanz gerekir.

Blm 27

ASP .NETe Giri

575

Sunucu Denetimlerini Anlamak


Forma eklediimiz Web formlar denetimleri genel olarak Sunucu denetimleri olarak bilinirler. Sunucu denetimleri herhangi bir Web sayfasnda kullanabileceiniz normal HTML elerine benzer ancak ok daha fazla programlanabilirler. Birok Sunucu denetimi, sunucu zerinde alan kodun altrabilecei ve alma annda dinamik olarak deitirilebilecei olay ileyicilerini, yntemleri ve zellikleri ierir. imdiki altrmalarda Sunucu denetimlerini programlamak hakknda daha fazla ey reneceksiniz.

Bir Sunucu denetimini inceleyin


1. EmployeeForm.aspxi grntleyen Design View penceresinde, Source dmesini tklayn. 2. Formun HTML kodunu inceleyin. lk Label denetiminin tanmna daha ayrntl bakn (aadaki kod tanm daha okunur yapmak iin hazrlanmtr):
<asp:Label ID=Label1 runat=server Font-Bold=True Font-Names=Arial Black Font-Size=X-Large Height=36px Text=Litware, Inc. Software Developers Width=630px Style=position: absolute; left: 96px; top: 24px></asp:Label>

Gzlenmesi gereken birka ey vardr. lk olarak, denetimin trne bakn: asp:Label . Btn Web form denetimleri asp ad alannda bulunur, nk bu Microsoft tarafndan tanmlandklar biimdir. Dikkate deer ikinci bileen runat=server zniteliidir. Bu znitelik, denetime Web sunucusu zerinde alan kod tarafndan programatik olarak eriilebileceini belirtir. Bu kod, bu denetimin btn deerlerini sorgulayabilir ve deitirebilir (rnein metnini deitirebilir).

HTML Denetimleri
ASP.NET, HTML denetimlerini de destekler. Toolboxta HTML sekmesini tklarsanz denetimlerin listesini grrsnz. Bunlar Microsoftun zgn ASP modeli ile birlikte sunduu denetimlerdir. Var olan ASP sayfalarnz kolayca ASP.NETe dntrebilmesi iin salanmtr. Ancak, sfrdan bir uygulama gelitiriyorsanz bunlarn yerine Standart Web Forms denetimlerini kullanmalsnz. HTML denetimlerinin de, bu denetimler iin olay ileyici kodun nerede alacan belirleyebilmenizi salayan, runat znitelikleri vardr. Web Forms denetimlerinden farkl olarak, HTML denetimlerinin kod oluturmas iin varsaylan alma yeri sunucu deil taraycdr (kullancnn taraycsnn bu ilevsellie sahip olduu varsaylr).

576

Ksm VI

Web Uygulamalar Oluturmak

EmployeeForm.aspx sayfas, aadaki ilevsellikleri eklemenizi gerektirir:


n

Kullanc bir pozisyon (Worker, Boss, Vice President, President) setiinde PositionRole alr listesini doldurmak. Kullanc Save dmesini tkladnda girilen bilgileri kaydetmek. Kullanc Clear dmesini tkladnda formu temizlemek.

n n

Bu ilevsellikleri olay ileyicileri yazarak gerekletireceksiniz. Not Aadaki altrmada ekleyeceiniz yntemler, eitli roller ve altrabilecekleri grevler iin kodda yazlm deerleri kullanr. Profesyonel uygulamada, bu tr bilgiyi bir veritabannda saklamal ve eitli rolleri ve ilikili grevleri veritabanndan elde etmek iin ADO.NET ya da DLINQ gibi teknolojileri kullanmalsnz. Blm 29da ASP.NET Web uygulamas ile DLINQyu nasl kullanacanz greceksiniz.

Sunucu denetimi olaylarn ileyin


1. Solution Explorerda, EmployeeForm.aspx dosyasn geniletin. EmployeeForm.aspx.cs dosyas grnr. Bu, yazdnz olay ileyicileri iin C# kodunu ierecek olan dosyadr. Bu dosya bir kodun gerisindeki dosya (code-behind file) olarak bilinir. ASP.NETin bu zellii C# kodunu bir Web uygulamasnn grntleme mantndan ayrmanz salar. (Aslnda Source View penceresini kullanarak EmployeeForm.aspx dosyasnda C# kodu ve olay ileyicileri yazabilirsiniz, ancak bu yaklam nerilmemektedir). 2. EmployeeForm.aspx dosyasnn kaynak grnmn grntleyen Code and Text Editor penceresinde, dosyann ilk satrn inceleyin. Aadaki metni ierir:
<%@ Page Language=C# ... CodeFile=EmployeeForm.aspx.cs ... %>

CodeFile ynergesi, Web formunun program kodunu ieren dosyay ve yazld dili (bu durumda C#) belirtir. Desteklenen dier diller ise Microsoft Visual Basic ve JScripttir. 3. Solution Explorerda EmployeeForm.aspx.cs dosyasn ift tklayn. Dosya Code and Text Editor penceresinde grnr. Dosyann en stnde bir grup using ifadesi vardr. Bu dosyann System.Web ad alann ve alt ad alanlarn (buras ASP.NET snfnn bulunduu yerdir) ok fazla kullandna dikkat edin. Ayrca, kodun kendisinin de System.Web.UI.Pageden, (bu btn Web Formlarnn devrald snftr) devralan _Default adl snfn iinde olduuna da dikkat edin. u anda Page_Load adl tek bo bir yntem ierir. Bu yntem, sayfa grntlenince alr. Formun gerektirdii veriyi balatmak iin bu yntem iinde kod yazabilirsiniz.

Blm 27

ASP .NETe Giri

577

4. _Default snfna Page_Load ynteminden sonra initPositionRole adl bir yntem ekleyin:
private void initPositionRole() { }

Bu yntemi, positionRole alr listesini varsaylan deerleriyle doldurmak iin kullanacaksnz. 5. Aadaki ifadeleri initPositionRole yntemine ekleyin:
private void initPositionRole() { positionRole.Items.Clear(); positionRole.Enabled = true; positionRole.Items.Add(Analyst); positionRole.Items.Add(Designer); positionRole.Items.Add(Developer); }

lk ifade listeyi temizler. kinci ifade listeyi etkinletirir (baz durumlarda bu denetimi devre d brakan kodu az sonra yazacaksnz). Geri kalan ifade, iilere uygun rol ekler. 6. Aadaki ifadeyi Page_Load yntemine ekleyin:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { initPositionRole(); } }

Bu kod blou, form, kullancnn taraycsnda grnnce positionRole alr listesinin doldurulmasn salar. Bununla birlikte, Web sunucusunun formu kullancnn taraycsna yalnz ilk seferde deil her gnderiinde Page_Load ynteminin alacana dikkat edin. rnein, kullanc bir dmeyi tklaynca form, ilenmek zere Web sunucusuna geri gnderilebilir; Web sunucusu ilem tamamlandktan sonra grntlenmek zere formu taraycya geri gnderir. Sayfann her grntlenmesinde balamasn istemeyebilirsiniz, nk bu bir bilgi ileme israfdr ve zellikle ticari bir Web sitesi oluturuyorsanz performans sorunlarna yol aabilir. Sayfa ilk kez grntlendii iin Web sayfasnn IsPostBack zelliini sorgulayarak Page_Load ynteminin alp almadn belirleyebilirsiniz. Sayfa ilk grntlendiinde bu zellik false dndrr ve kullanc bir denetimi tklad iin sayfa yeniden grntlenirse true dndrr. Form ilk kez grntlendiinde eklediiniz kodda yalnzca initPositionRole yntemini arrsnz.

578

Ksm VI

Web Uygulamalar Oluturmak

7. EmployeeForm.aspx dosyasna gein ve Design dmesini tklayn. Worker seenek dmesini sein. Properties penceresi ara ubuunda Events ara ubuu dmesini tklayn. CheckChanged olayn ift tklayn. Bu olay, kullanc seenek dmesini tkladnda ve deeri deitiinde oluur. Visual Studio 2008 bu olay ilemek iin workerButton_CheckedChanged yntemini oluturur. Not ASP.NET Web uygulamasnn Properties penceresi, bir WPF uygulamas

oluturduunuzda mevcut olmayan ek zellikler salar. Bu zellikler, bir denetim iin mevcut olan olaylar listelemenize ve bir olay ileyici belirlemenize imkan salar. Bir WPF uygulamas yarattnzda, bu ilevsellik sadece bir denetim iin Extensible Application Markup Language (XAML) kodunu dzenlediinizde mmkndr.

8. Code and Text Editor penceresinde, workerButton_CheckedChanged olay yntemine aada gsterilen ifadeyi ekleyin:
protected void workerButton_CheckedChanged(object sender, EventArgs e) { initPositionRole(); }

positionRole alr listesinin varsaylan deerlerinin ici iin olduunu hatrlayn. Dolaysyla, listeyi balatmak iin ayn yntem yeniden kullanlabilir. 9. Design View penceresinde EmployeeForm.aspx dosyasna gein. Boss seenek dmesini sein ve CheckedChanged olay iin bossButton_CheckChanged adl bir olay yntemi yaratmak iin Properties penceresini kullann. Form Code and Text Editor penceresinde grntlendiinde BossCheckedChanged yntemine aadaki ifadeleri ekleyin:
protected void bossButton_CheckedChanged(object sender, EventArgs e) { positionRole.Items.Clear(); positionRole.Enabled = true; positionRole.Items.Add(General Manager); positionRole.Items.Add(Project Manager); }

Bunlar, bir yneticinin alabilecei pozisyonlardr. 10. Design View penceresinde EmployeeForm.aspx dosyasna gein. Vice President seenek dmesinin CheckedChanged olay iin bir olay ileyicisi yaratn. Code and Text Editor penceresinde, vpButton_CheckedChanged olay yntemine aadaki ifadeleri ekleyin:
protected void vpButton_CheckedChanged(object sender, EventArgs e) { positionRole.Items.Clear(); positionRole.Enabled = true;

Blm 27
positionRole.Items.Add(VP positionRole.Items.Add(VP positionRole.Items.Add(VP positionRole.Items.Add(VP } Sales); Marketing); Production); Human Resources);

ASP .NETe Giri

579

11. Design View penceresinde EmployeeForm.aspx dosyasna gein. President seenek dmesinin CheckedChanged olay iin bir olay ileyicisi yaratn. presidentButton_ CheckedChanged olay yntemine aadaki ifadeleri ekleyin:
protected void presidentButton_CheckedChanged(object sender, EventArgs e) { positionRole.Items.Clear(); positionRole.Enabled = false; }

irketin bakanna hibir rol uygulanamayacandan alr liste temizlenir ve devre d braklr. 12. EmployeeForm.aspx formunu grntleyen Design View penceresine gein ve Save dmesinin Click olay iin bir olay yntemi yaratn. Bu yntem genellikle bilgileri bir veritabanna kaydetmek iin kullanlr ama bu uygulamay basit tutmak iin yntem, girilen bilgilerin bir ksmn InfoLabel denetiminde grntleyecektir. saveButton_Click olay yntemine aadaki ifadeleri ekleyin:
protected void saveButton_Click(object sender, EventArgs e) { String position = ; if (workerButton.Checked) position = Worker; if (bossButton.Checked) position = Manager; if (vpButton.Checked) position = Vice President; if (presidentButton.Checked) position = President; infoLabel.Text = Employee:&nbsp + firstName.Text + &nbsp + lastName.Text + &nbsp&nbsp&nbsp&nbspId:&nbsp + employeeID.Text + &nbsp&nbsp&nbsp&nbspPosition:&nbsp + position; }

&nbsp karakteri, HTMLde bo olmayan aralk (non-breaking space) anlamna gelir; ilk beyaz bo karakterden sonraki normal beyaz bo karakterler tarayc tarafndan yok saylacaktr. 13. Ayn teknii kullanarak, Clear dmesinin Click olay iin bir olay yntemi yaratn. Ynteme aadaki kod blounu ekleyin:
protected void clearButton_Click(object sender, EventArgs e) { firstName.Text = ; lastName.Text = ;

580

Ksm VI

Web Uygulamalar Oluturmak


employeeID.Text = ; workerButton.Checked = true; bossButton.Checked = false; vpButton.Checked = false; presidentButton.Checked = false; initPositionRole(); infoLabel.Text = ;

Bu kod, kullanc tarafndan girilen bilgileri temizler ve rol Worker (varsaylan deer) olarak sfrlar. Not Gruptaki sadece bir seenek dmesinin Checked zellii true olarak ayarlanabilse

de, ASP.NET kullancnnn Web taraycsnda formu yenilediinde, seilen doru dmenin grntlendiinden emin olmak iin, geri kalan dmelerin Checked zelliini false olarak ayarlamak gerekir.

Web formunu yeniden snayn


1. Web formunu yeniden altrmak iin Debug mensnde, Start Debuggingi tklayn. 2. Internet Explorerda Web formu grndnde, bir alan ad ve numaras (uydurarak) yazn. Role alr listesini tklayn. Bir ii iin roller listelenir. 3. Hayali alannzn pozisyonunu Vice President olarak deitirip Role alr liste kutusunu yeniden tklayn. Listenin deimediine, hala ii rollerini grntlediine dikkat edin. Liste deimedi, nk Vice President seenek dmesinin CheckedChanged olay tetiklenmedi. 4. Internet Explorer kapatn ve Visual Studio 2008e dnn. 5. EmployeeForm.aspxi Design Viewde grntleyin ve worker-Button seenek dmesini sein. Properties penceresinde AutoPostBack zelliini True yapn. pucu Properties penceresi seenek dmesi iin olaylarn listesini grntlyorsa,

Properties pencere ara ubuundaki Events dmesinin yanndaki Properties dmesini tklayn.

Blm 27

ASP .NETe Giri

581

Kullanc bu seenek dmesini tkladnda form ilenmek iin sunucuya geri gnderilir, CheckedChanged olay tetiklenir ve form bu seenek dmesi iin rolleri grntleyecek biimde gncellenir. Gereksiz a trafiinden saknmak iin varsaylan ayar olarak AutoPostBack zellii False olarak ayarlanmtr. 6. Dier seenek dmeleri (bossButton, vpButton ve presidentButton) iin AutoPostBack zelliini True olarak ayarlayn. 7. Web formunu yeniden altrn. Bu kez, seenek dmelerini tkladnzda form sunucuya gnderilirken kk bir titreme olur, olay ileyicisi alr, alr liste doldurulur ve form yeniden grntlenir. 8. Internet Explorer ara ubuundaki Page alr listesini tklayn ve daha sonra taraycda grntlenen sayfann HTML kaynak kodunu grntlemek iin View Sourceu tklayn. Not Internet Explorer Security ileti kutusu grnrse, Allowu tklayn, bylece sayfa iin kaynak kodu grebilirsiniz. NotePad balar ve sayfann HTML kaynan grntler. Dosyada hibir ekilde asp: Sunucu denetiminin anlmadna ve hi C# kodu olmadna dikkat edin. Bunun yerine, Sunucu denetimleri ve ierikleri elenikleri olan HTML denetimlerine dntrlmlerdir (ve biraz da JavaScript). Bu, Sunucu denetimlerinin temel zelliklerinden biridir (onlara, yntemlerle, zelliklerle ve olaylarla normal .NET Framework nesneleri gibi programatik olarak eriirsiniz). Web sunucusu tarafndan oluturduklarnda, ASP.NET Web formlarn alma annda grntlemek iin herhangi uygun bir HTML taraycy kullanmanz salayacak biimde HTMLe dntrlrler. 9. Dosyay incelemeyi bitirdiinizde, NotePadi kapatn. 10. Web formu zerinde Savei tklayn. InfoLabel denetimi yeni alann bilgilerini grntler. Kayna incelerseniz, InfoLabel denetiminin HTML kodunun (InfoLabel IDli bir HTML span olarak oluturulur) bu metni ierdiini grrsnz. 11. Clear tklayn. Form varsaylan deerlere sfrlanr. 12. Internet Explorer kapatn ve Visual Studio 2008e dnn.

582

Ksm VI

Web Uygulamalar Oluturmak

Olay leme ve Dngsel Dolamlar (Roundtrips)


Sunucu denetimleri kukusuz ASP.NETin ok gl bir zelliidir, ama bir bedelleri vardr. Her ne kadar olaylar Web istemcisinde balasa da olay kodunun Web sunucusunda yrtldn ve bir olay her olutuunda bir HTTP isteinin (ya da geri gndermenin) a zerinden Web sunucusuna gnderildiini anmsyor olmalsnz. Web sunucusunun grevi bu istei ilemek ve grntlenecek HTML sayfasn ieren bir yant geri gndermektir. Birok olay dnldnde, bu sayfa zgn istekteki ile ayn olacaktr. Ancak, Web sunucusu, HTML yantn oluturduunda bu deerleri grnmde tutabilmek iin kullancnn sayfada girdii dier verileri de bilmek zorundadr. (Web sunucusu yalnzca zgn sayfay oluturan HTMLi gnderirse kullanc tarafnda girilen btn bilgiler kaybolur.) Bir Web formu tarafndan oluturulan bir sayfann HTML kaynana bakarsanz, formda gizli bir giri alan olduunu fark edersiniz. Biraz nce gsterilen rnein gizli giri alan aadaki gibiydi:
<input type=hidden name=__VIEWSTATE value=/WEPdDwxNDk0MzA1NzE0O3Q8O2w8aTwxPjs+O2w8bDxpPDE3PjtpPDE5 PjtpP DIxPjtpPDI3PjtpPDMzPjs+O2w8dDxwPHA8bDxDaGVja2VkOz47bDxvPH Q+Oz4+Oz 47Oz47dDxwPHA8bDxDaGVja2VkOz47bDxvPGY+Oz4+Oz47Oz47dDxw PHA8bDxDaGVja2 VkOz47bDxvPGY+Oz4+Oz47Oz47dDx0PDt0PGk8Mz47QDxBbm FseXN0O0Rlc2lnbmVyO0 RldmVsb3Blcjs+O0A8QW5hbHlzdDtEZXNpZ25lcjtE ZXZlbG9wZXI7Pj47Pjs7Pj t0PHA8cDxsPFRleHQ7PjtsPFxlOz4+Oz47Oz47Pj 47Pj47bDxQZW9uQnV0dG9uO1BIQ kJ1dHRvbjtQSEJCdXR0b247VlBCdXR0b247 VlBCdXR0b247UHJlc2lkZW50QnV0dG9uO 1ByZXNpZGVudEJ1dHRvbjs+Pg== />

Bu bilgi, denetimlerin ya da grnm durumunun, kodlanm biimdeki ierikleridir ve bir olayn geri gndermeye neden olduu her durumda Web sunucusuna gnderilir. Web sunucusu da bu bilgiyi, HTML yantn olutururken sayfadaki alanlar yeniden doldurmak iin kullanacaktr. Tm bu verilerin leklenebilirlik stnde etkileri vardr. Form zerinde ne kadar ok denetim varsa, geri gnderme ilemi srasnda tarayc ile Web sunucusu arasnda o kadar ok durum bilgisi aktarlr ve ne kadar ok olay kullanrsanz bu o kadar sk gerekleir. Genel olarak, a ykn hafifletmek iin Web formlarnz grece basit tutmalsnz, sunucu olaylarnn gereksiz kullanmndan kanmalsnz ve a zerinden gereksiz bilgi gnderimini engellemek iin grntleme durumunda seici olmalsnz. Geri gndermeler srasnda bir denetimin durum bilgisinin korunmasn istemezseniz, denetimin EnableViewState zelliini False olarak ayarlayabilirsiniz (varsaylan ayar Truedur).

Bir Tema Yaratmak ve Kullanmak


Web sitesini ilk kez yarattnzda form iin bir stil belirlemitiniz. Bu stil, form zerindeki denetimlerin varsaylan yaz tipini ve rengini belirlemiti ve ayrca listelerin biimlendirilme

Blm 27

ASP .NETe Giri

583

ve numaralandrlma yntemi gibi baka zniteliklerin deerlerini belirtmek iin de kullanlabilmekteydi (Manage Styles penceresinde stili farenin sa dmesiyle tklayarak ve daha sonra Modify Stylei tklayarak, stili dzenleyebilirsiniz). Bununla birlikte, bu biimde tanmlanan bir stil yalnzca tek bir forma uygulanr. Ticari Web siteleri genellikle onlarca hatta yzlerce form ierir. Tm bu formlar birbiriyle tutarl olarak biimlendirilmi halde tutmak zaman alc bir grev olabilir; altnz irketin tm Web sayfalarndaki yaz tipini deitirmeye karar verdiini dnn. Ka formu gncelletirmeniz ve yeniden oluturmanz gerekirdi! te burada themes (temalar) ok yararl olabilir. Bir tema, bir sayfa zerindeki denetimlere ya da bir Web sitesindeki tm sayfalara genel biimde uygulayabileceiniz zellikler, stiller ve resimler kmesidir. Not Basamaklandrlm stil sayfalarn (.css dosyalar) biliyorsanz temalar kavram tandk

gelebilir. Ancak, basamaklandrlm stil sayfalar ile temalar arasnda baz farkllklar vardr. zellikle, temalar basamaklandrlm stil sayfalar gibi basamaklandrlmaz ve bir denetime uygulanan temalar iinde tanmlanan zellikler her zaman denetim iin tanmlanan yerel zellik deerlerini geersiz klar.

Bir Tema Tanmlamak


Bir tema, bir Web sitesinin App_Themes klasrndeki adlandrlm bir alt klasrnde bulunan bir kabuk dosyas kmesidir. Bir kabuk dosyas .skin dosya ad uzantsna sahip bir metin dosyasdr. Her kabuk dosyas, Source View penceresinde bir Web formunu izlediinizde grntlenene ok benzeyen bir szdizimi kullanarak belirli bir tr denetimin varsaylan zelliklerini belirtir. rnein, aadaki kabuk dosyas TextBox ve Label denetimlerinin varsaylan zelliklerini belirtir:
<asp:TextBox BackColor=Blue ForeColor=White Runat=Server /> <asp:Label BackColor=White ForeColor=Blue Runat=Server Font-Bold=True />

Bir kabuk dosyasnda bir denetimin birok zelliini belirtebilirsiniz, ama tmn deil. rnein, AutoPostBack zellii iin bir deer belirtemezsiniz. Buna ek olarak, her tr denetim iin kabuk dosyalar yaratamazsnz, ancak yaygn olarak kullanlan ou denetim bu biimde yaplandrlabilir.

Bir Tema Uygulamak


Bir tema iin bir kabuk dosyalar kmesi oluturduktan sonra, Source View penceresinde grntlendiinde sayfann banda oluan @Page zniteliini deitirerek bir temay bir sayfaya uygulayabilirsiniz. rnein, bir temann kabuk dosyalar Web sitesinin altndaki App_Themes\BlueTheme klasrnde bulunuyorsa temay bir sayfaya aadaki gibi uygulayabilirsiniz:
<%@Page Theme=BlueTheme ...%>

584

Ksm VI

Web Uygulamalar Oluturmak

Temay Web sitesindeki tm sayfalara uygulamak isterseniz web.config dosyasn deitirebilir ve pages (sayfa) esindeki temay aadaki gibi belirleyebilirsiniz:
<configuration> <system.web> <pages theme=BlueTheme /> </system.web> </configuration>

Bir temann tanmn deitirirseniz temay kullanan tm denetim ve sayfalar bir sonraki grntlenilerinde deiiklikleri otomatik olarak alr. Bu blmdeki son altrmalarda Litware Web sitesi iin bir tema yaratacak ve bu temay Web sitesindeki tm sayfalara uygulayacaksnz.

Yeni bir tema yaratn


1. Solution Explorerda, C:\...\Litware proje klasrn farenin sa dmesiyle tklayn. Add ASP.NET Folder iaret edin ve daha sonra Themei tklayn. Projeye App_Themes adl yeni bir klasr eklenir ve Theme1 adl bir alt klasr yaratlr. 2. Theme1 klasrnn adn LitTheme olarak deitirin. 3. Solution Explorerda LitTheme klasrn farenin sa dmesiyle tklayn ve ardndan Add New Item komutunu tklayn. Bir temalar klasrnde depolanabilecek dosya trlerini gsteren Add New Item iletiim kutusu grnr. 4. Skin File ablonunu tklayn ve Name metin kutusuna Lit.skin yazn ve Addi tklayn. Lit.skin kabuk dosyas LitTheme klasrne eklenir ve dosya Code and Text Editor penceresinde grntlenir. 5. Code and Text Editor penceresinde aadaki satrlar Lit.skin dosyasnn sonuna ekleyin (bu dosya, ok ksa ynergeleri olan bir aklama ierir):
<asp:TextBox BackColor=Red ForeColor=White Runat=Server /> <asp:Label BackColor=White ForeColor=Red Runat=Server Font-Bold=True /> <asp:RadioButton BackColor=White ForeColor=Red Runat=Server/> <asp:Button BackColor=Red ForeColor=White Runat=Server Font-Bold=True/> <asp:DropDownList BackColor=Red ForeColor=White Runat=Server/>

Bu basit zellikler kmesi TextBox, Button ve DropDownListBox denetimlerini krmz bir arka planda beyaz metin olarak ve Label ve RadioButton denetimlerini beyaz bir arka planda krmz metin olarak grntler. Label ve Button denetimleri geerli yaz tipinin kaln biimi kullanlarak grntlenir.

Blm 27

ASP .NETe Giri

585

nemli Kabuk dosya dzenleyicisi ok temeldir ve size yardmc olacak bir Intellisense iermez. Bu dosyada bir hata yaparsanz uygulama alr, ancak bu dosyadaki girdiler gz ard edilebilir. Daha sonra uygulamay altrdnzda denetimlerden herhangi biri beklendii gibi grnmezse bu dosyada hibir eyi yanl yazmadnzdan emin olun. Daha nce belirtildii gibi, bir Web formuna bir tema uygulamann en az iki yolu vardr: her sayfa iin @Page zniteliini ayarlayabilirsiniz ya da bir Web yaplandrma dosyas kullanarak tm sayfalarda genel bir tema belirtebilirsiniz. Sonraki altrmada bu ikinci yaklam kullanacaksnz. Bu teknii kullanmak siteye eklediiniz tm yeni sayfalarn otomatik olarak ayn temay uygulamasn salar.

Bir Web yaplandrma sayfas yaratn ve temay uygulayn


1. Solution Explorerda, web.config dosyasn farenin sa dmesiyle tklayarak dosyay Code and Text Editor penceresinde grntleyin. 2. <pages> satrn bulun ve aadaki gibi deitirin:
<pages theme=LitTheme>

3. Debug mensnde Start Without Debuggingi tklayn. Web formu grntleyen Internet Explorer grnr. Metin kutularndaki metnin okunmas biraz g olsa da (bunu birazdan dzelteceksiniz) form zerindeki denetimlerin stillerinin beklendii gibi deitiini dorulayn. iniz bitince Internet Explorer kapatn. 4. Solution Explorerda, Lit.skin dosyasn ift tklayarak Code and Text Editor penceresinde grntleyin. TextBox ve DropDownList denetimlerinin grnmn tanmlayan eleri aadaki gibi deitirin:
<asp:TextBox BackColor=White ForeColor=Red Font-Bold=True Runat=Server /> ... <asp:DropDownList BackColor=White ForeColor=Red Runat=Server />

5. Formu yeniden altrn. First Name, Last Name ve Employee Id TextBox denetimlerinin ve Role alr listesinin stilinin nasl deitiine ve nasl kolayca okunduuna dikkat edin. 6. iniz bitince Internet Explorer kapatn.

586

Ksm VI
n

Web Uygulamalar Oluturmak

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 28e gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 27 Hzl Bavuru


Bunun in
Bir Web Uygulamas yaratmak

unu Yapn
ASP.NET Web Site ablonunu kullanarak yeni bir Web sitesi yaratn. Development Web Server m (FileSystem konumu ve dosya ad belirtin) yoksa IISi mi (HTTP konumu ve URL belirtin) kullanmak istediinizi belirtin. Design View penceresinde Source dmesini tklayn. Manage Styles penceresinde, New Stylei tklayn. Forma stil tanmlamak iin New Style iletiim kutusunu kullann. Design View penceresinde Design dmesini tklayn. Toolboxda, Standard kategoriyi an. Denetimleri Web formu zerine srkleyin. Toolboxda, HTML kategorisini tklayn. Denetimleri Web formu zerine srkleyin.

Bir Web formunun HTML tanmn grntlemek ve dzenlemek Bir Web formu iin bir stil yaratmak Bir Web formuna ASP.NET Server denetimleri eklemek Web formuna HTML denetimleri eklemek (HTML denetimleri ile, mevcut ASP sayfalarn ASP.NETe daha kolay dntrrsnz.) ASP.NET Sunucu denetimi iin bir olay ileyici yaratmak

Design View penceresinde, Web form zerindeki denetimi sein. Properties penceresinde, Events dmesini tklayn. lemek istediiniz olay sein ve olay ileyicinin adn yazn ya da varsaylan ad semek iin olay adn ift tklayn. Code and Text Editor penceresinde, olay ilemek iin kodu yazn. Web sitesine bir App_Themes klasr ekleyin. Tema iin bir alt klasr retin. Bu klasrdeki denetimlerin zelliklerini tanmlayan bir kabuk dosya yaratn. Ya her sayfann @Page zniteliini kullanarak temay aadaki gibi belirtin:
<%@Page Theme=BlueTheme ...%>

Bir tema yaratmak

Bir Web sitesine bir tema uygulamak

ya da web.config dosyasn deitirin ve pages esindeki temay aadaki gibi belirtin:


<pages theme=BlueTheme>

Blm 28

Web Formlar Dorulama Denetimlerini Anlamak


Bu blm tamamladktan sonra renecekleriniz:
n

Bir Microsoft ASP.NET Web formunda kullanc girilerini ASP.NET dorulama denetimlerini kullanarak dorulamak. Kullanc girii dorulamasnn istemcide mi yoksa Web sunucusunda m yaplacan belirlemek.

Microsoft Windows Presentation Foundation (WPF) uygulamalarnda olduu gibi, kullanc girilerini dorulamak herhangi bir Web uygulamasnn nemli bir parasdr. WPF ile, i nesnelerinin zelliklerine denetimler balayarak ve bu i nesnelerindeki kodun veriyi dorulamasna izin vererek ya da kullanc form zerinde bir alandan dier alana getiinde meydana gelen olaylara karlk olarak bu alanlarn ieriklerini dorulamak iin kod yazarak kullanc girilerinin anlaml olduunu denetleyebilirsiniz. ASP.NET Web formlar, dorulama amalar iin i nesnelerine balamay desteklemez, dolaysyla ilk bakta tek seeneiniz olaylar kullanmak olabilir. Bununla birlikte, gz nnde bulundurmanz gereken bir faktr vardr. Web uygulamalar kendi yaplarnda yaylrlar: Uygulama kodu Web sunucusunda alrken, sunum mant kullancnn bilgisayarndaki Web taraycsnda alr. Bu dnceyle, kullanc girii dorulamasn istemcide mi (tarayc) yoksa sunucuda m gerekletirmelisiniz? Bu blmde, bu soruyu inceleyecek ve olas seenekleri kefedeceksiniz. Not Bu blm okuduka, hibir C# kodu iermediini greceksiniz. Bu zellikle yaplmtr. Veriyi C# yntemleri kullanarak dorulayabilirdiniz fakat bazen karmak ilemleri gerekletirmek iin gerekten C# kodu yazmanz gerekmeyen durumlar grmek yol gstericidir.

Sunucu ve stemci Dorulamalarn Karlatrmak


Yeniden Litware Web sitesinin EmployeeForm.aspx sayfasn ele alalm. Kullancdan bir alann bilgilerini girmesi beklenir: ad, alan numaras (ID), pozisyon, rol. Tm metin kutularnn doldurulmas zorunlu olmal. alan IDsi pozitif tamsay olmal.

587

588

Ksm VI

Web Uygulamalar Oluturmak

Veriyi Web Sunucusunda Dorulamak


TextBox snfn incelerseniz, TextChanged olayn yaynladn fark edersiniz. Bu olay, kullanc metin kutusunda yazl olan metni deitirdikten sonra formun sunucuya bir dahaki geri gnderiliinde alr. Btn Web sunucusu denetim olaylar gibi, TextChanged olay ileyicisi de Web sunucusunda alr. Veriyi sunucuda dorulamak, verinin Web taraycsndan sunucuya aktarlmasn, veriyi dorulamak iin olay sunucuda ilemeyi ve daha sonra da dorulama hatalarnn HTML yantnn bir paras olarak paketlenip istemciye geri gnderilmesini gerektirir. Bylece istemci taraycs bu hatalar grntleyebilir. Dorulama ok karmaksa ya da yalnzca Web sunucusunda gerekletirilebilecek ilem gerektiriyorsa (kullancnn yazd Employee IDnin veritabannda bulunduundan emin olmak gibi) bu kabul edilebilir bir tekniktir. Ama yalnzca bir tek metin kutusundaki veriyi basite inceliyorsanz (kullancnn bir Employee ID metin kutusuna pozitif tamsay yazmas gibi), Web sunucusu zerinde bu tr dorulama beklenmedik yk oluturabilir. Bu denetlemeyi istemci bilgisayarndaki taraycda yapp adaki dngsel dolamlar azaltabilirsiniz.

Veriyi Web Taraycsnda Dorulamak


ASP.NET Web Forms modeli, istemci tarafnda Web taraycda dorulamay dorulama denetimlerinin kullanm ile salar. Kullanc, dinamik HTMLi destekleyen bir tarayc kullanyorsa (Microsoft Internet Explorer 4 ya da daha ileri bir srm gibi) dorulama denetimleri, taraycda alan ve a zerinden sunucuya gidip gelme gerekliliinden kanan JavaScript kodu olutururlar. Kullanc daha eski bir tarayc kullanyorsa, dorulama denetimleri sunucu taraf kodu olutururlar. Buradaki can alc nokta, Web formu yaratan program gelitiricinin taraycnn yapabildikleri ile ilgilenmesinin gerekmemesidir; tm tarayc belirleme ve kod oluturma zellikleri ASP.NET dorulama denetimlerinin yerleik zellikleridir. Program gelitirici yalnzca ASP.NET dorulama denetimini Web form zerine srkleyip brakr, zelliklerini ayarlar (ya Properties penceresini kullanarak ya da kod yazarak) ve gerekletirilecek dorulama kurallarn ve grntlenecek hata iletilerini belirtir. ASP.NET aadaki dorulama denetimlerini salar:
n

RequiredFieldValidator Bu denetimi, kullancnn denetime veri girdiinden emin olmak iin kullann. CompareValidator Bu denetimi, girilen veriyi sabit bir deerle, baka bir denetimin bir zelliinin deeri ile ya da veritabanndan alnan bir deerle karlatrmak iin kullann. RangeValidator Bu denetimi, kullancnn girdii veriyi belirli bir deer aralyla karlatrmak (girilen verinin araln iine mi dna m dtnn denetimi) iin kullann. RegularExpressionValidator Bu denetimi, kullancnn girdii verinin belirli bir deyim, yap (pattern) ya da biime uygun olup olmadn denetlemek iin kullann (rnein telefon numaras).

Blm 28
n

Web Formlar Dorulama Denetimlerini Anlamak

589

CustomValidator Bu denetimi, kendi zel dorulama mantnz tanmlamak ve dorulanacak denetime balamak iin kullann.

Not Bir kullanc bir metin kutusuna snrlandrlmam bir metin yazabiliyor ve bunu Web sunucusuna gnderebiliyorsa HTML etiketlerine benzer (rnein <b> gibi) metin yazabileceklerini bilmeniz gerekir. Bazen krclar (hackers), Web sunucusuna zarar vermek amacyla bir istemci istemine HTML eklemek ya da sisteme girmek iin bu teknii kullanr (burada bunun ayrntlarna girilmeyecektir!). Varsaylan ayar olarak bu hileyi bir ASP.NET Web sayfas ile denerseniz istem durdurulur ve kullancya A potentially dangerous Request.Form value was detected from the client (stemciden potansiyel olarak tehlikeli bir Request Form deeri algland) iletisi gsterilir. Bu denetimi devre d brakabilirsiniz, ama bu nerilmez. Bir metin kutusundaki kullanc girdisinin bir HTML etiketi (ya da benzer bir ey) oluturmadn dorulamak iin daha iyi bir yaklam, RegularExpressionValidator denetimi kullanmaktr. Dzenli deyimlerle ve kullanmlaryla ilgili ayrntl bilgi iin Microsoft Visual Studio 2008 belgelerindeki .NET Framework Regular Expressions konusuna bakn.

Her denetim tek bir tanml dorulama tr gerekletirebiliyor olsa da birka tanesinden oluan bir bileimi kullanabilirsiniz. rnein, kullancnn bir metin kutusuna veri girdiinden ve ayn zamanda girilen deerin belirli bir araln iinde olduundan emin olmak istiyorsanz, metin kutusuna bir RequiredFieldValidator ve bir RangeValidator balayabilirsiniz. Bu denetimler, hata iletilerini grntlemek iin bir ValidationSummary denetimi ile birlikte alabilirler. Bu denetimlerden bazlarn aadaki altrmalarda kullanacaksnz.

stemci Dorulamas Uygulamak


EmployeeForm.aspx Web formuna dnerseniz, First Name, Last Name ve Employee Id metin kutular iin RequiredFieldValidator denetimlerinin gerekli olduunu grrsnz. alan IDsi saysal ve ayn zamanda pozitif bir tamsay olmaldr. Bu uygulamada, alan IDsinin 1 ile 5000 arasnda olmas gerektiini belirteceksiniz. Bu konuda RangeValidator denetimi ok yararldr.

RequiredFieldValidator denetimleri ekleyin


1. Microsoft Visual Studio 2008i balatn. 2. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, File mensnde, Open iaret edin ve sonra Web Site tklayn. 3. Microsoft Visual Web Developer 2008 Express Edition kullanyorsanz, File mensnde Open Web Site tklayn. 4. Open Web Site iletiim kutusunda, File System seeneinin seili olduundan emin olun, Belgeler klasrnz altnda yer alan Microsoft Press\Visual CSharp Step by Step\Chapter 28\Litware klasrne gidin ve Open tklayn.

590

Ksm VI

Web Uygulamalar Oluturmak

Not Yeni bir Web sitesi oluturduunuzda, Visual Studio 2008 Belgeler klasrndeki Visual Studio 2008 klasrndeki bir zm klasrnde bir zm dosyas yaratr. Bununla birlikte, bir Web sitesini dzenlemek amacyla amak iin bir Microsoft Visual C# zm ya da proje dosyas semeniz gerekmez; sadece Web sitesi dosyalar ve alt klasrleri ieren dosyaya gidin. zm dosyasn kullanarak bir Web sitesi amak isterseniz, File mensnde Open iaret edin ve Project/Solution tklayn (Web Site yerine), zm klasrne gidin ve zm dosyasn tklayn. 5. Solution Explorerda, EmployeeForm.aspxi farenin sa dmesiyle tklayn ve Set As Start Pagei tklayn. 6. EmployeeForm.aspx dosyasn yeniden farenin sa dmesiyle tklayn ve ardndan Web formunu Design View penceresinde grntlemek iin View Designer tklayn. 7. Toolboxta Validation kategorisini geniletin. 8. Forma bir RequiredFieldValidator denetimi ekleyin. Denetim, formun sol st ksmnda grnr ve RequiredFieldValidator metnini grntler. 9. Formun HTML kaynak kodunu grntlemek iin Source dmesini tklayn. Dosyann alt tarafndaki RequiredFieldValidator denetiminin kodunu bulun ve aada gsterildii gibi, firstName metin kutusunun altna yerletirmek iin Style zelliini ayarlayn. (Dorulama denetiminin konumu, hata iletisinin nerede grntleneceini belirler.)
<asp:RequiredFieldValidator ID=RequiredFieldValidator1... Style=position: absolute; left: 166px; top: 128px></asp:RequiredFieldValidator>

10. Design dmesini tklayn ve sonra RequiredFieldValidator denetimini sein. Properties penceresinde, ControlToValidate zelliini firstName olarak ayarlamak iin alr listeyi kullann. ControlToValidate zelliini ayarlamak dorulama denetimini dorulanacak eye balar. ErrorMessage zelliinde You must specify a first name for the employee (alan adn girmek zorunludur) yazn. Bu, dorulanan denetim (First Name metin kutusu) bo braklmsa grntlenecek olan iletidir. Bu iletinin, varsaylan krmz metin hata iletisinin (RequiredFieldValidator) yerini aldna dikkat edin. 11. Forma iki adet daha RequiredFieldValidator denetimi ekleyin. 12. Source dmesini tklayn ve bu denetimleri, lastName ve employeeID metin kutusu altnda konumlandrmak iin aada gsterilen Style zelliklerini ekleyin.
<asp:RequiredFieldValidator Style=position: absolute; <asp:RequiredFieldValidator Style=position: absolute; ID=RequiredFieldValidator2... left: 508px; top: 128px></asp:RequiredFieldValidator> ID=RequiredFieldValidator3... left: 166px; top: 194px></asp:RequiredFieldValidator>

13. Design dmesini tklayn, Last Name metin kutusu altndaki RequiredFieldValidator denetimini sein, ControlToValidate zelliini lastName olarak ayarlayn ve ErrorMessage zelliine You must specify a last name for the employee (alann soyadn girmek zorunludur) yazn. RequiredFieldValidator denetiminin, hata iletisinin tamamn grntlemek iin otomatik olarak yeniden boyutlandna dikkat edin.

Blm 28

Web Formlar Dorulama Denetimlerini Anlamak

591

14. Employee Id metin kutusu altndaki RequiredFieldValidator denetimini sein; ControlToValidate zelliini employeeID olarak ayarlayn ve ErrorMessage zelliine You must specify an employee ID (alan ID numarasn girmek zorunludur) yazn. 15. Formu Windows Internet Explorerda altrmak iin Debug mensnde, Start Without Debuggingi tklayn. 16. Form ilk grndnde btn gerekli alanlar bo olacaktr. Savei tklayn. RequiredFieldValidator denetimine ait hata iletileri grntlenir.

Save dmesinin Click olaynn almadna ve formun en altndaki etiketin veri zetini grntlemediine dikkat edin. Bunun nedeni, dorulama denetimlerinin sunucuya geri gnderme ilemini engellemeleridir; tarayc tarafndan yrtlebilen bir kod olutururlar ve hatalar giderilene kadar da sunucuya geri gnderme ilemlerini engellerler. Not Bir hata iletisi grntlenirken Clear dmesini tklarsanz, hata Web sunucuya geri

dnm engellediinden form temizlenmeyecektir. ASP.NET istemci tarafnda kk program oluturma destei salar, bylece Web formunu temizlemek iin JavaScript kodu ekleyebilirsiniz. Bu kod geri gnderim tarafndan bloklanmaz nk kullancnn Web taraycsnda alr (taraycnn JavaScript desteklediini varsayarak). Dorulama denetimleri gerekte Web sunucuya geri gnderilmek yerine kullancnn taraycsnda alan JavaScript kod retir. ASP.NET Web formunda kendi istemci taraf JavaScript kodunuzu nasl yazacanzn ayrntlar, bu kitabn kapsam dndadr.

17. First Name metin kutusuna bir ad yazn.

592

Ksm VI

Web Uygulamalar Oluturmak

Metin kutusundan kar kmaz hata iletisi silinir. First Name metin kutusuna geri dnp, ieriini siler ve yeniden bir sonraki metin kutusuna geerseniz hata iletisi yeniden grntlenir. Btn bu ilevsellikler taraycda gerekletirilmekte ve a zerinden sunucuya hi veri gnderilmemektedir. 18. First Name, Last Name ve Employee Id metin kutularna deerleri girin ve sonra Savei tklayn. Bu kez Click olay alr ve formun alt ksmndaki InfoLabel denetiminde zet grntlenir. 19. Formu kapatn ve Visual Studio 2008e dnn. u anda Employee Id metin kutusuna istediiniz deeri girebilirsiniz. Aadaki altrmada, 1den 5000e kadar olan tamsaylarn girilmesini zorunlu klmak iin bir RangeValidator denetimi kullanacaksnz.

Bir RangeValidator denetimi ekleyin


1. Design View penceresinde, Toolboxdan, forma bir RangeValidator denetimi ekleyin. 2. Source dmesini tklayn ve RangeValidator denetimini, employeeID metin kutusu altna yerletirmek iin aada gsterilen Style zelliklerini ekleyin.
<asp:RangeValidator ID=RangeValidator1... Style=position: absolute; left: 166px; top: 194px></asp:RangeValidator>

Bu, employeeID metin kutusunun RequiredFieldValidator denetimi ile tam olarak ayn konumdur. Bu iki hata iletisi iin ayn konumu belirlemek sorun deildir nk bu denetimlerin gerekletirdii dorulamalar birbirinden bamszdr (alan ID numaras bo ise, RangeValidator denetimi kullancnn girdii deeri test edemez), bu nedenle sadece bir hata iletisi grntlenebilir. 3. RangeValidator1 denetimi iin HTML kodunda herhangi bir yeri tklayn. Properties penceresinde, ControlToValidate zelliini employeeID olarak ayarlayn. ErrorMessage zelliine The employee ID must be between 1 and 5000 (alan ID numaras 1 ile 5000 arasnda olmak zorundadr) yazn. MaximumValue zelliini 5000, MinimumValue zelliini ise 1 ve Type zelliini Integer olarak ayarlayn. Not Type zelliini ayarlayarak saysal olmayan veri araln snrlandrmak iin

RangeValidator denetimini kullanabilirsiniz. String, Integer, Double, Date ve Currency trlerini belirleyebilirsiniz. MaximumValue ve MinimumValue zellikleri iin uygun trn deerlerini belirtmelisiniz. RangeValidator denetimi, dizeler iin aralk denetimini gerekletirirken o anki yerel karakter kmesinin karlatrma srasn kullanr ve Date (Tarih) aralklarn denetlerken, nceki tarihin sonraki tarihten kk olduu dnlr.

4. Formu yeniden altrn. alann adn ve soyadn girin, alan IDsini bo brakn. Savei tklayn. alan IDsini girmeniz gerektiini bildiren bir hata iletisi grntlenir. 5. Employee Id metin kutusuna -1 yazp Savei tklayn.

Blm 28

Web Formlar Dorulama Denetimlerini Anlamak

593

alan IDsinin 1 ile 5000 aras bir deer olmas gerektiini bildiren bir hata iletisi grntlenir. 6. Employee Id metin kutusuna 101 yazp Savei tklayn. Bu kez veri geerlidir, form sunucuya geri gnderilir, Save dmesinin Click olay alr ve girilen bilgilerin zeti formun en alt ksmndaki InfoLabel etiketinde belirir. 7. Araln dnda ya da hatal olan deerlerle snamalar yapn. RangeValidator denetiminin beklendii gibi alp almadn denetlemek iin 5001 ve AAA deerlerini girin. 8. Internet Explorer ara ubuu zerinde, Page alr listesini tklayn ve daha sonra taraycda grntlenen HTML sayfasnn kaynan grntlemek iin View Sourceu tklayn. Not Internet Explorer Security ileti kutusu grnrse, sayfann kaynak dosyasn
grebilmeniz iin Allowu tklayn.

Sayfann HTML kaynak kodu Notepadde grntlenir. Dosya boyunca kaydrma yapp ieriini inceleyin. Sona doru dorulamalar gerekletiren bir JavaScript kodu greceksiniz. Bu kod, dorulama denetimlerinin zellikleri kullanlarak oluturulmutur. HTML kaynak koduna gz attktan sonra Notepadi kapatn. 9. Internet Explorer kapatn ve Visual Studio 2008e dnn.

stemci Dorulamasn Devre D Brakmak


nceki rnekte dorulamalarn taraycda alan JavaScript kodu kullanlarak gerekletirildiini grdnz. Taraycnzn yeteneklerine bal olarak ASP.NET alma zaman bu kodu otomatik olarak gerekletirir. Taraycnz JavaScripti desteklemiyorsa, tm dorulama denetimleri Web sunucusu zerinde alan kod kullanlarak gerekletirilir. Dorulama sadece form sunucuya geri gnderildiinde alan kod kullanarak gerekletirilecektir. sterseniz, istemci dorulamalarn geersiz klarak btn denetimlerin sunucuda yaplmasn salayabilirsiniz. Bunu yapmak iin dorulama denetiminin EnableClientScript zelliini False olarak ayarlayn. Baz durumlarda bunu yapmann ok yararl olduunu grebilirsiniz; rnein karmak ya da yalnzca sunucu zerinde bulunan verilere eriim yaplmas gerektii (CustomValidator denetimi kullanarak yaplan) zel dorulamalar gerektiren durumlarda. Buna ek olarak, CustomValidator denetiminin, EnableClientScript, True olarak ayarlanm olsa bile dorulamann sunucu zerinde yaplmasn salamak iin kullanlabilecek bir ServerValidate olay vardr.

594

Ksm VI

Web Uygulamalar Oluturmak

Dorulama denetimlerinin kullancnn girdii veriyi nasl doruladklarn grdnz, ama hata ileti gsterimi pek de gzel deildir. Aadaki altrmada, kullancya hata bilgilerini gsterme yntemini deitirmek iin bir ValidationSummary denetimi kullanacaksnz.

Bir ValidationSummary denetimi ekleyin


1. Code and Text Editor penceresinde, RequiredFieldValidator1 denetiminin HTML kodunda herhangi bir yeri tklayn. Properties penceresinde, Text zelliini * olarak ayarlayn. Dorulama denetiminin Text zelliini ayarlarsanz, form zerinde hata iletisi yerine uygun metin deeri grntlenir. (Text zellii belirtilmemise, ErrorMessage zelliinin deeri grntlenir.) 2. RequiredFieldValidator1 denetimini First Name metin kutusunun sana yerletirmek iin denetimin Style zelliini aadaki gibi deitirin:
<asp:RequiredFieldValidator ID=RequiredFieldValidator1 ... Style=position: absolute; left: 400px; top: 106px></asp:RequiredFieldValidator>

imdi, dorulama hatas meydana gelirse, kullanc hata olan metin kutusunun yannda krmz renkte yldz iareti (*) grecektir. 3. RequiredFieldValidator2 denetiminin HTML kodunda herhangi bir yeri tklayn, Text zelliini * olarak ayarlayn ve daha sonra denetimi Last Name metin kutusunun sana tamak iin Style zelliini deitirin.
<asp:RequiredFieldValidator ID=RequiredFieldValidator2 ... Style=position: absolute; left: 744px; top: 106px></asp:RequiredFieldValidator>

4. RequiredFieldValidator3 denetiminin HTML kodunda herhangi bir yeri tklayn, Text zelliini * olarak ayarlayn ve daha sonra denetimi Employee Id metin kutusunun sana tamak iin Style zelliini deitirin.
<asp:RequiredFieldValidator ID=RequiredFieldValidator3 ... Style=position: absolute; left: 400px; top: 172px></asp:RequiredFieldValidator>

5. RangeValidator1 denetiminin HTML kodunda herhangi bir yeri tklayn, Text zelliini * olarak ayarlayn ve daha sonra denetimi Employee Id metin kutusunun sana tamak iin Style zelliini deitirin.
<asp:RangeValidator ID=RangeValidator1 ... Style=position: absolute; left: 400px; top: 172px></asp:RangeValidator>

6. Design dmesini tklayn. Toolboxdan, forma bir ValidationSummary denetimi ekleyin. 7. Source dmesini tklayn, dosyann sonundaki ValidationSummary denetimini bulun ve dme denetimlerinin stne ve seenek dmelerinin sana yerletirmek iin aadaki Style zelliini ekleyin.

Blm 28

Web Formlar Dorulama Denetimlerini Anlamak

595

<asp:ValidationSummary ID=ValidationSummary1 ... Style=position: absolute; left: 300px; top: 260px />

ValidationSummary denetimi, Web form zerindeki dorulama denetimlerinin tm iin ErrorMessage deerlerini grntler. 8. Properties penceresinde, ValidationSummary1 denetiminin ShowSummary zelliinin True olarak ayarlandn dorulayn. 9. Web formu altrn. Form Internet Explorerda grndnde, First Name, Last Name ve Employee Id metin kutularn bo brakn ve Savei tklayn. Her metin kutusunun yannda krmz yldz iareti grnr ve formun altndaki ValidationSummary denetiminde uygun iletiler grntlenir.

10. Ad ve soyad girin ve sonra Employee Id metin kutusuna AAA yazn. Bir metin kutusundan dier metin kutusuna hareket ettike, First Name ve Last Name metin kutularndan yldz iareti kaybolur fakat Employee Id metin kutusu yanndaki yldz iareti kalr. 11. Savei tklayn. ValidationSummary denetimi tarafndan grntlenen hata iletisi deiir. 12. Employee Id metin kutusuna 101 yazn ve sonra Savei tklayn. Tm hata iletileri ve yldz iaretleri kaybolur ve daha nceki gibi InfoLabel denetiminde girdiiniz verinin bir zeti grnr. 13. Formu kapatn ve Visual Studio 2008e dnn.

596

Ksm VI

Web Uygulamalar Oluturmak

Dinamik HTML ve Hata letileri


Dinamik HTMLi destekleyen bir taraycnz varsa, dorulama zeti verisini Web formunun zerinde deil de bir ileti kutusu biiminde grntleyebilirsiniz. Bunu yapmak iin ValidationSummary denetiminin ShowMessageBox zelliini True yapn. alma annda bir dorulama hatas olutuunda hata iletileri bir ileti kutusu iinde grntlenir. Tarayc dinamik HTMLi desteklemiyorsa, ShowMessageBox zelliinin deeri ihmal edilir (varsaylan ayar olarak False olur).

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 29a gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 28 Hzl Bavuru


Bunun in
Kullanc girilerinin sunucu taraf dorulamasn gerekletirmek Kullanc girileri iin istemci taraf dorulama gerekletirmek

unu Yapn
Sunucu denetimlerinin olaylarn kullann; rnein, TextBox denetiminin TextChanged olay. Bir dorulama denetimi kullann. ControlToValidate zelliini dorulama gerekletirilecek denetim olarak ve ErrorMessage zelliini de grntlenecek hata iletisi olarak ayarlayn. EnableClientScript zelliinin True olduundan emin olun. Bir RequiredFieldValidator denetimi kullann. Bir RangeValidator denetimi kullann. Type, MaximumValue ve MinimumValue zelliklerini gerektii gibi ayarlayn. Bir ValidationSummary denetimi kullann. ShowSummary zelliinin True olduundan emin olun. Dinamik HTMLi destekleyen tarayclarn hata iletilerini bir ileti kutusunda grntlemesini isterseniz, ShowMessageBox zelliini True olarak ayarlayn.

Kullancy bir metin kutusuna veri girmek iin zorlamak Bir metin kutusuna girilen veri deerlerinin trn ve araln denetlemek Dorulama hata iletilerinin zetini grntlemek

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek


Bu blm tamamladktan sonra renecekleriniz:
n

Bir Web uygulamasna gvenli eriim iin ASP.NET Login denetimleri ve Form tabanl kimlik dorulamas kullanmak. Bir GridView denetimi kullanarak bir veritabanndan alnan veriyi sunan Web formlar yaratmak. Kaynak tketimini en aza indirerek ok fazla veriyi grntleyen uygulamalar oluturmak. Bir Web formundan veritabann gncelletirmek. Web formlar arasnda veri geirebilen uygulamalar oluturmak.

n n

nceki iki blmde, kullancnn bilgi girmesini salayan ve girilen veriyi dorulayan basit bir Web sitesinin nasl oluturulacan grdnz. Daha nceki blmlerde ayrca, veritabanndaki veriyi gncelleyen ve grntleyen Web tabanl olmayan bir uygulamay nasl oluturacanz grdnz. Bu blmde, veritabanndan veri grntleyen ve kullancnn yapt deiikliklerle veritabann gncelletiren uygulamalar yaratmay reneceksiniz. Bunu, a ve veritaban gibi paylatrlm kaynaklarn tketimini en aza indirerek yapacanz greceksiniz. nternetten eriilen uygulamalar oluturduunuzda ve bir Web uygulamas irketinizin veritaban gibi kritik kaynaklara eritiinde gvenlik zellikle nemli bir konudur. Bu nedenle, Web Forms uygulamalarnn, kullancnn kimliini dorulamak iin Forms tabanl gvenlik kullanacak biimde nasl yaplandrldn greceksiniz.

Gvenlii Ynetmek
Microsoft .NET Framework ile oluturulan uygulamalarn, uygulamay altran kullanclarn uygun haklara sahip olduklarn garantilemek iin kullanabilecekleri bir dizi mekanizma vardr. Kullanlabilecek yntemlerden bazlar kullanclarn kimliini, bir takm tanmlayc ya da parolalar baz alarak belirlemeye dayanrken dierleri Microsoft Windowsun tmleik gvenliini temel alrlar. nternet zerinden eriilecek bir Web uygulamas yaratyorsanz,
597

598

Ksm VI

Web Uygulamalar Oluturmak

Windows tmleik gvenliini kullanmak seenekler arasnda yer almaz. Kullanclar Web uygulamasnn alglad herhangi bir etki alanna ye olamazlar ve Windowstan farkl, UNIX gibi, iletim sistemleri kullanyor olabilirler. Bu yzden, en iyi seenek Form tabanl gvenliktir.

Form Tabanl Gvenlii Anlamak


Form tabanl gvenlik, bir kullancnn kimliini, kullancya bir ID ve bir parola soran oturum ama formu grntleyerek dorulamanz salar. Kullanc onaylandktan sonra uygulamay oluturan birok deiik Web formuna eriebilir ve ek kimlik dorulamalar gerektiren sayfalarda gvenlik bilgileri kodla incelenebilir (kullanc bir sisteme giri yapabilir ama uygulamann her noktasna eriemeyebilir). ASP.NET Form tabanl gvenlii kullanmak iin Web.config dosyasnda baz deiiklikler yaparak Web uygulamanz yaplandrmanz ve kullancy dorulamak iin bir form oluturmanz gerekir. Kullanc uygulamada bir sayfaya erimeye altnda kullanc henz onaylanmadysa gvenlik formu grntlenir. Kullanc istedii sayfaya ancak oturum ama formu kimliini onayladktan sonra eriebilir. nemli ASP.NET Form tabanl gvenlik biraz ar grnebilir ama deildir. Uygulamanza giri noktas olacak bir oturum ama formu yaratp kullanclarn uygulamanza buradan erieceini sanmayn. Tarayclar formlar ve URLleri kullanclarn bilgisayarlarnda n bellee alabilirler. Bilgisayarn yaplandrmasna bal olarak baka bir kullanc taraycnn nbelleine eriebilir, uygulamanzn hassas blmlerinin URLlerini bulabilir ve oturum ama formunuzu atlayarak dorudan bu URLlere gidebilir. Web sunucunuz zerinde denetiminiz vardr ama kullancnn bilgisayarnda denetiminiz yoktur. ASP.NET Form tabanl mekanizma salamdr ve Web sunucunuzun gvenli olduunu varsayarsak uygulamalarnzn ou iin yeterli olmaldr.

Form Tabanl Gvenlii Uygulamak


Bu blmdeki ilk altrmalarda kullancnn form tabanl gvenlii uygulayan, Northwind veritabanndaki mteri bilgisini grntleyip deitirmesini salayan bir Web uygulamas yaratp yaplandracaksnz.

Northwind Web sitesini oluturun


1. Visual Studio 2008i balatn. 2. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, File mensnde, Newi iaret edin ve daha sonra Web Site tklayn. 3. Microsoft Visual Web Developer 2008 Express Edition kullanyorsanz, File mensnde New Web Site tklayn.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

599

4. New Web Site iletiim kutusunda, ASP.NET Web Site ablonunu tklayn. Location alr listesinde File Systemi sein ve Belgeler klasrnzde yer alan \Microsoft Press\Visual CSharp Step By Step\Chapter 29\Northwind klasrn belirleyin. Language zelliini Visual C# olarak ayarlayn ve OKi tklayn. 5. Solution Explorerda, Default.aspxi farenin sa dmesiyle tklayn, Renamei tklayn, ve CustomerData.aspx olarak yeniden adlandrn. 6. CustomerData.aspxi farenin sa dmesiyle tklayn ve Set As Start Pagei tklayn. 7. Web formunun HTML kaynak kodunu grntleyen Code and Text Editor penceresinde, Design dmesini tklayn. 8. Toolbox kullanarak, Web formuna Standard kategoriden bir Label denetimi ekleyin. Etiketin Text zelliini This form will be implemented later (Bu form daha sonra uygulanacaktr) olarak ayarlayn. Sonraki altrmalarda, kullancnn kimliini dorulamak ve Web uygulamas iin Form tabanl gvenlii yaplandrmak iin bir oturum ama formu oluturacaksnz. Kimlii dorulanmam bir kullanc uygulamaya erimeye altnda oturum ama formu grnr. Form tabanl gvenlii kullanmak zere yaplandrldnda, ASP.NET alma zaman, kimlii dorulanmam bir kullanc tarafndan uygulamaya yaplan eriim giriimlerini oturum ama formuna ynlendirir. Form tabanl gvenlik iin bir oturum ama formu uygulamak ylesine yaygn bir grevdir ki Microsoft, ileri basitletirmek iin bir dizi Login denetimleri gelitirmitir. imdi bu denetimlerden birini kullanacaksnz.

Oturum ama formunu oluturun


1. Website mensnde, Add New Item tklayn. 2. Add New Item iletiim kutusunda, Web Form ablonunun seildiinden emin olun ve ad iin LoginForm.aspx yazn. Language alr listesinin Visual C# olarak ayarlandn, Place code in separate file kutusunun seili olduunu, Select master page onay kutusunun temizlendiini dorulayn ve formu oluturmak iin Add i tklayn. Yeni Web form oluturulur ve formun HTML kodu Code and Text Editor penceresinde grntlenir. 3. Design View penceresinde, LoginForm.aspx dosyasn grntlemek iin Design dmesini tklayn. 4. Properties penceresinde, DOCUMENT nesnesinin Title zelliini Northwind Traders Log In olarak ayarlayn. 5. Toolboxta, Login kategorisini geniletin. Web formuna bir Login denetimi ekleyin. Login denetimi birka etiketten, kullancnn ad ve parola yazmas iin iki metin kutusundan, bir Remember me next time (Beni hatrla) onay kutusundan ve oturumu balatmak iin tklanan bir dmeden oluan bileik bir denetimdir. Bu denetimin Properties penceresini kullanarak bu elerin bir ounu yaplandrabilir ve ayrca denetimin stilini deitirebilirsiniz.

600

Ksm VI

Web Uygulamalar Oluturmak

6. Login denetimi tarafndan grntlenen Common Login Tasks mensnde, grnen Login Tasks mensnde Auto Format tklayn. pucu Common Login Tasks mens grnmezse, Login denetimini tklayn ve daha sonra
denetimin sa st kesindeki akll etiket simgesini tklayn.

Auto Format iletiim kutusu grntlenir. Bu iletiim kutusunu, nceden tanml bir dzen seerek Login denetiminin grnm ve havasn deitirmek iin kullanabilirsiniz. Ayrca Login denetiminin Common Login Tasks mensndeki Convert to Template komutunu kullanan bir ablon yaratarak kendi yerleiminizi tanmlayabilirsiniz. 7. Auto Format iletiim kutusunda, Classic emasn tklayn ve daha sonra OKi tklayn. Login Tasks mensn gizlemek iin Login denetimi zerindeki akll etiketi tklayn. 8. Properties penceresinde, aadaki deerleri kullanarak Login denetiminin zelliklerini deitirin.
zellik
DisplayRememberMe FailureText TitleText DestinationPageUrl

Deer
False Invalid User Name or Password. Please enter a valid User Name and Password. Northwind Traders Log In ~/CustomerData.aspx

Login denetimi aadaki gibi grnmelidir:

Kullanc Log In dmesini tkladnda, kullancnn kimlii dorulanmaldr. Kullanc ad ve parola geerliyse, kullancya DestinationPageUrl zellii tarafndan belirlenen forma gemesi iin izin verilmelidir; geerli deilse Login denetiminin FailureText zelliinde depolanan hata iletisi grntlenmeli ve kullancdan yeniden giri yapmas istenmelidir. Bu grevler nasl yaplr? En az iki seeneiniz vardr:
n

Login denetiminin Authenticate olayn ileyen kodu yazn. Bu olay Log In dmesi tklandnda gerekleir. UserName ve Password zelliklerindeki deerleri inceleyebilir ve bunlar geerliyse kullancnn DestinationPageUrl zellii tarafndan tanmlanan sayfaya gemesine izin verebilirsiniz. Bu strateji zelletirilebilir, ancak dorulamay yapmak iin, kullanc adlarnn ve parolalarnn size ait bir gvenli listesini tutmanz gerektirir.

Blm 29
n

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

601

Kullanc adlarn ve parolalar ynetmek iin Visual Studio 2008in yerleik zellikleri ile ASP.NET Web Site Administration Toolu kullann ve Log In dmesi tklandnda Login denetiminin kullanclar dorulamak iin varsaylan ilemini yapmasna izin verin. ASP.NET Web Site Administration Tool kullanc adlar ve parolalar kendi veritabannda bulundurur ve Web sitenize yeni kullanclar eklemenizi salamak iin bir sihirbaz salar.

Aadaki altrmada ikinci seenei kullanacaksnz (ilk seenei de baka bir zamanda inceleyebilirsiniz).

Web sitesi gvenliini yaplandrmak ve Form tabanl gvenlii salamak


1. Website mensnde ASP.NET Configuration tklayn. ASP.NET Development Server balar ve kendi URLsini grntleyen bir balon grntler. ASP.NET Configuration komutu Windows Internet Explorer aar ve ASP.NET Web Site Administration Tool ad verilen bir Web uygulamas balatr. Bu uygulama sizin Web uygulamasndan bamsz olarak kendi ASP.NET Development Servern kullanr.

Bu arac kullanarak, Web siteniz iin kullanc ekleyebilir ve kullanclar ynetebilirsiniz, uygulama yaplandrma dosyasnda depolanmasn istediiniz uygulama ayarlarn ve kullanc adlar ve parolalar gibi gvenlik bilgilerinin nasl depolanacan belirleyebilirsiniz. ASP.NET Web Site Administration Tool, gvenlik bilgilerini Web sitenizin App_Data klasrnde yaratt ASPNETDB.MDF ad verilen yerel bir SQL Server veritabannda depolar. Gvenlik bilgilerini baka bir yerde depolamak iin ASP.NET Web Site Administration Toolu yaplandrabilirsiniz fakat bu konu kitabn kapsam dndadr. 2. ASP.NET Web Site Administration Toolda, Security sekmesini tklayn.

602

Ksm VI

Web Uygulamalar Oluturmak

Security sayfas grnr. Kullanclar ynetmek, Web sitesinin kulland kimlik dorulama dzeneini belirtmek, kullanclar iin rolleri tanmlamak (roller kullanc gruplarna ayrcalklar atamak iin uygun bir dzenektir) ve Web sitesine eriimi denetlemek iin eriim kurallarn belirtmek amacyla bu sayfay kullanabilirsiniz. Not Security sekmesini ilk tkladnzda, ASP.NET Web Site Administrator Tool,

ASPNETDB.MDF veritabann oluturur, bu nedenle Internet Explorern sonraki sayfay grntlemesi biraz zaman alabilir.

3. Users blmnde, Select authentication type balantsn tklayn. Kullanclarn Web sitenize nasl erieceklerini soran yeni bir sayfa grnr. ki seeneiniz vardr: From the internet ve From a local network. Varsaylan ayar olarak From a local network seenei seilir. Bu seenek Web sitesini Windows kimlik dorulamasn kullanacak biimde yaplandrr; btn kullanclar Web sitenizin eriebilecei bir Windows etki alannn yesi olmaldr. Northwind Website nternet zerinden kullanlabildiinden bu seenek ok yararl deildir. 4. From the interneti ve ardndan Done tklayn. Bu seenek uygulamay Form tabanl gvenlik kullanacak biimde yaplandrr. Kullancdan ad ve parolasn istemek iin nceki altrmada oluturduunuz oturum ama formundan yararlanacaksnz. Security sayfasna dnersiniz. 5. Users blmnde, Web sitenize eriebilecek kullanclarn saysnn u anda sfr olduuna dikkat edin. Create User balantsn tklayn. Create User sayfas grnr. 6. Create User sayfasnda, aadaki tabloda gsterilen deerlerle yeni bir kullanc ekleyin.
stek
User Name Password Confirm Password E-mail Security Question Security Answer

Yant
John Pa$$w9rd Pa$$w9rd john@northwindtraders.com What was the name of your first pet Thomas

Not Bu ekrandaki her alan iin deer girmeniz gerekir. E-mail, Security Question ve Security Answer alanlar PasswordRecovery denetimi tarafndan bir kullancnn parolasn kurtarmak ya da sfrlamak iin kullanlr. PasswordRecovery denetimi, ara ubuunun Login kategorisindedir ve bunu parolasn unutmu kullanclara yardm salamak iin oturum ama sayfasna ekleyebilirsiniz.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

603

7. Active User kutusunun seildiinden emin olun ve Create User tklayn. Yeni bir sayfada Complete. Your account has been successfully created (Tamamland. Hesabnz baaryla yaratld) iletisi grnr. 8. Continueu tklayn. Create User sayfas baka kullanclar eklemenizi salamak iin tekrar grnr. 9. Security sayfasna dnmek iin Backi tklayn. Var olan kullanc saysnn u anda 1e ayarlanm olduunu dorulayn. Not Bu sayfada bulunan Manage users balantsn kullanclarn e-posta adreslerini

deitirmek, aklamalar eklemek ve var olan kullanclar kaldrmak iin kullanabilirsiniz. Web sitesinin oturum ama (login) sayfasna ChangePassword ve PasswordRecovery denetimlerini ekleyerek kullanclarn parolalarn deitirmelerine ve (unutmularsa) parolalarn elde etmelerine olanak salayabilirsiniz.

10. Access Rules blmnde, Create access rulesu tklayn. Add New Access Rule sayfas grnr. Bu sayfay hangi kullanclarn Web sitesindeki hangi klasrlere eriebileceini belirtmek iin kullanrsnz. 11. Select a directory for this rule altnda, Northwind klasrn tklayarak seili olduundan emin olun. 12. Rule applies to altnda, usern seili olduundan emin olun ve John yazn. 13. Permission altnda, Allowu tklayn ve sonra OKi tklayn. Bu kural Johna Web sitesine eriim hakk verir. Security ekran tekrar grnr. 14. Access Rules blmnde, Create access rulesu tekrar tklayn. 15. Add New Access Rule sayfasnda, Select a directory for this rule altnda, Northwind klasrnn seili olduundan emin olun. Rule applies to altnda Anonymous users seeneini tklayn. Permission altnda, Denyn seili olduundan emin olun ve OKi tklayn. Bu kural oturum amam kullancnn Web sitesine eriememesini salar. Security ekran tekrar grnr. 16. ASP.NET Web Site Administration Toolu gsteren Internet Explorer kapatn ve Visual Studio 2008e dnn. 17. Solution Explorer ara ubuundaki Refresh dmesini tklayn. ASPNETDB.MDF veritaban dosyas App_Data klasrnde grnr. 18. web.configi ift tklayp Code and Text Editor penceresinde grntleyin.

604

Ksm VI

Web Uygulamalar Oluturmak

Bu dosya ASP.NET Web Site Administration Tool tarafndan gncellenmitir ve aada grld gibi, <web.config> ksmnda bir <authorization> ve bir <authentication> esi iermelidir:
<system.web> ... <authorization> <allow users=John /> <deny users=? /> </authorization> ... <authentication mode=Forms /> ... </system.web>

<authorization> esi Web sitesine eriimine izin verilen ve verilmeyen kullanclar belirtir (? adsz kullanclar gsterir). <authentication> esinin mode znitelii Web sitesinin Form tabanl kimlik dorulamas kullandn gsterir. 19. <authentication> esini deitirin, (/>) sonlandrc snrlandrcy, normal kapanan snrlandrc (>) ile deitirin ve aada gsterildii gibi bir <forms> alt esi ekleyin. Bir kapatan </authentication> esi eklediinizden emin olun:
<authentication mode=Forms> <forms loginUrl=LoginForm.aspx timeout=5 cookieless=AutoDetect protection=All /> </authentication>

<forms> esi Form tabanl kimlik dorulama iin parametreleri yaplandrr. Gsterilen znitelikler, Web sitesindeki herhangi bir sayfaya erimeye alan yetkilendirilmemi bir kullancnn yeniden LoginForm.aspx oturum ama sayfasna ynlendirileceini belirtir. Kullanc 5 dakika iinde hareketsiz kalrsa daha sonra Web sitesindeki bir sayfaya eriirken yeniden oturum amak zorundadr. Form tabanl yetkilendirme kullanan birok Web sitesinde kullanc bilgileri kullancnn bilgisayarnda tanmlama bilgisi iinde saklanr. Birok tarayc kullancnn tanmlama bilgileri kullanmak istemediklerini belirtmelerine izin verir (tanmlama bilgileri zararl Web siteleri tarafndan ktye kullanlabilir ve bir gvenlik riski olarak dnlmektedir). Kullancnn taraycs tanmlama bilgilerini devre d brakmamsa, cookieless=AutoDetect eklinde belirtilmesi Web sitesinin tanmlama bilgilerini kullanmasna izin verir; aksi taktirde, kullanc bilgileri her istein bir paras olarak Web sitesi ve kullancnn bilgisayar arasnda gidip gelir. Kullanc bilgileri kullanc ad ve paroladan olumaktadr. Kukusuz bu bilgilerin herkes tarafndan grnr olmasn istemezsiniz. Bu rnekte yapld gibi, bu bilgiyi ifrelemek iin protection (koruma) zniteliini kullanabilirsiniz. 20. Debug mensnde, Start Without Debuggingi tklayn. Internet Explorer alr. Uygulamann balang sayfas CustomerData.aspxtir, fakat henz oturum amadnz iin LoginForm.aspxe ynlendirilirsiniz.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

605

21. Rastgele bir kullanc ad ve parola yazn ve Log Ini tklayn. Login sayfas, Invalid User Name or Password. Please enter a valid User Name and Password (Kullanc Ad ya da Parola Geersiz. Ltfen geerli bir Kullanc Ad ve Parola girin) hata iletisiyle tekrar grnr. 22. User Name alanna John, Password alanna Pa$$w9rd yazn. Log Ini tklayn. CustomerData sayfas This form will be implemented later (Bu form daha sonra uygulanacaktr) iletisiyle grnr. 23. Internet Explorer kapatn ve Visual Studio 2008e dnn.

Veriyi Grntlemek ve Sorgulamak


Artk uygulamanza eriimi denetleyebildiinize gre imdi dikkatinizi verileri sorgulamaya ve ynetmeye verebilirsiniz. Veritabanna balanmak, verileri sorgulamak ve verilerin bakmn yapmak iin Web Server veri denetimlerini kullanacaksnz.

Web Formlar GridView Denetimini Anlamak


Blm 26da, bir WPF uygulamasndaki veritabanndan veri sunumunu ele aldnzda, ListView denetimini kullanarak veriyi izelge halinde nasl grntleyeceinizi rendiniz. ASP.NET, WPF ile kullanlabilen eitli denetimler salar. Bu denetimlerden, GridView denetimi bir Web formundaki veriyi grntlemek ve ynetmek iin olduka kullanldr. Bu denetim zellikle a bant geniliini zorlayan ortamlarda almak zere tasarlanmtr. Bir Web formlar uygulamasnda, byk ihtimalle istemci uygulamas (ya da tarayc) veritabann tutan sunucudan uzakta olacaktr. A bant geniliini akllca kullanmanz gerekir (birka defa zerinde duruldu fakat bu gerekten nemli bir konudur) ve kullancnn aslnda grmek istemedii byk miktarda verileri de alarak kaynaklar boa harcamamalsnz. GridView denetimi, kullanc veri zerinde yukar ve aa doru kaydka veri yakalama ilemini gerekletirebileceiniz paging zelliini destekler. Not Bir WPF penceresindeki denetimlerin yerleimini tanmlamak iin kullandnz WPF

GridView denetimi ile bir veritabanndan aldnz veriyi grntlemek iin kullandnz ASP.NET Web Formlar GridView denetimini kartrmayn. Ayn addaki farkl denetimlerdir.

Bir Web formlar GridView denetimindeki bilgi, taraycda bir HTML tablosu olarak yansyan, salt okunur etiketler klavuzunda gsterilir. GridView denetiminin zellikleri, kullancnn seilen satr grntlenen veriyi deitirebilecei metin kutular olarak deitiren, dzenleme moduna girmesini salar.

606

Ksm VI

Web Uygulamalar Oluturmak

Veritaban balant kaynaklarn idareli kullanmak iin, GridView denetimi veritabanndan balant kesili iken de alacak ekilde tasarlanmtr. Veritabanna balanmak, veriyi almak ve bir GridView denetiminde grntlemek ve daha sonra veritaban balantsn kesmek iin bir veri kayna yaratabilirsiniz. Kullanc herhangi bir deiiklii kaydettiinde, uygulama veritabanna yeniden balanarak deiiklikleri bildirebilir. Bu blmdeki altrmalarda bu teknii kullanacaksnz.

Mteri ve Sipari Bilgisini Grntlemek


Aadaki altrmalarda, Northwind veritabanndaki mteri kaytlarn bir Web formu zerindeki GridView denetiminde grntleyen bir Web uygulamas oluturacaksnz. Kullancnn bir mteriyi seerek, yapt siparilerin tmn grntleyebilmesini salayacaksnz. Bunu yapmak iin, bir LINQ veri kayna kullanarak veri balamay kullanacaksnz. Not Bu altrmada, Blm 25teki altrmalar bilgisayarnzda tamamladnz varsaylmaktadr.

Mteri bilgisini almak iin bir veri kayna yaratn


1. Website mensnde Add New Item tklayn. 2. Add New Item iletiim kutusunda, LINQ to SQL Classes ablonunu tklayn, Name metin kutusuna Customer.dbml yazn, Language alr listesinde Visual C# sein ve sonra Addi tklayn. 3. Microsoft Visual Studio ileti kutusunda, Linq to SQL dosyasn App_Code klasrne yerletirmek iin Yesi tklayn. 4. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, View mensnde Server Explorer tklayn. 5. Visual Web Developer 2008 Express Edition kullanyorsanz aadaki ilemleri gerekletirin: 5.1. View mensnde Database Explorer tklayn. 5.2. Database Explorer penceresinde, Data Connections farenin sa dmesiyle tklayn ve sonra Add Connection tklayn. 5.3. Add Connection iletiim kutusunda Changei tklayn. 5.4. Choose Data Source iletiim kutusunda, Microsoft SQL Server Database File veri kaynan tklayn, veri salayc olarak .NET Framework Data Provider for SQL Servern seildiinden emin olun ve OKi tklayn.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

607

Not Visual C# 2008 Express Editionn tersine, Visual Web Developer 2008 Express Edition ile bir veri kayna yarattnzda dorudan veritaban dosyasna balanmanz gerekmez. sterseniz, Northwind veritabannn SQL Server balantsn kesebilir ve daha sonra Microsoft SQL Server veri kaynan kullanarak balanabilirsiniz. Bir veritaban balamak ile ilgili daha fazla bilgi iin MSDN Library for Visual Studio 2008teki sp_attach_db komutuna bakn. 5.5. Add Connection iletiim kutusunda, Database file name kutusunda Browseu tklayn. 5.6. Select SQL Server Database File iletiim kutusunda, C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data klasrne gidin, Northwind veritaban dosyasn tklayn ve sonra Open tklayn. 5.7. Sunucuda oturum amak iin Use Windows Authentication seeneini sein ve OKi tklayn. 6. Server Explorer ya da Database Explorerda, yeni veri balantsn (YourComputer\ sqlexpress.Northwind.dbo ya da Northwind.mdf) ve sonra Tables geniletin. 7. Customers tablosunu tklayn ve Object Relational Designer penceresine srkleyin. Not Visual Web Developer 2008 Express Edition kullanyorsanz, Northwind veritabannn veri dosyasn projenize eklemek isteyip istemediinizi soran bir ileti kutusu grnr. Noyu tklayn. 8. File mensnde Save Allu tklayn.

CustomerData Web formunu dzenleyin


1. Design View penceresinde CustomerData.aspx Web formunu grntleyin. This form will be implemented later. (Bu form daha sonra uygulanacaktr) metnini grntleyen etiketi silin. 2. Properties penceresinde, DOCUMENT nesnesinin Title zelliini Northwind Traders Customers olarak ayarlayn. 3. Toolboxda, Data kategorisini geniletin. Web formuna bir LinqDataSource denetimi ekleyin. Web formuna LinqDataSource1 adnda bir denetim eklenir. Not Tasarm srasnda, Web form zerinde LinqDataSource denetimi grnse de, Web
form altnda kullanlr olmayacaktr.

608

Ksm VI

Web Uygulamalar Oluturmak

4. Properties penceresini kullanarak, LinqDataSource1in (ID) zelliini CustomerInfoSource olarak deitirin. 5. Web formu zerinde CustomerInfoSource denetimini sein. Common LinqDataSource Tasks mensn grntlemek iin akll etiket simgesini tklayn ve daha sonra Configure Data Source balantsn tklayn. Configure Data Source Wizard sihirbaz grnr. 6. Choose a Context Object sayfasnda, Choose your context object alr listesinde CustomerDataContextin seili olduundan emin olun ve Nexti tklayn. 7. Configure Data Selection sayfasnda, Table alr listesinde Customers tablosunu sein. Select liste kutusunda, * kutusunu sein ve sonra Finishi tklayn. 8. Common LinqDataSource Tasks mensnde Enable Update kutusunu sein fakat Enable Insert ve Enable Delete kutularn semeyin. Enable Update onay kutusu, veri kaynann Customers tablosundaki veriyi deitirmek iin uygun SQL UPDATE ifadelerini retmesini salar. Veri tutarll nedeniyle, bu uygulamadaki Web formu, kullancnn mteri ekleme ve silmesine izin vermeyecektir. Not Bu seeneklerden herhangi birini semezseniz, veri kayna zerinden elde edilen veri etkin olarak salt okunurdur. 9. Toolboxda, GridView denetimini tklayn ve forma srkleyin. Forma bir GridView eklenir ve yertutucu veriyi grntler. 10. Properties penceresini kullanarak, GridView denetiminin (ID) zelliini CustomerGrid olarak deitirin ve Caption zelliini Northwind Traders Customers olarak ayarlayn. 11. GridView denetiminin sa st kesindeki akll etiket simgesini tklayn. Common GridView Tasks mensnde, Auto Format balantsn tklayn. 12. AutoFormat iletiim kutusunda Classic emasn sein ve OKi tklayn. pucu AutoFormat iletiim kutusundaki nceden tanmlanm biimlerin hibirini

beenmediyseniz, Properties penceresinde Styles blmndeki zellikleri kullanarak kendiniz GridView denetiminin elerinin stillerini deitirebilirsiniz.

13. Properties penceresinde, GridView denetiminin DataSourceID zelliini CustomerInfoSource olarak deitirin.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

609

Customers tablosunun stun balklar, ekranda GridView denetiminde grntlenir. 14. CustomerData.aspx sayfasnn HTML kaynak kodunu grntlemek iin Design View penceresinin altndaki Source dmesini tklayn. GridView denetiminin HTML kodunun, denetimin DataSourceID zelliini CustomerInfoSource olarak ayarladna dikkat edin. Denetim ayrca, grntlenen her stunun zelliklerini tanmlayan boundfield denetimi ile bir <columns> esi ierir. Her boundfield nesnesinin DataField zellii, veri kaynanda balanlacak nesne zelliinin adn belirler. HeaderText zellii, stunun stun balnda grntlenen dizedir. u anda, her stunun HeaderText ve DataField deerleri ayndr. 15. boundfield nesnelerinin HeaderText zellik deerlerini aadaki tablodaki bilgiyi kullanarak deitirin.
DataField Deeri
CustomerID CompanyName ContactName ContactTitle Address City Region PostalCode Country Phone Fax

HeaderText Deeri
Customer ID Company Contact Title Address City Region Postal Code Country Phone Fax

CustomerData formunu test edin


1. Debug mensnde, Start Without Debuggingi tklayn. Internet Explorer balar ve Northwind Traders - Login sayfasn grntler. 2. Pa$$w9rd parolasn kullanarak John kullancsyla oturum an.

610

Ksm VI

Web Uygulamalar Oluturmak

Veritabannda her mterinin bilgilerini grntleyen CustomerData sayfas grnr:

Sayfann u anda salt okunur olduuna dikkat edin; grntlenen bilgilerin hibirini dzenleyemezsiniz. Daha sonra kullancnn deiiklik yapabilmesini salamak iin Web formunu gelitireceksiniz. 3. Veriye gzattktan sonra Internet Explorer kapatn ve Visual Studio 2008e dnn.

Web Sitesi Gvenlii ve SQL Server


Form tabanl gvenlik kullanan bir uygulamay altrmak iin ASP.NET Development Server kullandnzda, Visual Studio 2008i altrmak iin kullandnz hesap balamnda alr. Northwind veritabann yaratmak iin ayn hesab kullandnz varsayarsak, Web uygulamasnn veritabanna eriiminde hibir sorun olmamaldr. Ancak Web sitesini Microsoft Internet Information Servicese (IIS) datrsanz durum deiir. IIS, Windows Vista iletim sisteminde NETWORK SERVICE hesabn ve Windows XP altnda da ASPNET hesabn kullanarak Form tabanl gvenlii kullanan uygulamalar altrr. Varsaylan ayar olarak bu hesap gvenlik nedeniyle ok az ayrcala sahiptir. zellikle, SQL Server Expresse balanamaz ve Northwind veritabann sorgulayamaz. Dolaysyla, NETWORK SERVICE hesabna (ya da ASPNET hesabna) SQL Server Expresse oturum ama izni vermeniz ve bunu Northwind veritabanna bir kullanc olarak eklemeniz gerekir. Daha fazla bilgi iin, MSDN Library for Visual Studio 2008teki sp_ grantlogin ve sp_grantdbaccess komutlarna bakn.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

611

Veriyi Sayfalarda Grntlemek


Her mterinin bilgilerini almak olduka yararldr, fakat Customers tablosunda ok fazla sayda satr olduunu dnn. Bir kullancnn binlerce satra gz atmak istemesi pek rastlanmayan bir durum olduundan bunlarn tmn gsteren uzun bir sayfa oluturmak zaman ve a bant genilii israfdr. Bunun yerine veriyi bloklar halinde gstermek ve kullancnn bu veriyi sayfalamasna olanak vermek ok daha iyidir. Aadaki altrmalarda bunu yapacaksnz.

Sayfalama kullanmak iin GridView denetimini dzenleyin


1. Design View penceresinde CustomerData.aspx Web formunu grntlemek iin Design dmesini ve sonra CustomerGrid denetimini tklayn. 2. Properties penceresinde, AllowPaging zelliini True olarak ayarlayn. CustomerGrid denetimine sayfa numaras ieren altbilgi eklenir. Bu altbilgi pager (sayfalandrc) olarak adlandrlr. Altbilgi iin gsterilen stil, kullancnn tklayabilecei sayfa numaralarndan oluan varsaylan biimdir. 3. PagerSettings bileik zelliini geniletin. Sayfa gezinme balantlarnn biimini zelletirmek iin bu zelliin deerlerini kullanabilirsiniz. Sayfa gezinme balantlarn iki ekilde belirleyebilirsiniz: sayfa numaras olarak ya da nceki/sonraki sayfa oklar olarak. Kullancnn hzla verinin bana ya da sonuna hareket edebilmesini salamak iin, gsterilen ilk ve son sayfa oklar ile sayfa numaralarn gstermek amacyla Mode zelliini NumericFirstLast olarak ayarlayn. PageButtonCount alt zelliini 5 olarak ayarlayn; bu, sayfa balantlarnn beli gruplar halinde grnmesini salar (Web uygulamasn altrdnzda bunun ne yaptn grrsnz). nceki/sonraki sayfa oklarn kullanmak isterseniz NextPageText ve previousPageText zelliklerinin deerlerini deitirerek grntlenen varsaylan metni (> ve <) deitirebilirsiniz. Ayn ekilde, FirstPageText ve LastPageText zelliklerini deitirerek ilk ve son sayfa balantlar iin grntlenen metni deitirebilirsiniz. Bu zelliklerdeki deerlerin HTML karakterleri olarak kodlanmay gerektirdiine dikkat edin; aksi halde dzgn biimde grntlenmezler (rnein, > simgesi &gt; olarak belirtilmelidir). sterseniz bir resim dosyasnn adn FirstPageImageUrl, LastPageImageUrl, PreviousPageImageUrl ve NextPageImageUrl zelliklerinde belirtebilirsiniz. Tarayc tarafndan destekleniyorsa, sayfa gezinti balantlar bu resimleri ieren dmeler olarak grnr. 4. Properties penceresinde, PageSize zelliini 8 olarak ayarlayn. Bu ayarlama, CustomerGrid denetiminin veriyi sekizli bloklar halinde almasna ve grntlemesine neden olur. 5. PagerStyle bileik zelliini geniletin. Bu zellii sayfalandrcnn nasl biimlendirileceini belirtmek iin kullanabilirsiniz. HorizontalAlign alt zelliini Left olarak ayarlayn. Sayfalandrcdaki numaralar GridView denetiminde sol kenar boluuna kayar.

612

Ksm VI

Web Uygulamalar Oluturmak

6. Web uygulamasn altrn ve Pa$$w9rd parolasn kullanarak John kullancsyla oturum an. Oturum atktan sonra, verinin ilk sekiz satr ve bir sayfa balantlar kmesi CustomerData Web formu zerinde grntlenir. 1, 2, 3, 4 ve 5 sayfa numaralar, dorudan son sayfaya gitmek iin >> iaretiyle birlikte grntlenir. ... balantsn tklamak, sonraki be sayfa numarasn ve dorudan ilk sayfaya geri dnmek iin << balantsn grntler. Ek ... balants nceki be sayfaya eriim salar. 7. Sayfadan sayfaya hareket etmek iin klavuzun altndaki balantlar tklayn. 8. Veriye gzatmay bitirdiinizde Internet Explorer kapatn ve Visual Studio 2008 programlama ortamna dnn. Not GridView denetimi, AllowSorting zellii salar. Bu zellik varsaylan ayar olarak False olarak ayarlanmtr. Bu zellii True olarak ayarlarsanz, kullanc herhangi bir stundaki deerleri, stun baln tklayarak sralayabilir. Kullanc stun baln her tkladnda, LinqDataSource denetimi, artan srada, satrlarn ilk blounu elde eden bir SQL SELECT ifadesi bildirir. Kullanc ayn stun baln tekrar tklarsa, son blok iin veri alnr ve azalan srada grntlenir. Kullanc tekrar tekrar stun baln tklarsa, Web form her tklama iin veritabanna bir SQL SELECT ifadesi gnderecektir.

Veriyi Dzenlemek
Veri almak ve veriye gzatmak iin bir GridView denetiminin nasl kullanldn grdnz. Aadaki altrmalar, veriyi nasl deitireceinizi ve nasl yeni satrlar ekleyeceinizi gsterir.

Bir GridView Denetimi zerinden Satrlar Gncellemek


GridView denetimini kullanarak, komutun uygulanmas gerektiini gstermek iin klavuza balantlar ekleyebilirsiniz. Kendi kprlerinizi ve komutlarnz ekleyebilirsiniz fakat Visual Studio 2008 veri ekleme, gncelleme ve silme iin nceden tanmlanm kprler salar. Aadaki altrmada, klavuza bir Edit kprs ekleyerek, GridView denetimine gncelleme ilevsellii ekleyeceksiniz. Kullanc Edit kprsn tkladnda, satr bir TextBox denetimleri kmesine dnr. Kullanc deiiklikleri kaydedebilir ya da bu deiiklikleri silebilir. Bunun iin, otomatik olarak yaratlan Update ve Cancel kprleri kullanlr.

Edit, Update ve Cancel dmeleri yaratn


1. Design View penceresinde CustomerData.aspx formunu grntleyin. Common GridView Tasks mensn grntlemek iin CustomerGrid denetiminin akll etiketini tklayn ve sonra Enable Editingi sein. GridView denetiminde her satra bir Edit kprs eklenir.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

613

2. Web formunun HTML kaynak kodunu grntlemek iin Source dmesini tklayn. CustomerGrid denetiminin <Columns> koleksiyonunu bulun ve Visual Studionun bir commandfield nesnesi eklediine dikkat edin. ShowEditButton zellii aadaki gibi True olarak ayarlanr:
<asp:GridView ID=CustomerGrid runat=server ...> ... <Columns> <asp:commandfield ShowEditButton=True ></asp:commandfield> ... </Columns> ... </asp:GridView>

ShowEditButton zellii, commandfield nesnesinin Edit kprsn grntleyip grntlemediini belirler. Ayrca, ShowDeleteButton ve ShowInsertButton zelliklerini True olarak ayarlayarak (daha fazla kprnn grntlenmesine neden olur), silme ve ekleme ilevselliini etkinletirebilirsiniz. 3. commandfield nesnesi iin aada gsterildii gibi, EditText zelliini ve ButtonType zelliini ayarlayn:
<asp:commandfield ShowEditButton=True EditText=Modify ButtonType=Button> </asp:commandfield>

Bu zellikler, Edit kprsnn grnmn deitirir. EditText zellii, kpr tarafndan grntlenen metni belirler. ButtonType zellii de kpry dme olarak grntlenecek ekilde deitirir. commandfield nesnesinin ekleme ve silme kprlerini etkinletirmek iin, bu balantlar tarafndan grntlenen metni kiiselletirmek iin InsertText ve DeleteText zelliklerini deitirebilirsiniz. Bununla birlikte, tm balantlar ayn ButtonType deerini paylar (tm kpr olarak ya da tm dmeler olarak grnr). 4. Uygulamay altrn. Oturum an ve daha sonra CustomerData formu zerinde grntlenen ilk satrdaki Modify dmesini tklayn. lk satr TextBox denetimleri koleksiyonu olarak deiir ve Modify dmesi bir Update ve Cancel dmesi ile yer deitirir. Not CustomerID stunu etiket olarak kalr. Bunun nedeni, bu stunun Customers tablosundaki birincil anahtar olmasdr. Veritabanndaki birincil anahtar deerlerini deitirememeniz gerekir; aksi durumda, tablolar arasndaki veri doruluunu bozma riskiniz vardr. 5. Contact ve Title stunlarndaki veriyi deitirin ve sonra Updatei tklayn. Veritaban gncellenir, satr etiketler kmesine dner, Modify dmesi yok olur ve yeni veri satrda grntlenir. Arka planda, GridView denetimi, LINQ veri kaynandaki veriyi deitirir ve daha sonra deiiklikleri veritabanna gndermek iin CustomerDataContext nesnesinin SubmitChanges yntemini arr. 6. Internet Explorer kapatn ve Visual Studio 2008e dnn.

614

Ksm VI

Web Uygulamalar Oluturmak

u anda formda herhangi bir dorulama uygulanmaz. Bir mterinin Company stunundaki veriyi silerseniz ve sonra Updatei tklarsanz, bu stun null deerlere izin vermediinden, LINQ veri kayna bir SQL zel durumu oluturur. Grntlenen ileti, ok kullanl deildir (yine de, baz programclar olduka kullanl bulacaktr). Web formu zel bir durum oluturursa, kullancy baka bir sayfaya ynlendirerek daha kullanl bir ileti grntlenecek ekilde dzenleyebilirsiniz. Bir hata meydana geldiinde kullancy ynlendirmek iin formun kaynak tanmndaki @Page ynergesini ErrorPage znitelii olarak ayarlayn:
<%@ Page ... ErrorPage=ErrorPage.aspx %>

Bu sayfa zerinde kullancya daha kullanl bir ileti grntleyebilirsiniz. Ayrca, LINQ veri kayna nesnesinde Updating olayn ileyerek veritabanna gndermeden nce veriyi dorulayabilirsiniz. Bu yntemin olay ileyicisi, satrn orijinal deerlerini ve yeni deerlerini ieren LinqDataSourceUpdateEventArgs parametresi alr. Kodunuz yeni deerleri dikkatle inceler ve geerli ise, veri kaynann veritabann gncellemeye almamas gerektiini gstermek iin kodunuz, LinqDataSourceUpdateEventArgs parametresinin Cancel zelliklerini false olarak ayarlayabilir. Ayrca, kullanc Update dmesini tklar tklamaz veritabannn gncellendiine dikkat edin. Bu, bir LINQ veri kaynana bal GridView denetimi tarafndan uygulanan ve etkileimli Web formlar oluturmak iin en uygun mekanizma olan varsaylan ilevselliktir. Gncelleme hareketini deitirmek isterseniz (rnein, GridView denetimi birden fazla gncellemeyi yerel olarak saklayacak ve daha sonra tek bir yn olarak sunacak ekilde), kendi mekanizmanz uygulayabilirsiniz. Bununla birlikte, bunu yapmann ayrntlar bu kitabn kapsam dndadr.

Formlar Arasnda Gezinmek


Birok Web Formu uygulamasnn kilit noktas, kpr ya da dmeyi tklayarak bir formdan dierine geebilmesidir. Ayrca, ou kez formlar arasnda bilgi geii yapmanz gerekir. CustomerData Web formunda, bir mteri adn tklayarak bir baka formda mterinin sipari gemiini grmek kullanldr. Bu blmdeki altrmada bunu yapacaksnz. Bu blmde, sipari gemii bilgisini grntlemek iin yeni bir Web formu yaratacaksnz. Veriyi grntlemek iin bir GridView denetimi kullanacaksnz, fakat bir tabloyu sorgulamak yerine bir SQL Server sakl yordamn uygulayarak veriyi dolduracaksnz. Northwind veritaban CustOrderHist adnda bir sakl yordam ierir. Bu sakl yordam parametre olarak mteri ID numaras alr ve mterinin sipari verdii her rnn adn ve adedini ieren bir sonu kmesi dndrr. Kullanc CustomerData Web formundaki bir mteriyi seerse, CustomerID stunundaki deeri bu yeni forma geirmeniz gerekir.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

615

Bu nedenle, ilk adm, kullancnn bir mteri semesini salamak iin CustomerData Web formunu deitirmektir.

CustomerData Web formunu deitirin


1. CustomerData Web formunun HTML kaynak kodunu grntleyen Code and Text Editor penceresine dnn. 2. Mteri ID numarasn grntleyen boundfield esinin tanmn aada gsterildii gibi HyperLinkField olarak deitirin:
<asp:HyperLinkField DataField=CustomerID ...></asp:HyperLinkField>

GridView denetiminde bu stundaki veri, bir etiket olarak deil bir kpr olarak grntlenecektir. Kullanc bu kpry tklayabilir. Aadaki admlar, kullanc kpry tkladnda meydana gelecek eylemleri belirleyen zelliklerin ayarlanmasn gsterir. 3. Denetimin DataField zelliini DataTextField zellii olarak deitirin:
<asp:HyperLinkField DataTextField=CustomerID ...></asp:HyperLinkField>

HyperLinkField denetimi bir DataField zelliine sahip deildir. DataTextField zellii veri kaynandan kpr balants yaplan zellii belirler. 4. Denetimin ReadOnly zelliini kaldrn ve aada gsterildii gibi, Target, DataNavigateUrlFields ve DataNavigateUrlFormatString zelliklerini ekleyin:
<asp:HyperLinkField DataTextField=CustomerID HeaderText=Customer ID Target=_self DataNavigateUrlFields=CustomerID DataNavigateUrlFormatString=~\OrderHistory.aspx?CustomerID={0} SortExpression=CustomerID> </asp:HyperLinkField>

DataNavigateUrlFormatString zellii, kullanc kpry tkladnda Web uygulamasnn gitmesi gereken adresi belirtir. Bu rnekte, uygulama OrderHistory.aspx formuna (bir sonraki altrmada yaratacaksnz) hareket eder ve bir mteri ID numaras ieren bir sorgu dize parametresi ierir. Bu sorgu dizesi u anda bir yertutucu ierir. DataNavigateUrlFields zellii bu yertutucu iin kullanlmas gereken deeri belirler (GridView denetimindeki mevcut satrn CustomerID alanndaki veri). Target zellii, OrderHistory.aspx Web formunun nerede grntlenmesi gerektiini belirler. _self deeri seilirse, ASP.NET, CustomerData formunun grntlendii ayn Internet Explorer penceresini kullanr. Not ASP.NET ayrca, Toolboxdaki Standard kategorisinde HyperLink denetimini salar. Bu denetimi kullandnzda, denetimin NavigateUrl zelliine gitmek iin bir URL belirtebilirsiniz. Ayrca, denetimin bir Web formundan dierine programl olarak gemesini isterseniz, Web formunun Server zelliinin Transfer yntemini altrabilirsiniz.

616

Ksm VI

Web Uygulamalar Oluturmak

Sonraki grev, veritabanndaki CustOrderHist sakl yordamn altran bir veri kayna yaratmaktr. Bu blmdeki son altrmada, veri kaynan kullanarak sakl yordamn arlmasn ve bu sakl yordam tarafndan istenen CustomerID parametresinin geirilmesini greceksiniz.

Mteri sipari gemiini elde etmek iin bir veri kayna yaratn
1. Website mensnde Add New Item tklayn. 2. Add New Item iletiim kutusunda, LINQ to SQL Classes ablonunu tklayn, Name metin kutusuna OrderHistory.dbml yazn, Language alr listesinde Visual C# dilini sein ve Addi tklayn. 3. Microsoft Visual Studio ileti kutusunda, Yesi tklayarak Linq to SQL dosyasn App_Code klasrne yerletirin. 4. Server Explorer (Visual Studio 2008) ya da Database Explorerda (Visual Web Developer 2008 Express Edition), Northwind veritabannn veri balantsn geniletin (Bilgisayarnz\sqlexpress.Northwind.dbo ya da Northwind.mdf) ve daha sonra Stored Proceduresu geniletin. 5. CustOrderHist sakl yordamn tklayn ve Object Relational Designer penceresine srkleyin. Sakl yordam Object Relational Designer penceresinin sa blmesinin en stne eklenir. 6. File mensnde Save Allu tklayn. imdi, bu veri kaynan kullanan mterinin sipari gemiini grntleyen OrderHistory Web formunu oluturabilirsiniz.

OrderHistory Web formunu oluturun


1. Design View penceresinde CustomerData.aspx formunu grntleyin. Website mensnde Add New Item tklayn. 2. Add New Item iletiim kutusunda, Web Form ablonunun seili olduundan emin olun ve ad olarak OrderHistory.aspx yazn. Language alr listesinin Visual C# olarak ayarlandn, Place code in separate file kutusunun seildiini ve Select master page kutusunun temizlendiini dorulayn ve formu oluturmak iin Addi tklayn. Not Add New Item iletiim kutusu Web Form ablonunu grntlemezse, Design View
penceresinde Object Relational Designer deil CustomerData.aspx formunun grntlendiinden emin olun.

3. Design View penceresinde OrderHistory.aspxi grntlemek iin Design dmesini tklayn.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

617

4. Properties penceresinde, DOCUMENT nesnesinin Title zelliini Northwind Traders Orders for: olarak ayarlayn. 5. Toolboxdaki Standard kategorisinden Web forma bir Label denetimi ve bir HyperLink denetimi ekleyin. 6. Properties penceresini kullanarak, Label ve HyperLink denetimlerinin zelliklerine aadaki deerleri atayn.
Denetim
Label1

zellik
ID Font-Name (Font zelliini geniletin ve Namei sein) Font-Size (Font zelliinde Size sein) Text

Deer
OrderLabel Arial Black X-Large Order History for: Return to Customers ~/CustomerData.aspx

HyperLink1

Text NavigateUrl

7. Toolboxn Data kategorisinde, GridView denetimini tklayn ve forma srkleyin. Forma, yertutucu veriyi gsteren bir GridView eklenir. 8. Properties penceresini kullanarak, GridView denetiminin (ID) zelliini OrderGrid olarak ayarlayn. 9. Design View penceresinde, OrderGrid denetimini tklayn ve sonra Common GridView Tasks mensn grntlemek iin akll etiketi tklayn. 10. Common GridView Tasks mensnde Auto Format balantsn tklayn. 11. AutoFormat iletiim kutusunda Classic emasn sein ve sonra OKi tklayn. Bu formda, veri kaynana GridView denetimi balamak iin kod yazacaksnz. GridView denetimindeki stunlar kendiniz tanmlayacaksnz. 12. Common GridView Tasks mensnde Edit Columns balantsn tklayn. 13. Fields iletiim kutusundaki Available Fields liste kutusunda, BoundField ve ardndan Addi tklayn. 14. BoundField properties liste kutusunda, HeaderText zelliini Product Name olarak ayarlayn. 15. Available Fields liste kutusunda, BoundField ve ardndan yeniden Addi tklayn. 16. BoundField properties liste kutusunda, yeni stunun HeaderText zelliini Total olarak ve DataFormatString zelliini de {0:N0} (0 karakterlerinin her ikisi de sfr anlamndadr-bu biim veriyi ondalk basamak olmadan say olarak gsterir) olarak ayarlayn. ItemStyle

618

Ksm VI

Web Uygulamalar Oluturmak

zelliini geniletin ve sonra HorizontalAlign zelliini Right (standart olarak, saysal veri saa hizalanm olarak gsterilir) olarak ayarlayn. 17. Auto-generate fields onay kutusunu temizleyin ve sonra OKi tklayn. 18. Source dmesini tklayn ve form zerinde denetimleri aralarnda birka bo satr olarak ekilde alt alta yerletirmek iin body esini aadaki gibi deitirin:
<body> <form id=form1 runat=server> <div> <asp:Label ID=OrderLabel ...></asp:Label> <br /> <br /> <asp:HyperLink ID=HyperLink1 ...></asp:HyperLink> <br /> <br /> <asp:GridView ID=OrderGrid ... > ... </asp:GridView> </div> </form> </body>

Son grev, form zerinde mteri ID numarasn grntlemek iin kod yazmak, GridView denetimini ve stunlarn OrderHistory veri kaynana balamak ve daha sonra veriyi grntlemektir.

GridView denetimini veri kaynana balamak iin kod yazn


1. Solution Explorerda, OrderHistory.aspxi geniletin ve sonra, Code and Text Editor penceresinde OrderHistory formunun C# kodunu grntlemek iin OrderHistory.aspx. csyi ift tklayn. 2. Page_Load yntemine aadaki ifadeyi ekleyin:
protected void Page_Load(object sender, EventArgs e) { string customerId = Request.QueryString[CustomerID]; }

Kullanc, form zerindeki GridView denetiminde grntlenen mterilerden birinin hyperlink (kpr) denetimini tkladnda, CustomerData formundan OrderHistory formunun arldn hatrlayn. Kpr denetimi, seilen mteri ID numarasn ieren bir sorgu dizesi ile bir URL belirtir. rnein, kullanc mteri IDsi ALFKI olan mteriyi tklarsa, kpr CustomerID=ALFKI sorgu dizesi deeri ile OrderHistory formunu aar. Bir Web formunun Request nesnesi, forma geirilen sorgu dizesi deer iftlerinin koleksiyonudur. Deerlere say yoluyla ya da adla eriebilirsiniz. Yazdnz kod, Request nesnesinden CustomerID adyla deer iftini elde eder ve bir yerel dize deikeninde saklar.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

619

3. Page_Load yntemine aadaki kodu ekleyin:


protected void Page_Load(object sender, EventArgs e) { string customerId = Request.QueryString[CustomerID]; this.OrderLabel.Text += + customerId; this.Title += + customerId; }

Bu ifadeler, mteri IDsini form zerinde grntlenen metne ve formun balndaki metne ekler. 4. Page_Load yntemine aadaki kodu ekleyin:
protected void Page_Load(object sender, EventArgs e) { ... OrderHistoryDataContext context = new OrderHistoryDataContext(); var orderDetails = context.CustOrderHist(customerId); this.OrderGrid.DataSource = orderDetails; }

Bu kod, OrderHistoryDataContext snfn kullanarak yeni bir DataContext nesnesi yaratr. OrderHistoryDataContext snf, CustOrderHist sakl yordamna dayal yeni bir veri kayna yarattnzda Object Relational Designer tarafndan yaratlmtr. DataContext trne bir sakl yordam eklediinizde, Object Relational Designer tarafndan retilen kod, ayn adla bir yntem salayarak sakl yordam ortaya karr. nceki kod rneindeki ikinci ifade, Northwind veritabanndaki CustOrderHist sakl yordamn aran CustOrderHist yntemini arr. Parametre olarak customerId deikeni geirilir. Bu sakl yordam tarafndan retilen sonu kmesi, OrderGrid denetimi iin veri kayna olarak kullanlr. 5. Page_Load yntemine aadaki kodu ekleyin:
protected void Page_Load(object sender, EventArgs e) { ... BoundField productName = this.OrderGrid.Columns[0] as BoundField; productName.DataField = ProductName; BoundField total = this.OrderGrid.Columns[1] as BoundField; total.DataField = Total; this.OrderGrid.DataBind(); }

Bu kod blou, OrderGrid denetimindeki iki stunu, veri kaynandaki uygun zelliklere balar. zellikleri ad ile dize olarak belirtebildiinize dikkat edin. OrderGrid denetiminin DataBind yntemi, veri kaynann sakl yordam altrmasna ve klavuzdaki stunlarn sonularn gsteren sonu kmesi retmesine neden olur.

620

Ksm VI

Web Uygulamalar Oluturmak

Tamamlanan uygulamay snayn


1. Uygulamay altrn ve John adyla oturum an. 2. CustomersData Web formunda, Customer ID stunundaki deerlerin imdi kpr olarak grntlendiine dikkat edin:

3. lk mteri ALFKI nin kprsn tklayn. ALFKInin siparilerini gsteren OrderHistory formu belirmelidir.

Blm 29

Bir Web Sitesinin Gvenliini Salamak ve Web Formlaryla Verilere Erimek

621

4. Return to Customers kprsn tklayn. 5. CustomersData Web formunda, baka bir mterinin Customer ID stunundaki kprsn tklayn. OrderHistory Web formu uygun mterinin sipari gemiini grntlemelidir. 6. Veriyi incelemeyi bitirdikten sonra Internet Explorer kapatn ve Visual Studio 2008e dnn. Bu blmde, bir veritabannda veri saklayan bir Web uygulamasnn oluturulmas ve gvenliinin salanmasnn temelleri gsterildi. oklu ortam becerilerini birletiren yksek derecede etkileimli Web uygulamalar oluturmakla ilgileniyorsanz, Microsoft Silverlight gzden geirmelisiniz. Silverlight hakknda daha fazla bilgiyi http://silverlight.net adresinde bulabilirsiniz.
n

Bir sonraki blme gemek istiyorsanz Visual Studio 2008i ak brakn ve Blm 30a gein. Visual Studio 2008den imdi kmak istiyorsanz File mensnde Exiti tklayn. Save iletiim kutusu grnrse, Yesi tklayarak (Visual Studio 2008 kullanyorsanz) ya da Savei tklayarak (Visual C# 2008 Express Edition kullanyorsanz) projeyi kaydedin.

Blm 29 Hzl Bavuru


Bunun in
Bir oturum ama Web formu yaratmak Bir ASP.NET Web sitesi iin gvenlii yaplandrmak Form tabanl gvenlik uygulamak

unu Yapn
Yeni bir Web formu yaratn. Kullanclarn kimliini dorulamak iin bir Login denetimi ekleyin. Kullanc eklemek ve tutmak, rolleri tanmlamak, eriim kurallar yaratmak iin ASP.NET Web Site Administration Toolu kullann. (Bu arac balatmak iin Website mensnde ASP.NET Configuration tklayn.) web.config dosyasn dzenleyin. <authentication mode> zniteliini Forms olarak ayarlayn, oturum ama formunun URLsini salayn, gerekli kimlik dorulama parametrelerini belirtin. rnein:
<authentication mode=Forms> <forms loginUrl=LoginForm.aspx timeout=5 cookieless=AutoDetect protection=All /> </authentication>

Veritabanndaki veriyi grntlemek iin bir Web formu yaratmak

Web formuna bir veri kayna denetimi ekleyin ve uygun veritabanna balanmak iin bunu yaplandrn. Web formuna bir GridView denetimi ekleyin ve DataSourceID zelliini veri kayna denetimi olarak ayarlayn.

622

Ksm VI

Web Uygulamalar Oluturmak

Bir Web formunda veriyi ynetilebilir bloklar halinde almak ve grntlemek GridView denetimini kullanarak bir veritabanndaki satrlar deitirmek GridView denetimindeki bir satr seerek bir Web formundan dierine gezinmek

GridView denetimin AllowPaging zelliini True olarak ayarlayn. PagerSize zelliini her sayfada grntlenecek satr saysna ayarlayn . PagerSettings ve PagerStyle zelliklerini Web formun stiliyle eleecek biimde deitirin. Veri kaynann veri gncellemeyi saladndan emin olun. Common GridView Tasks akll etiket mensn kullanarak, Enable Updatingi sein. Bir stunu bir HyperLinkField denetimi olarak tanmlayn. DataNavigateUrlFormatString zelliindeki hedef form iin URL ve istee bal sorgu dizesi ve DataNavigateUrlFields zelliinde sorgu dizesi parametresi olarak geirilecek veriyi belirleyin. Hedef formunda, Web formunun Request zelliinin QueryString koleksiyonuna erierek herhangi bir sorgu dizesi parametresini elde edin.

alma zamannda bir veri kaynana GridView denetimi balamak

GridView denetiminin DataSource zelliini veri kayna olarak ayarlayn. GridView denetimindeki boundfield stunlarnn DataField zelliini, veri kaynanda grntlenen veriyi tutan zelliin ad olarak ayarlayn.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak


Bu blm tamamladktan sonra renecekleriniz:
n n n

Basit Web yntemlerini yerine getiren bir Web servisi yaratmak. Windows Internet Explorer kullanarak bir Web servisinin tanmn grntlemek . Bir Web yntemine parametre olarak geirilebilecek ve bir Web ynteminden dnebilecek snflar tasarlamak. Bir istemci uygulamasnda Web servisi iin bir bavuru yaratmak. Bir Web yntemini balatmak.

n n

nceki blmler, Microsoft ASP.NET kullanarak Web formlar ve etkileimli Web uygulamalar yaratmay gsterdiler. Bunlar, istemcinin bir Web tarayc olduu durumlarda uygun yaklamlarken, istemcinin Web tarayc olmad durumlarla daha fazla karlaacaksnz. nceki blmlerde de belirtildii gibi Internet byk bir adr. Web servislerini kullanarak, Internet zerine yaylm eleri kullanan datlm sistemler oluturmak olasdr (veritabanlar, gvenlik sistemleri, finansal bileenler vb). Bu blmn amac, size Internet zerinden eriilebilen ve daha byk uygulamalara dahil olabilen bileenlerin nasl tasarlandn, oluturulduunu ve snandn gstermektir. Ayrca, bir Web servisi tarafndan yerine getirilen yntemler kullanan bir uygulamann nasl oluturulacan da reneceksiniz. Not Bu blmn amac, Web servisleri ve Microsoft Windows Communication Foundation (WCF) konusuna giri yapmaktr. WCFnin almas ve WCF kullanarak gvenlik servislerinin oluturulmas hakknda daha ayrntl bilgi iin, Microsoft Windows Communication Foundation Step by Step, Microsoft Press, 2007 kitabna bavurmalsnz.

Web Servisi Nedir?


Web servisi, istemcilere ya da tketicilere baz yararl olanaklar sunan bir bileendir. Web servisi evrensel eriimi olan bir bileen gibi dnlebilir (uygun eriim haklarna sahipseniz, bilgisayarnz nternete bal olduu srece dnyann herhangi bir yerinden Web servislerini kullanabilirsiniz). Web servisleri veri iletimi iin standart ve kabul edilmi bir iletiim kural olan HTTP ve XML tabanl veri biimini kullanr. HTTP ve XML, Microsoft .NET Framework

623

624

Ksm VI

Web Uygulamalar Oluturmak

dndaki dier programlama ortamlar tarafndan da kullanlabilen standartlam teknolojilerdir. Dolaysyla, Visual Studio 2008 kullanarak Web servileri oluturabilirsiniz ve Java gibi tamamen farkl ortamlarda alan istemci (kullanc denir) uygulamalar bunlar kullanabilir. Bunun tersi de dorudur; Java kullanarak Web servisleri oluturabilir ve C# dilinde kullanc uygulamalar yazabilirsiniz. Visual Studio 2008 ile Microsoft Visual C++, Microsoft Visual C# ya da Microsoft Visual Basic kullanarak Web servisleri oluturabilirsiniz. Bununla birlikte, istemci uygulamas dnldnde, Web servisinin yaratld dil ve hatta Web servisinin grevlerini nasl gerekletirdii nemsizdir. Web servisinin istemci uygulamalar, kullancnn bak asndan bir dizi iyi oluturulmu yntemi gerekletiren bir arabirimdir. Btn tketicilerin yapmas gereken, standart internet iletiim kurallarn kullanarak, parametreleri XML biiminde geirerek ve yantlar yine XML biiminde alarak bu yntemleri armaktr. .NET Frameworkn arkasndaki itici glerden biri de programlanabilir Web kavramdr. Fikir udur; ileride sistemler, birden ok Web servisinin sunduu veri ve servisleri kullanarak oluturulacaktr. Web servisleri sistemler iin temel eleri sunarlar, Web onlara eriilmesini salar ve program gelitiriciler de onlar anlaml yollardan birbirlerine balar. Web servisleri farkl sistemleri bir araya getirmek iin kullanlan anahtar birletirme teknolojileridir; birok kurumdan kuruma (B2B) ve kurumdan tketiciye (B2C) uygulamalarnn temelini olutururlar.

SOAP Rol
Simple Object Access Protocol (SOAP - Basit Nesne Eriim Protokol), kullanclarn Web servislerine istekler gndermek ve onlardan yantlar almak iin kullandklar iletiim kuraldr. SOAP, HTTP (Web tarafndan HTML sayfalarn gndermek ve almak iin kullanlan iletiim kural) stnde oluturulmu basit bir iletiim kuraldr. SOAP, bir kullancnn bir XML Web servisi zerinde harekete geirmek isteyecei yntemlerin adlarn belirtmek; parametreleri ve dn deerlerini; ve parametrelerin ve dn deerlerinin trlerini tanmlamak iin bir XML szdizimi tanmlar. Bir istemci Web servisini armak iin, bu XML szdizimini kullanarak yntemi ve parametreleri belirtmesi gerekir. SOAP bir endstri standard olarak benimsenmektedir. levi, platformlar aras alabilirlii gelitirmektir. SOAPn gc, dier endstri standard teknolojilerini (HTTP ve XML) temel almasnn yan sra basitliidir. SOAP belirtimleri birok eyi tanmlar. En nemlileri unlardr:
n n n n

Bir SOAP iletisinin biimi Verinin nasl kodlanaca letilerin (yntem arlar) nasl gnderilecei Yantlarn nasl ilenecei

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

625

SOAPn nasl altnn ayrntlar ve SOAP iletisinin isel biiminin tam olarak tanm bu kitabn kapsam dndadr. Byk ihtimalle hibir zaman SOAP iletilerini kendinizin yaratmas ve biimlendirmeniz gerekmez. nk birok gelitirme arac, Visual Studio 2008 de dahil, Web servisleri ve istemci uygulamalar oluturan programclara uygun API sunarak, bu sreci otomatikletirir.

Web Servisi Tanmlama Dili Nedir?


Bir SOAP iletisinin gvdesi XMLdir. Bir istemci uygulamas bir Web yntemini ardnda, Web sunucusu, istemciden, yntemin parametrelerini kodlamak zere belirli bir dizi etiketi kullanmasn bekler. Bir istemci hangi etiketin ya da XML emasnn kullanlacan nereden bilir? Yant udur: bir XML Web servisinin, sorulduunda bir tanmlamay kendisinin salamas beklenir. Web servisinin cevab, Web servisi tanmlayan bir baka XML belgesidir. Bu belge Web Service Description (Web Servisi Tanmlama) olarak bilinir. Bu belge iin kullanlan XML emas standartlatrlmtr ve Web Services Description Language (WSDL, Web Servisi Tanmlama Dili) olarak adlandrlr. Bu tanm, istemci uygulamann, Web sunucusunun anlayaca biimde bir SOAP karl oluturabilmesi iin yeterli bilgi salar. WSDLnin ayrntlar bu kitabn kapsam dndadr fakat Visual Studio 2008, bir Web servisi iin WSDLi teknik olarak inceleyen aralar ierir. Visual Studio 2008 daha sonra, bir proxy snf tanmlamak iin bilgiyi kullanr. Bylece, istemci uygulama bu proxy snf zerindeki normal yntem arlarn, proxynin Web zerinde gnderdii SOAP isteklerine dntrebilir. Bu blmdeki altrmalarda bu yaklam kullanacaksnz.

Web Servislerinin levsel Olmayan Gereksinimleri


Balangta, Web servislerini ve SOAP iletileri gndermek ve almak iin ilevsel yaklam zerinde younlam ilgili standartlar tanmlamak iin aba harcanmtr. Web servislerinin datlm hizmetleri bir araya getirmek iin nemli bir teknoloji haline gelmesinden ksa bir sre sonra SOAP ve HTTPnin tek bana zemedii sorunlar olduu anlald. Bu sorunlar u ekilde sralanabilir:
n

Gvenlik Bir Web servisi ile bir kullanc arasnda giden SOAP iletilerinin nternette giderken iine girilmediinden ve deitirilmediinden nasl emin olabilirsiniz? Aldnz SOAP iletisinin size iddia edildii gibi bir Web servisi ya da kullanc tarafndan gnderildiinden ya da bilgi elde etmeye alan baz sahte siteler tarafndan gnderilmediinden nasl emin olabilirsiniz? Bir Web servisine girii sadece belirli kullanclarla nasl snrlandrabilirsiniz? Bunlar ileti btnl, gizlilii ve kimlik dorulamayla ilgili sorunlardr ve nternetten yararlanan datlm uygulamalar oluturacaksanz bunlar balca kayglardr.

626

Ksm VI

Web Uygulamalar Oluturmak

1990larn balarnda, datlm sistemler oluturmak iin aralar salayan birok satc sonradan Organization for the Advancement of Structured Information Standards ya da OASIS olarak bilinen bir kurum oluturdular. lk Web servis alt yaplarnn eksiklikleri belirginletike, OASIS yeleri bu sorunlar ele aldlar ve WS-Security bildirimi olarak bilinen zm rettiler. WS-Security bildirimi Web servisleri tarafndan gnderilen iletilerin nasl korunacan aklar. WS-Securityye abone olan satclar bu bildirimin gereklerini karlayan kendi uygulamalarn salarlar ve bunu genellikle eitli ifreleme dzenekleri ve sertifika kullanarak yaparlar.
n

lke WS-Security bildirimi gelimi bir gvenlik salamasna ramen gelitiriciler bunu uygulamak iin hl bir kod yazma gerei duyarlar. Farkl gelitiriciler tarafndan yaratlan Web servisleri, uygulamak iin setikleri gvenlik dzeneinin skl asndan farkllk gsterebilirler. rnein, bir Web servisi dierlerine gre daha zayf olan ve kolaylkla krlabilen bir ifreleme kullanabilir. Bu Web servisine olduka gizli bilgi gnderen bir kullanc daha yksek seviyede gvenlik iin srar edebilir. Bu, ilkeye bir rnektir. Dier rnekler hizmetin kalitesi ve Web servisinin gvenilirliidir. Bir Web servisi farkl derecelerde gvenlik, hizmet kalitesi ve gvenilirlik uygulayabilir ve istemci uygulamasn buna gre cretlendirebilir. stemci uygulamas ve Web servisi gereklilikler ve maliyete dayanarak kullanlacak servisin dzeyine karar verebilirler. Ancak, bu grme iin istemci ve Web servisin ilkeleri ayn biimde kavramalar gerekmektedir. WS-Policy bildirimi bir Web servisinin ilkelerini tanmlamak ve bildirmek iin genel amal bir model ve ilgili szdizimini salar. Ynlendirme ve adresleme Bir Web sunucusu iin, birok sayda sunucudan birine bir Web servis isteini tekrar ynlendirebilmek yararldr. rnein, birok leklendirilebilir sistem, yk dengelemesinden yararlanr; bir sunucuya gnderilen istekler dier bilgisayarlara ykn datlmas iin bu sunucu tarafndan yeniden ynlendirilir. Sunucu, yklemeyi dengelemek iin birok algoritma kullanabilir. nemli olan nokta, bu yeniden ynlendirmenin Web servis isteini yapan istemciye kar effaf olmasdr. Web servis isteklerini yeniden ynlendirme, yneticinin bakm yapmak iin bir bilgisayar kapatmas gerektiinde de yararldr. Aksi durumda, bu bilgisayara gnderilecek olan istekler e bir bilgisayara yeniden ynlendirilebilir. WS-Addressing bildirimi Web servis isteklerini ynlendirmek iin bir ereve tanmlamaktadr.

Not Yazlm gelitiriciler, WS-Security, WS-Policy, WS-Addressing ve WS-* bildirimleri olarak toplanan dier WS-bildirimlerine bavurur.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

627

Windows Communication Foundationn Rol


Web servislerinin gvenlii, ilkesi ve adreslemesini standart hale getirmek nem kazanmaya baladka, Microsoft, Web Services Enhancements (WSE) paketinde kendi WS-Security, WS-Policy ve WS-Addressing bildirimlerini salar. Bu bildirimleri Microsoft Web sitesinden cretsiz olarak indirebilirsiniz. Visual Studio 2008 kullanarak Web servisleri gelitiriyorsanz tm bunlarn anlam nedir? Visual Studio 2008 ile, ASP.NET ve WCF teknolojilerini kullanarak Web servisleri oluturabilirsiniz. Normal ASP.NET Web servisleri, dorudan eitli WS-* bildirimlerini desteklemez. Bunun yerine, gvenlik gibi zellikler salamak iin Microsoftun WSE paketini kullanabilirsiniz. Bylece, Visual Studio, .NET Framework ve WSE kullanarak, hzlca Web servisleri ve Web servisleri ile etkileimli olarak iletiim kurabilen istemci uygulamalar ve herhangi bir iletim sistemi zerinde alan istemci uygulamalar oluturabilirsiniz. Neden daha sonra WCF gerekir? lk olarak, WCF, .NET Framework 3.0 srm ile ortaya km son teknolojidir. Ek paketler indirmeniz, yklemeniz ve yaplandrmanz gerekmeden yaygn WS-* bildirimlerinin tmyle tmleik uygulamasn salar. kinci olarak, Web servisleri, Windows iletim sistemleri iin datlm uygulamalar yaratabileceiniz teknolojilerden sadece biridir. Dierleri, Enterprise Services, .NET Framework Remoting ve Microsoft Message Queue (MSMQ) teknolojileridir. Windows iin datlm uygulama oluturuyorsanz, hangi teknolojiyi kullanmalsnz ve ilerde gerekirse baka bir teknolojiye geii zor mudur? WCFnin amac, bu teknolojilerin birou iin birletirilmi programlama modeli salamaktr. Bylece, servisler ve uygulamalar birletirmek iin kullanlacak temeldeki mekanizmadan mmkn olduunca bamsz uygulamalar oluturabilirsiniz. (WCFnin, World Wide Web kadar, Web dndaki ortamlarda alan servislere de uygulandna dikkat edin.) Bir uygulamann ya da servisin programatik yapsn iletiim altyapsndan tmyle ayrmak, imkansz deilse de gerekten olduka zordur fakat WCF, ou kez bunu yapabilmenizi salar. Ayrca, WCF kullanarak, nceki teknolojilerin bir ou ile geriye dnk uyumluluk salayabilirsiniz. rnein, bir WCF istemci uygulamas, WSE kullanarak oluturduunuz bir Web servisi ile kolayca iletiim kurabilir. zet olarak, Windows iin datlm uygulamalar ve servisler oluturmay dnyorsanz, WCF kullanmalsnz. Bu blmdeki altrmalar bunu nasl yapacanz gsterecek.

Bir Web Servisi Oluturmak


Bu blmde, ProductService Web servisini oluturacaksnz. Bu Web servisi iki Web yntemini harekete geirecek. lk yntem, bir kullancnn, Northwind Traders veritabanndaki rnlerden birinden belirli bir miktar aldnda toplam tutar hesaplamasn salayacak. kinci yntem ise rnn adn alp o rnn ayrntl bilgilerini dndrecek.

628

Ksm VI

Web Uygulamalar Oluturmak

ProductService Web Servisini Yaratmak


lk altrmada, ProductService Web servisini yaratacak ve yeni bir WCF servis projesi oluturduunuzda Visual Studio 2008 tarafndan retilen kodu inceleyeceksiniz. Sonraki altrmalarda, HowMuchWillItCost Web yntemini tanmlayacak ve gelitireceksiniz. Daha sonra Web servisinin, beklendii gibi alp almadn snayacaksnz.

Web servisini yaratn ve rnek kodu inceleyin


1. Visual Studio 2008i balatn. 2. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, File mensnde Newi iaret edin ve daha sonra Web Site tklayn. 3. Microsoft Visual Web Developer 2008 Express Edition kullanyorsanz, File mensnde New Web Site tklayn. 4. New Web Site iletiim kutusunda, WCF Service ablonunu tklayn. Location alr listesinde File Systemi sein ve Belgeler klasrnzn altndaki \Microsoft Press\Visual CSharp Step By Step\Chapter 30\NorthwindServices klasrn belirleyin. Language zelliini Visual C# olarak ayarlayn ve daha sonra OKi tklayn. Visual Studio 2008 App_Code ve App_Data olarak adlandrlan klasrler, Service.svc adnda bir dosya ve Web.config adnda bir yaplandrma dosyas ieren bir Web sitesi retir. Bir Web servisi rneinin kodu, App_Code klasrndeki Service.cs dosyasnda saklanan Service snfnda tanmlanr ve Code and Text Editor penceresinde grntlenir. Service snf, App_Code klasrndeki IService.cs dosyasnda saklanan IService adnda arabirim rneini gerekletirir. 5. C:\...\NorthwindServices\ projesini tklayn. Properties penceresinde, Use dynamic ports zelliini False olarak ve Port number zelliini de 4500 olarak ayarlayn. Varsaylan ayar olarak, Visual Studio 2008 ile gelen Development Web sunucusu, bilgisayarnzda alan dier alar tarafndan kullanlan dier balant noktalaryla akma olasln azaltmak iin rastgele bir balant numaras seer. ASP.NET Web sitelerini Microsoft Internet Information Services (IIS) gibi bir retim sunucusuna kopyalamadan nce bir gelitirme ortamnda oluturuyor ve snyorsanz bu zellik olduka yararldr. Ancak, bir Web servisi olutururken istemci uygulamalarnn balant noktas numaralarna balanabilmeleri gerektii iin sabit balant noktas numaras kullanmak daha yararldr. 6. App_Code klasrn geniletin, Service.cs dosyasn farenin sa dmesiyle tklayn ve sonra Renamei tklayn. Dosya adn ProductsService.cs olarak deitirin. 7. Ayn teknii kullanarak, IService.cs dosyasnn adn IProductsService.cs olarak deitirin. 8. Code and Text Editor penceresinde grntlemek iin IProductsService.cs dosyasn ift tklayn.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

629

Bu dosya, IService adnda bir arabirimin tanmn ierir. IProductsService.cs dosyasnn en stnde, System, System.Collections.Generic ve System.Text ad alanlarna (daha nce grmtnz) bavuran using ifadelerini ve ardndan System.ServiceModel ve System. Runtime.Serialization ad alanlarna bavuran iki ifade daha bulacaksnz. System.ServiceModel ad alan, servisler ve ilemlerini tanmlamak iin WCF tarafndan kullanlan snflar ierir. WCF, nesneleri a zerinde gndermek iin veri akna dntrmek (serialization (seriletirme) sreci olarak bilinir) iin ve adan alnan veri akn tekrar nesnelere dntrmek (deserialization (seriyi kaldrma) sreci olarak bilinir) iin System.Runtime.Serialization ad alanndaki snflar kullanr. Bu blmde daha sonra, WCFnin nesneleri nasl seriletirdii ve serisini kaldrd hakknda daha fazlasn reneceksiniz. IProductsService dosyasnn balca ierii, IService adnda bir arabirim ve CompositeType adnda bir snftr. IService arabirimine nek olarak ServiceContract znitelii eklenmitir ve CompositeType snf DataContract znitelii ile etiketlenmitir. WCF servisinin yapsndan dolay, yazlm gelitirmenin nce anlama yaklamn benimseyebilirsiniz. nce anlama programlama yaptnzda, servisin uygulayaca arabirimler ya da contracts (anlamalar) tanmlarsnz ve daha sonra bu anlamalara uyan bir servis oluturursunuz. Bu yeni bir teknik deildir, kitap boyunca bu tekniin rneklerini greceksiniz. nce anlama programlamasnn kullanmnn arkasndaki nemli nokta, servisinizin tasarmna younlaabilmenizdir. Gerekirse, daha fazla programlama yapmadan nce, tasarmnzn zel bir donanm ya da yazlma bal olmadndan emin olmak iin hzlca gzden geirebilirsiniz; birok durumda istemci uygulamalarnn, WCF kullanarak oluturulmayabileceini ve hatta Windows zerinde almayabileceini hatrlayn. ServiceContract znitelii, snfn Web yntemleri olarak sergilenecek olan Web servisine uygulad yntemleri tanmlayarak bir arabirimi iaretler. Yntemlerin kendisi, OperationContract znitelii ile etiketlenmitir. Visual Studio 2008 ile salanan aralar, servis iin uygun WSDL belgesini retmeye yardmc olmak iin bu znitelikleri kullanr. OperationContract znitelii ile iaretlenmemi arabirimdeki yntemler, WSDL belgesinde kapsanmayacaktr ve bundan dolay Web servisi kullanan istemci uygulamalara ulalamayacaktr. Bir Web yntemi parametreler alrsa ya da bir deer dndrrse, bu parametrelerin ve deerin verisi, a zerinde iletilebilecek biime ve daha sonra da tekrar nesnelere dntrlmek zorundadr (daha nce bahsedildii gibi, bu sre seriletirilme ve seriyi kaldrma olarak bilinir). eitli Web servisleri standartlar, bir Web servisinin WSDL tanm paras olarak, saylar ve dizeler gibi basit veri trlerinin seriletirilmi biimini belirlemek iin teknikler tanmlar. Bununla birlikte, ayrca snflar ve yaplara dayal olarak kendi karmak veri trlerinizi de tanmlayabilirsiniz. Bu trleri bir Web servisinde kullanlr hale getirecekseniz, nasl seriletirilecei ve serinin kaldrlaca bilgisini salamanz gerekir. IService arabirimindeki GetDataUsingDataContract yntemi

630

Ksm VI

Web Uygulamalar Oluturmak

tanmna bakarsanz, CompositeType trnde bir parametre gerektirdiini grrsnz. CompositeType snf, snfn, SOAP istei ya da yant iletisinin paras olarak bir XML ak eklinde seriletirilebilecei ve serisinin kaldrlabilecei bir tr tanmlamas gerektiini belirten, DataContract znitelii ile iaretlenir. A zerinde gnderilen seriletirilmi aka dahil etmek istediiniz her yenin DataMember znitelii ile etiketlenmesi gerekir. 9. Code and Text Editor penceresinde grntlemek iin ProductsService.cs dosyasn ift tklayn. Bu dosya, IService arabirimini uygulayan ve bu arabirim tarafndan tanmlanan GetData ve GetDataUsingDataContract yntemlerini salayan Service adnda bir snf ierir. Bu snf Web servisidir. Bir istemci uygulamas bu Web servisindeki bir Web yntemini ardnda, bir SOAP istek iletisi retir ve Web servisini tutan Web sunucusuna gnderir. Yntem tamamlandnda, Web sunucusu istemci uygulamasna geri gnderilen bir SOAP yant iletisi oluturur. 10. Bu dosya, Web servisinin servis dosyasdr; ana bilgisayar ortam tarafndan, bir istemci uygulamadan istek alndnda hangi snfn ykleneceini belirlemek iin kullanlr. Not Error List penceresi aksa, u iki hatay ieren Service.svc dosyasnn belirdiine

dikkat edin: Keyword, identifier, or string expected after verbatim specifier: @ (@ iaretinden sonra anahtar szck, tanmlayc ya da dize beklenir) ve A namespace does not directly contain members such as fields or methods (Bir ad alan, direk olarak alanlar ya da yntemler gibi yeler iermez). zm daha sonra yeniden oluturduunuzda, bu hatalar yok olur ve bu hatalar gvenle yok sayabilirsiniz.

@ ServiceHost ynergesinin Service zellii, Web servis snfnn adn ve CodeBehind zellii de bu snfn kaynak kodunun konumunu belirtir. pucu WCF servisinizin kaynak kodunu Web sunucuya yerletirmek istemezseniz, bunun

yerine bir derleme salayabilirsiniz. Daha sonra, @ Assembly ynergesini kullanarak, bu derlemenin adn ve konumunu belirtebilirsiniz. Daha fazla bilgi iin, Visual Studio 2008 ile sunulan belgelerde @ Assembly directive yazarak arama yapn.

imdiye kadar bir WCF servisinin yapsn grdnz; ProductsService Web sunucusu iin servis ve veri szlemelerini belirten arabirimi ve snf tanmlayabilir ve daha sonra servis szlemesini uygulayan bir snf yaratabilirsiniz.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

631

ProductsService Web servisi iin anlamalar tanmlayn


1. Code and Text Editor penceresinde IProductsService.cs dosyasn grntleyin. IService arabiriminin adn IProductsService olarak deitirin:
[ServiceContract] public interface IProductsService { ... }

2. IProductsService arabiriminde, GetData ve GetDataUsingDataContract yntemlerinin tanmn deitirin ve HowMuchWillItCost ve GetProductInfo yntemlerinin yerine aada gsterildii gibi, bu yntemleri yerletirin. Her Web ynteminde OperationContract zniteliini devam ettirdiinizden emin olun.
[ServiceContract] public interface IProductsService { [OperationContract] decimal HowMuchWillItCost(int productID, int howMany); [OperationContract] ProductInfo GetProductInfo(int productID); }

HowMuchWillItCost yntemi bir rn IDsi ve miktar parametresi alr ve bu miktardaki rnn fiyatn gsteren bir decimal deer dndrr. GetProductInfo yntemi rn ID bilgisini alr ve rnn ayrntl bilgisini ieren bir ProductInfo nesnesi dndrr. Sonraki admda ProductInfo snfn tanmlayacaksnz. 3. IProductsService.cs dosyasndan CompositeType snfn kaldrn ve aadaki gibi DataContract znitelii ieren ProductInfo snfn ekleyin:
[DataContract] public class ProductInfo { }

4. ProductInfo snfna aadaki genel zellikleri ekleyin. Veritabanndaki Products tablosunun her stunu iin bir zellik vardr. Her zellii DataMember znitelii ile iaretleyin:
[DataContract] public class ProductInfo { [DataMember] public int ProductID {get; set;} [DataMember] public string ProductName {get; set;}

632

Ksm VI

Web Uygulamalar Oluturmak


[DataMember] public int? SupplierID {get; set;} [DataMember] public int? CategoryID {get; set;} [DataMember] public string QuantityPerUnit {get; set;} [DataMember] public decimal? UnitPrice {get; set;} [DataMember] public short? UnitsInStock {get; set;} [DataMember] public short? UnitsOnOrder {get; set;} [DataMember] public short? ReorderLevel {get; set;} [DataMember] public bool? Discontinued {get; set;}

Veritabanndaki null deerler alabilen stunlara uygun zelliklerin, null olabilen trler (bir string tr olduundan, otomatik olarak null deerlere izin veren bir bavuru tr olan QuantityPerUnit dndaki trler) kullanlarak tanmlandna dikkat edin. Ayrca, tm zelliklerin okuma ve yazma izinlerini desteklediinden emin olmalsnz. WCF tarafndan kullanlan seriletirme mekanizmas, snf tanmlarken birka basit kurala uyduunuz srece, otomatiktir ve olduka aktr. zellikle, seriletirme sadece alma zaman genel alanlar ve zellikler ieren nesneler ilettiinde kullanlabilir; zel yeler seriletirilemez. Ayrca, tm zelliklerin get ve set eriimcilerinin her ikisine de sahip olmas gerektiine dikkat edin. Bunun nedeni, XML seriletirme srecinin, iletildikten sonra bu veriyi tekrar nesneye dntrebilmesi gerekmesidir. Ayrca, snfn varsaylan bir kurucu (hibir parametre almayan) salamas gerekir. SOAP iin kullanlan snflar, veri iletimi iin tayclar olarak tasarlamak yaygn bir kullanmdr. Gerekirse, bu veri yaplar iin i mant salayan, aldatc grnm olarak grev yapan ek ilevsel snflar tanmlayabilirsiniz. Kullanclar ve uygulamalar, bu aldatc grnm kullanarak veriye eriebilirler. Not System.Xml.Serialization ad alannn eitli SOAP znitelii snflarn kullanarak

seriletirme mekanizmas dzenleyebilir ya da System.Runtime.Serialization ad alannn ISerializable arabirimini uygulayarak kendi XML seriletirme mekanizmanz tanmlayabilirsiniz.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

633

Sonraki aama, IProductsService arabirimini uygulayan ProductsService snfn tanmlamaktr. Bu snftaki yntemler, Northwind veritabanndan rn bilgisini elde edecektir; bu bilgiyi elde etmek iin bir varlk snf ve veri ierii eklemekle ie balayacaksnz.

IProductsService arabirimini uygulayn


1. Website mensnde Add New Item tklayn. 2. Add New Item iletiim kutusunda, LINQ to SQL Classes ablonunu tklayn, Name metin kutusuna Product.dbml yazn, Language alr listesinde Visual C# sein ve daha sonra Addi tklayn. 3. Visual Studio 2008 Professional Edition ya da Enterprise Edition kullanyorsanz, View mensnde Server Explorer tklayn. 4. Visual Web Developer 2008 Express Edition kullanyorsanz, View mensnde Database Explorer tklayn. 5. Server Explorer (Visual Studio 2008 kullanyorsanz) ya da Database Explorerda (Visual Web Developer 2008 Express Edition kullanyorsanz), Northwind veritaban iin veri balantsn (Bilgisayarnz\sqlexpress.Northwind.dbo ya da Northwind.mdf) ve sonra da Tables geniletin. 6. Products tablosunu tklayn ve Object Relational Designer penceresine srkleyin. 7. File mensnde Save Allu tklayn. 8. Code and Text Editor penceresinde ProductsService.cs dosyasn grntleyin. Bu dosyadan Service snfn kaldrn. 9. Dosyaya ProductsService snfn ekleyin ve aadaki gibi, IProductsService arabirimini uygulamas gerektiini belirtin:
public class ProductsService : IProductsService { }

10. ProductsService snfna aadaki gibi, HowMuchWillItCost yntemini ekleyin:


public class ProductsService : IProductsService { public decimal HowMuchWillItCost(int productID, int howMany) { ProductDataContext pdc = new ProductDataContext(); decimal? cost = pdc.Products.Single( p => p.ProductID == productID).UnitPrice; decimal totalCost = 0; if (cost.HasValue)

634

Ksm VI

Web Uygulamalar Oluturmak


{ totalCost = cost.Value * howMany; } return totalCost; }

Bu yntem veritabanna balanr ve Northwind veritabanndan rn IDsi ile eleen rn tutarn elde etmek iin bir DLINQ sorgusu altrr. Dnen fiyat bilgisi null deilse, yntem istein toplam fiyatn hesaplar ve bu bilgiyi dndrr; aksi takdirde yntem 0 deeri dndrr. Not Bu yntem, giri parametreleri iin bir dorulama yapmaz. rnein, howMany

parametresi iin negatif bir deer belirtebilirsiniz. rn Web servisinde, bunun gibi hatalar yakalayacak, gnln tutacak ve bir zel durum oluturacaktnz. Ancak, zel durumun nedenlerini istemci uygulamasna geri gnderilmesinin, WCF servisinde gvenlik sonular vardr. Bu konu bu kitabn kapsam dndadr. Daha fazla bilgi iin, Microsoft Windows Communication Foundation Step by Step kitabna bavurun.

11. ProductService snfna GetProductInfo yntemini ekleyin:


public class ProductsService : IProductsService ... public ProductInfo GetProductInfo(int productID) { ProductDataContext pdc = new ProductDataContext(); Product product = pdc.Products.Single(p => p.ProductID == productID); ProductInfo prodInfo = null; if (product != null) { prodInfo = new ProductInfo(); prodInfo.CategoryID = product.CategoryID; prodInfo.Discontinued = product.Discontinued; prodInfo.ProductID = product.ProductID; prodInfo.ProductName = product.ProductName; prodInfo.QuantityPerUnit = product.QuantityPerUnit; prodInfo.ReorderLevel = product.ReorderLevel; prodInfo.SupplierID = product.SupplierID; prodInfo.UnitPrice = product.UnitPrice; prodInfo.UnitsInStock = product.UnitsInStock; prodInfo.UnitsOnOrder = product.UnitsOnOrder; } return prodInfo; } }

Bu ifadeler, Northwind Traders veritabanna balanmak ve veritabanndan rn bilgisini elde etmek iin DLINQ kullanr. HowMuchWillItCost yntemi gibi, bu yntemin zel durumlar ilemediine dikkat edin.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

635

Web servisini kullanmadan nce, ProductsService.cs dosyasndaki ProductsService snfna bavurmak iin Service.svc dosyasndaki yaplandrmay gncellemeniz gerekir.

Web servisini yaplandrn


1. Solution Explorerda, Code and Text Editor penceresinde grntlemek iin Service. svc dosyasn ift tklayn. Aada gsterildii gibi, ServiceHost ynergesinin Service ve CodeBehind zniteliklerini gncelleyin:
<%@ ServiceHost Language=C# Debug=true Service=ProductsService CodeBehind=~/App_Code/ProductsService.cs %>

Not Service.svc dosyas iin, Error List penceresinde daha nceki hatalarn ayns grntlenebilir. Ayn ekilde, uygulamay yeniden oluturduunuzda bu hatalar yok olmaldr, bu nedenle bu hatalar yoksayabilirsiniz. 2. Solution Explorerda, Web.config dosyasn ift tklayn. Code and Text Editor penceresinde, <system.serviceModel> esini bulun. Bu e, bu zm tarafndan gerekletirilen Web servisi iin biti noktas balama bilgisini belirten aadaki <services> esini ierir. (IMetadataExchange anlamasn uygulayan servisi bu blmde gzard edebilirsiniz.)
<system.serviceModel> <services> <service name=Service behaviorConfiguration=ServiceBehavior> <!-- Service Endpoints --> <endpoint address= binding=wsHttpBinding contract=IService/> ... </service> </services> <behaviors> ... </behaviors> </system.serviceModel>

WCF, zel bir Web servisi ile bir a adresini birletirmek iin biti noktalarn kullanr. IIS ya da ASP.NET Development Server kullanarak bir Web servisini barndryorsanz, IIS, kendi yaplandrma bilgisinde belirtilen adres zerinde gelen istekleri dinlediinden, biti noktanzn address zelliini bo brakmalsnz. Not IIS ya da ASP.NET Development Server kullanmak istemiyorsanz, kendi zel

barndrma uygulamalarnz oluturabilirsiniz. Bu durumlarda, biti noktas tanmnn paras olarak servis adresi belirtmeniz gerekir. Biti noktalar ve zel barndrmalar hakknda daha fazla bilgi iin Microsoft Windows Communication Foundation Step by Step kitabna bakn.

636

Ksm VI

Web Uygulamalar Oluturmak

3. Web.config dosyasnda, ProductsService servisi ve IProductsService anlamasna bavurmak iin, Service esinin name zniteliini ve biti noktas esinin contract zniteliini aadaki gibi deitirin:
<system.serviceModel> <services> <service name=ProductsService behaviorConfiguration=ServiceBehavior> <!-- Service Endpoints --> <endpoint address= binding=wsHttpBinding contract=IProductsService/> ... </service> </services> <behaviors> ... </behaviors> </system.serviceModel>

4. File mensnde Save Allu tklayn. 5. Solution Explorerda, Service.svcyi farenin sa dmesiyle tklayn ve daha sonra View in Browser tklayn. Internet Explorerda aadaki sayfa grntlenir. Web servisinin baaryla yaratlp datldn dorular ve Web servisine eriebilen basit bir istemci uygulamasnn nasl yaratlacan tanmlayan yardm bilgisi salar.

Not Web sayfasnda gsterilen balanty (http://localhost:4500/NorthwindServices/ Service.svc?wsdl) tklarsanz, Internet Explorerda Web servisinin WSDL tanmn ieren bir sayfa grntlenir. Bu XMLin uzun ve karmak parasdr fakat Visual Studio 2008 bu tanmdaki bilgiyi alarak, istemci uygulamann Web servisi ile iletiim kurmak iin kullanabilecei bir snf retmek zere kullanabilir. 6. Internet Explorer kapatn ve Visual Studio 2008e dnn.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

637

Web Servisleri, stemciler ve Proxyler


Bir Web servisinin, istekleri alp yantlar geri gndermek amacyla dzenekler salamak iin SOAP kullandn grdnz. SOAP, aktarlan veriyi biimlendirmek iin, Web sunucular ve tarayclar tarafndan kullanlan HTTP protokol stnde alan XMLi kullanr. XML Web servislerini gl klan da budur; SOAP, HTTP ve XML (en azndan teorik olarak) ok iyi anlalmlardr ve birok standart komitesinin konusudurlar. SOAP konuan bir istemci Web servisiyle iletiim kurabilir. Peki, bir istemci nasl SOAP konuur? ki yolu vardr: zor olan ve kolay olan.

SOAP Konumak: Zor Yol


Zor olan yolda, istemci uygulamasnn birka adm gerekletirmesi gerekir: 1. Web yntemini altran XML Web servisinin URLsini belirleyin. 2. Kullanlabilir durumdaki Web yntemlerinin, kullanlan parametrelerin ve dndrlen deerlerin tanmlarn elde edebilmek iin URLyi kullanarak bir Web Services Description Language (WSDL) aratrmas gerekletirin. Bu bir XML belgesidir. nceki altrmada, Internet Explorer kullanarak bunu nasl yapacanz grmtnz. 3. WSDL belgesini inceleyin, her ilemi bir Web isteine dntrn ve her parametreyi WSDL belgesinde tanmlanan biimde seriletirin. 4. stei, seriletirilmi veri ile birlikte, HTTP kullanarak URLye gnderin. 5. Web servisinin yantlamasn bekleyin. 6. WSDL belgesinde belirtilen biimleri kullanarak XML Web servisinin geri gnderdii veriyi uygulamann ileyebilecei anlaml deerlere dntrn. Bu, yalnzca bir yntemi harekete geirmek iin ok fazla i ve dolaysyla ok fazla hata olasl demektir.

SOAP Konumak: Kolay Yol


Kt haber; SOAP kullanmann kolay yolu, zor yolu kullanmaktan ok da farkl deildir. yi haber ise ilemin otomatikletirilebilmesidir, nk byk lde mekaniktir. Daha nce de bahsedildii gibi, Microsoft da dahil birok retici, bir WSDL tanmna dayal proxy snflar oluturabilen aralar salamaktadr. Proxy, SOAP kullanmann karmakln gizler ve Web servisinin yaynlad yntemlere dayanan basit programatik bir arabirim sunar. stemci uygulamas, Web yntemini, Proxydeki ayn adl yntemi harekete geirerek arr. Proxy, bu yerel arlar SOAP isteklerine dntrr ve Web servisine gnderir. Proxy yant bekler, verinin serisini kaldrr ve herhangi bir basit yntem arsndaki gibi istemciye geirir. Bu blmdeki altrmalarda bu yaklam ele alacaksnz.

638

Ksm VI

Web Uygulamalar Oluturmak

ProductService Web Servisini Kullanmak


ki Web yntemi gsteren bir Web servis ars yarattnz: belirli bir rnn ayrntlarn dndrmek iin GetProductInfo ve Northwind Tradersdan x rnnden n tane alndnda denmesi gereken tutar belirleyen HowMuchWillItCost. Aadaki altrmalarda, bu Web servisini kullanacak ve bu yntemleri kullanan bir uygulama yaratacaksnz. GetProductInfo yntemi ile balayacaksnz.

Bir Web Servisi istemci uygulamas an


1. Visual Studio 2008in baka bir rneini balatn. Bu nemlidir. NorthwindServices Web servisi projesini kapatrsanz ASP.NET Development Server durur, yani ona istemciden eriim salayamazsnz (Visual Studio 2008 kullanyorsanz ya da Visual Web Developer 2008 Express Edition kullanmyorsanz, kullanabileceiniz alternatif yaklam, istemci uygulamasn bir proje olarak Web servisi ile ayn zmde yaratmaktr). IIS kullanarak bir Web servisini retim ortamnda barndrdnzda bu sorun olumaz, nk IIS Visual Studio 2008ten bamsz olarak alr. nemli Kitabn bu blmndeki altrmalar iin Visual Web Developer 2008 Express

Edition kullandysanz, Visual Web Developer 2008 Express Editionn ikinci oluumu yerine Visual C# 2008 Express Edition balatn (Visual Web Developer 2008 Express Edition alr durumda brakn).

2. Microsoft Visual Studio 2008 ikinci oluumunda, Belgeler klasrnzdeki \Microsoft Press\Visual CSharp Step By Step\Chapter 30\ProductClient klasrndeki ProductClient zmn an. 3. Solution Explorerda, ProductClient.xaml dosyasn ift tklayarak Design View penceresinde grntleyin. Form aadaki gibi grnmelidir:

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

639

Form, kullancnn bir rn IDsi belirterek, Northwind veritabanndan rn bilgisini alabilmesini salar. Kullanc ayrca, bir miktar salayarak, o miktarda rnn toplam fiyatn elde edebilir. u anda formdaki dmeler hibir ilem yapmaz. Aadaki admlarda, veriyi elde etmek ve grntlemek iin ProductsService Web servisinden yntemleri armak iin gerekli kodu yazacaksnz.

stemci uygulamasnda, Web servisi armak iin kod ekleyin


1. Project mensnde Add Service Referencei tklayn. Add Service Reference iletiim kutusu alr. Bu iletiim kutusu, Web servislerine gzatmanz ve Web yntemlerini incelemenizi salar. 2. Address metin kutusuna http://localhost:4500/NorthwindServices/Service.svc yazn ve Goyu tklayn. Services kutusunda ProductsService servisi belirir. 3. ProductsService servisini geniletin ve beliren IProductsService arabirimini tklayn. Aadaki resimdeki gibi, Operations liste kutusunda, GetProductInfo ve HowMuchWillItCost ilemlerinin grndn dorulayn.

4. Namespace metin kutusundaki deeri NorthwindServices olarak deitirin ve OKi tklayn. Solution Explorerda Service References adnda yeni bir klasr grnr. Bu klasr, NorthwindServices adnda bir e ierir. 5. Solution Explorer ara ubuunda Show All Files dmesini tklayn. NorthwindServices klasrn ve sonra da Reference.svcmap klasrn geniletin. Reference.cs dosyasn ift tklayn ve Code and Text Editor penceresinde dosya ieriini inceleyin.

640

Ksm VI

Web Uygulamalar Oluturmak

Bu dosya, ProductClient.NorthwindServices ad alanndaki ProductsServiceClient snf da dahil, birka snf ve arabirim ierir. ProductsServiceClient, Visual Studio 2008 tarafndan, ProductsService Web servisinin WSDL tanmndan retilen proxy snfdr. ok sayda kurucunun yan sra, HowMuchWillItCost ve GetProductInfo yntemlerini de ierir. stemci uygulama, ProductsServiceClient snfnn rneini oluturabilir ve bu yntemleri arabilir. Bu durumda, bu yntemler, Web servisine gnderecekleri SOAP iletisine parametre olarak salanan bilgiyi paketleyen kodu arr. Web servisi yantladnda, dnen bilgi SOAP yantndan ayrlr ve istemci uygulamaya geri geirilir. Bu yolla, istemci uygulama bir Web servisindeki yntemi, tpk yerel yntemi ard gibi arabilir. 6. Design View penceresinde ProductClient.xaml formunu grntleyin. Get Product dmesini ift tklayarak, bu dme iin getProduct_Click olay ileyicisini oluturun. 7. Code and Text Editor penceresinde, aadaki using ifadesini ProductClient.xaml.cs dosyasnn en stne ekleyin:
using ProductClient.NorthwindServices;

8. getProduct_Click ynteminde, aada gsterilen deikeni yaratn:


private void getProduct_Click(object sender, RoutedEventArgs e) { ProductsServiceClient proxy = new ProductsServiceClient(); }

Bu ifade, kodunuzun GetProductInfo Web yntemini armak iin kullanaca ProductsServiceClient snfnn bir rneini oluturur. 9. Form zerinde kullancnn girdii rn IDsini geniletmek, proxy nesnesini kullanarak GetProductInfo Web yntemini altrmak ve daha sonra form zerindeki etiketlerde rn bilgisini grntlemek iin aada koyu harfle gsterilen kodu ekleyin.
private void getProduct_Click(object sender, RoutedEventArgs e) { ProductsServiceClient proxy = new ProductsServiceClient(); try { int prodID = Int32.Parse(this.productID.Text); ProductInfo product = proxy.GetProductInfo(prodID); this.productName.Content = product.ProductName; this.supplierID.Content = product.SupplierID; this.categoryID.Content = product.CategoryID; this.quantityPerUnit.Content = product.QuantityPerUnit; this.unitPrice.Content = String.Format({0:C}, product.UnitPrice); this.unitsInStock.Content = product.UnitsInStock; this.unitsOnOrder.Content = product.UnitsOnOrder; this.reorderLevel.Content = product.ReorderLevel; this.discontinued.IsChecked = product.Discontinued; }

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

641

catch (Exception ex) { MessageBox.Show(Error fetching product details: + ex.Message, Error, MessageBoxButton.OK, MessageBoxImage.Error); } finally { if (proxy.State == System.ServiceModel.CommunicationState.Faulted) proxy.Abort(); else proxy.Close(); } }

try/catch blou, istemci uygulamasnn meydana gelebilecek a zel durumlarn yakaladndan emin olur. Kullanc form zerindeki ProductID metin kutusuna geerli bir tamsay girmemi de olabilir. try/catch blou bu zel durumu da yakalar. finally blou, proxy nesnesinin durumunu inceler. Web servisinde bir zel durum olumusa (rnein, kullancnn mevcut olmayan bir rn IDsi girmesinden kaynaklanabilir), proxy, Faulted durumunda olacaktr. Bu durumda, finally blou, zel durumu kabul etmek ve balanty kapatmak iin proxynin Abort yntemini arr; aksi takdirde Close yntemini arr. Abort ve Close yntemlerinin her ikisi de Web servisi ile iletiim kanaln kapatr ve ProductsServiceClient nesnesinin bu rnei ile ilikili kaynaklar serbest brakr. 10. Design View penceresinde, tekrar ProductClient.xaml formunu grntleyin. Calculate Cost dmesini ift tklayarak bu dme iin calcCost_Click olay ileyicisini retin. 11. calcCost_Click yntemine aadaki kodu ekleyin:
private void calcCost_Click(object sender, RoutedEventArgs e) { ProductsServiceClient proxy = new ProductsServiceClient(); try { int prodID = Int32.Parse(this.productID.Text); int number = Int32.Parse(this.howMany.Text); decimal cost = proxy.HowMuchWillItCost(prodID, number); this.totalCost.Content = String.Format({0:C}, cost); } catch (Exception ex) { MessageBox.Show(Error obtaining cost: + ex.Message, Error, MessageBoxButton.OK, MessageBoxImage.Error); } finally { if (proxy.State == System.ServiceModel.CommunicationState.Faulted)

642

Ksm VI

Web Uygulamalar Oluturmak


proxy.Abort(); else proxy.Close(); }

Bu kod, getProduct_Click yntemine benzer modeli izler. ProductsServiceClient snfnn bir rneini yaratr ve bu rnei kullanarak HowMuchWillItCost yntemini arr, parametre olarak rn IDsini ve istenilen miktar geirir. Dnen deer form zerinde grntlenir. zel durum ileyici, hatalar yakalar ve finally blou yntem tamamlandnda a balantsnn kapandndan emin olur.

Uygulamay snayn
1. Projeyi oluturup altrn. Product Details formu grnnce, Product ID metin kutusuna 3 yazn ve sonra Get Product tklayn. stemci proxyi balatrken ve rn IDsini ieren bir SOAP istei olutururken meydana gelen ksa bir gecikmeden sonra, proxy istei Web servisine gnderir. Web servisi SOAP isteinin serisini iptal ederek gerek rn IDsini aar, veritabann okur, bir Product nesnesi yaratr, bunu XML olarak seriletirir ve ardndan proxyye geri gnderir. Proxy, XML verisini serisini bozup Product nesnesinin bir kopyasn yaratr ve daha sonra bu kopyay getButton_Click ynteminde yazdnz koda geirir. Aadaki grafikte gsterildii gibi, Aniseed Syrupn ayrntlar formda grnr:

pucu Could not connect to http://localhost:4500/NorthwindServices/Service.svc. TCP

error code 10061: No connection could be made because the target machine actively refused it, (http://localhost:4500/NorthwindServices/Service.svc. adresine balanlamad. TCP Hata kodu 10061: Hedef makine reddettiinden balant kurulamad) iletisi ile bir zel durumla karlarsanz, byk ihtimalle ASP.NET Development Server almay durdurmutur. (Bir sre etkin olmazsa, kapanr.) Yeniden balatmak iin, ProductsService Web servisi iin Visual Studio 2008 oluumuna gein, Solution Explorerda Service.svcyi farenin sa dmesiyle tklayn ve sonra View in Browser tklayn. Belirdiinde Internet Explorer kapatn.

Blm 30

Bir Web Servisi Yaratmak ve Kullanmak

643

2. Product ID metin kutusuna 24 yazn ve sonra Get Product tklayn. rn bilgisinin bu defa daha hzl bir ekilde grntlendiini grm olabilirsiniz. Bunun nedenlerini incelemek, bu kitabn kapsam dndadr. 3. How Many metin kutusuna 10 yazn ve sonra Calculate Costu tklayn. Form zerindeki Total Cost alannda grntlenen deerin Unit Price alanndaki deerin 10 kat olduunu dorulayn. 4. ID bilgilerini yazarak dier rnleri de deneyin. Var olmayan bir rnn IDsini girerseniz, Web servisinin bir zel durum oluturduuna dikkat edin. Daha nce anlatld gibi, dndrlen hata iletisi, anlaml hata iletilerine nasl imkan salayacanz ve zel durumlarn gnln tutacanz tanmlamakla birlikte, bir saldrgan iin kullanl olabilecek herhangi bir bilgi iermez. iniz bittiinde formu kapatn ve Visual Studio 2008e dnn. Tebrikler. lk WCF servisinizi ve bu servisin yntemlerini aran istemci uygulamasn oluturdunuz. Ayrca, bu kitaptaki tm altrmalar tamamladnz. imdi, C# dilini tam olarak biliyor olmal ve profesyonel uygulamalar oluturmak iin Visual Studio 2008i nasl kullanacanz anlam olmalsnz. Bununla birlikte, hikaye henz bitmedi. lk engeli atnz fakat en iyi C# programclar srekli deneyim yaparak renir ve bu deneyimi sadece C# uygulamalar oluturarak kazanabilirsiniz. Uygulamalar oluturduka, C# dilini kullanmann yeni yollarn ve Visual Studio 2008in bu kitapta ele alnmam olan birok zelliini kefedeceksiniz. Ayrca, C# dilinin gelien bir dil olduunu hatrlayn. 2001den nce, bu kitabn ilk basmn yazarken, C# dili, .NET Framework 1.0n kullanlr hale getirildii uygulamalar oluturmanz iin gerekli szdizimi ve anlambilimi olarak sunuldu. 2003te ve daha sonra 2005te, Visual Studio ve .NET Framework 1.1e baz yenilikler eklendi, generic ve .NET Framework 2.0 destei ile C# 2.0 ortaya kt. Bu kitapta grdnz gibi, Visual Studio 2008 ve .NET Framework 3.5 ile dzenlenmi dilin son srm C# 3.0de, anonim trler, lambda deyimler ve en nemlisi LINQ gibi ok sayda zellik eklendi. C# dilinin bir sonraki srmndeki yenilik ne olacaktr? Takip edin!

644

Ksm VI

Web Uygulamalar Oluturmak

Blm 30 Hzl Bavuru


Bunun in
Bir Web servisi yaratmak

unu Yapn
WCF Service ablonunu kullann. ServiceContract znitelii ile bir arabirim yaratarak, Web servisinin Web yntemlerini belirleyen bir servis anlamas tanmlayn. Her yntemi OperationContract znitelii ile etiketleyin. Bu arabirimi uygulayan bir snf yaratn. Solution Explorerdaki .svc dosyasn farenin sa dmesiyle tklayn. Internet Explorer alr, Web servis URLsine gider ve Web servisine eriebilen bir istemci uygulamasn nasl yaratacanz anlatan bir sayfa grntlenir. Web servisinin WSDL tanmn grntlemek iin WSDL balantsn tklayn. Veriyi tutacak bir snf tanmlayn ve DataContract znitelii ile etiketleyin. Verinin her parasnn bir genel alan olarak ya da get ve set eriimi salayan bir genel zellik zerinden eriilebilir olduundan emin olun. Snfn varsaylan bir kurucusu olduundan emin olun (bo olabilir). Project mensnde, Add Service Referencei tklayn. letiim kutusunun stndeki Address metin kutusuna Web servisin URLsini yazn ve sonra Goyu tklayn. Proxy snf iin ad alann belirtin ve sonra OKi tklayn. Proxy snfnn bir rneini yaratn. Proxy snfn kullanarak Web yntemini arn.

Bir Web servisinin tanmn grntlemek

Karmak verileri Web yntem parametreleri olarak geirmek ve deerleri dndrmek Bir uygulamaya bir Web bavurusu eklemek ve bir proxy snf yaratmak Bir Web yntemini armak

Dizin
Semboller
& (vurgu ileci), 163 && ileci, 69, 70 &nbsp varlk (blnemez boluk), 579 < (kktr) ileci, 68 <= (kk ya da eittir) ileci, 68 > (byktr) ileci, 68 >= (byktr ya da eittir) ileci, 68 * ileci, 163 *= ileci, 86 -- ileci, 46 -= (atama) ileci, 86 bir yntemden temsilciyi ayrmak, 324 Stop yntemini deitirmek, 329 yntemden temsilciyi kaldrmak, 314 . (nokta) iareti nesne yelerine erimek, 258 yntemlere bavurmak, 234 yntemleri armak, 128 = ileci, sa ilikili olarak, 395 => ileci, lambda deyiminde, 320 == ileci, tanmlamak, 403 ! ileci, 68 %= ileci, 86 | | ileci, 69 + ileci, 395 deikene 1 eklemek, 45 dize deerlerini birletirmek, 39 += (atama) ileci, 86, 313 balatlmam temsilci zerinde kullanmak, 314 dizeler zerinde ilevsellik, 86 ile hazr yaplm yntemler, 324 Start yntemini dzenlemek, 329 temsilciye yntemler eklemek, 314 ++ ileci, 45 ? (soru iareti) dzenleyici bir numaralandrma deikeni ile, 168 null olabilen deer trlerini gstermek, 151 yap deikeninin null olabilen srmn yaratmak, 177 ?<<iki nokta st ste>> (l ile), 482 /* */ aklama ileleri, 11 /= ileci, 86 add_Click yntemi, deitirmek, 445 AddExtension zellii (SaveFileDialog), 469 addValues yntemi (Yntemler), 52 adlandrlm tayclar, yaratmak, 15 adlandrmak deikenleri, 32 parametreleri, 397 snflardaki alanlar ve yntemleri, 127 tanmlayclar, 222 ADO.NET, veritabann sorgulamak, 499-511 veri almak ve grntlemek, 507 veritaban balantsn kesmek, 508 veritabanna balanmak, 503504 adres ileci (&), 163 a bant genilii, 560 veriyi hemen alma ve daha sonra alma karlatrmas (DLINQ), 516, 521 a genilii, a, 560 AJAX uzantlar, 563 alanlar, 56, 123 balatmak, 126, 177, 220 bir arabirimde izin verilmeyen, 241 kesinlikle zel tutmak, 228 korumal olarak bildirmek, 228 zellikler olarak deitirmek, 287 zelliklerle karlatrlm, 282 yap iin alanlar oluturmak, 176 yntemler arasnda bilgiyi paylamak, 56 AllowSorting zellii (GridView), 471 alt aalar, ikili aada, 338 alt bilgi, GridView sayfalandrmak, 469

A
aboneler, 323 about_Click yntemi, ynteme eklemek, 462 abstract anahtar szc, 245, 255 Accept yntemi (IVisitable), 248 Accept yntemi (Pack), 202, 204 Accept yntemi (SourceFile), 251 ActualHeight zellii (Window), 286 ak bir ekilde arabirim uygulama, 242, 242-243, 303 ak bir ekilde dntrmek, ihtiyac, 334 ak bir ekilde dnm ileleri, 408 ak bir ekilde giri dorulama, 492 ak bir ekilde zellik uygulama, 285 aklamalar, oklu satr, 11 alan (pop-up) menler (formlar farenin sa dmesiyle tklamak), 464 ad alanlar, 14-17 ad akmas program, zmek, 14 Add New Access Rule sayfas, 603 Add Reference iletiim kutusu, 432 Add to Solutions, 18 Add Window komutu (Project mens), 429 Add yntemi (ArrayList), 194 Add yntemi (koleksiyonlar), 200

645

646

alt izgiler alt izgiler, 32, 454 alt men eleri, 455, 456 altyap olarak nternet, 560-563 bant genilii, 560 sonradan ve hemen veri alma (DLINQ), 516, 521 anahtar szck kombinasyonlar, snflar ve arabirimler yaratmak iin zetlemek, 255 anahtar szckler, 30-31 anahtarlar, deerlerle ilikilendirmek, 199 AND (&) ileci, 297 anlambilim, 29 anlama, benzer arabirim, 240 anlamalar (Web servisleri), 629 tanmlamak, 631-633 anlk gncelleme akmalar, 545-548 anonim snflar, 141-142 ieriinde kstlamalar, 142 nesnelerin dizisini yaratmak, 189 oluumlarn yaratmak, 141 anonim tr, yeni tr tanmlamak vb., 376 anonim yntemler lambda deyimleri ve, 322 yetkilendirme n eki ile, 322 API (uygulama programlama arabirimi), 312 app.config dosyas, 535 App.xaml dosyas, 25, 429 App_Themes klasr, 583 application.exe.config dosyas, 535 ApplyPropertyValue yntemi, 252 arabirim dizinleyicileri, snflarda uygulamak, 303 arabirim iinde yuvalamak, izin verilmez, 241 arabirim zellikleri, 284-286 arabirim yntemleri, eleme kurallar, 242 arabirimler, 239-241, 244 anahtar szck kombinasyonlar, 255 arabirimlerdeki dizinleyiciler, 302-303 arabirimlerdeki zelliklerle elemesi gereken zellikler, 287 ile uyumluluk, 287 uygulamak, 241-243 zerinden snflara bavurmak, 243 ara ubuu, 7 Area yntemi (Daire), 128 ArgumentException zel durumu, 208, 212 ArgumentOutOfRangeException snf, 115 aritmetik ileler, 38-45 C# tarafndan desteklenen, 38 incelemek, 40-43 int deerler zerinde kullanmak, 40-43 numaralandrma zerinde uygulamak, 172 yeni deerler yaratmak, 85 aritmetik toplama ileci, 181 arkaplan resmi, formlara eklemek, 421-423 ArrayList snf, 194-195, 201 snfta mevcut olan elere bavurmak, 194 art iareti (+), toplama iin, 38 artrma (++) ileci, 46, 86 bildirmek, 401 checked ve unchecked anahtar szckleri, 113 snf ile uygulamak, 402 ASP (Active Server Pages), 562 asp ad alan, 575 ASP.NET, 559-586 altyap olarak nternet, 560-563 balca zellikleri, 562 olay ileme ve gecikmeler, 582 olay ileyicileri, 576-580 oluturmak, 564-582 Server denetimleri, 562, 575582. Ayrca bkz. zel denetim adlarna temalar kullanmak, 582-586 Web uygulamalar, 563-586 ASP.NET Forma dayal gvenlik, 469, 598-605 oturum ama formu oluturmak, 599-601 yaplandrmak ve etkinletirmek, 601-605 ASP.NET Web Site Administration Tool, 563, 601 .aspx dosyalar, 563 AssemblyInfo.cs dosyas, 8 Association znitelii, 518 asterisk (*), arpma ilemi iin, 38 ar yklemek (genel olarak), 207 ar yklemeler, pheli, 210 ar yklenmi dizinleyiciler, bir arada var olmak, 306 ar yklenmi ileler, 396-397 ar yklenmi tanmlayclar, 57 ar yklenmi yntemler, 9 atama ifadeleri, deiken deeri ile deitirmek, 103 atama ileci (=), 45 eittir ileci ile karlatrma, 68 atanmam deikenler, 34, 67 Auto Format iletiim kutusu, 600 Auto Hide dmesi, Toolbox balk ubuundaki, 20 AutoFormat iletiim kutusu, 608 AutomaticProperties projesi, amak, 290 AutoPostBack zellii, 583 azaltma (--) ileci, 46, 86, 113, 401

B
bamsz deikenler deitirmek iin yntemler yazmak, 153 yntem parametreleri iin, 53 yntemlere geirmek, 152 balant havuzlama, 510 basamaklandrlm if ifadeleri, 73-78 switch ifadesi olarak yeniden yazmak, 79, 80 basamaklandrlm menler, yaratmak, 457 basamaklandrlm stil sayfalar, 583 base anahtar szc, 220, 225 baseToConvertTo parametresi (ConvertToBase), 235 BasicCollection<T> snf, 364 bavuru deikenleri balatmak, 150 C#a eklenmi, 163 kopyalamak, 174 null deerler atamak, 150

checked anahtar szc bavuru trleri, 145 deer trleri ile karlatrmas, 146 olarak diziler, 186 bek zerinde yaratlan, 156 ref ve out dzenleyiciler ve, 156 sadece bavuru trlerine uygulanan ykclar, 259 bavurular askya almak, 260 belge, 451 Belgeler klasr, 6 belirsiz ar yklemeler, 210 bellek geri kazanmak, 257 Hashtable boyutu, 198 bek nesnelerinden kazanlm, 156 ynlar, 156 BellRingers projesi, 415, 452 bell-ringing yntemleri, eitlilii, 430 brakma yntemleri, 262, 263 biim dizesi, WriteLine, 62 bildirimler, olaylarla etkinletirmek, 323 bilgisayar bellei, organizasyonu, 156-158 bin klasr, 13 BinaryTree derlemesi, BuildTreee eklemek, 351 BinaryTree projesi, 357, 366, 385 BindingExpression snf, 493 BindingList< > snf, 543 BindingOperations snf, 570 bir ilecin eitlilii, 396 bir tama iletisi ile sonulanan aritmetik ile, 114 birleik atama ifadesi, 97 birleik atama ileleri, 85-86, 296, 400 listelemek, 86 birleik atama, 400 birleik ileler, checked ve unchecked anahtar szckleri, 113 birleirlik, 44 atama ileci ve, 45 bir ilecin birleirlii, 396 deerlendirme deyimleri, 44 her ile sembolnn birleirlii, 395 ilelerin birleirlii, 70 biti noktalar, 635 bitsel AND ileci, 296, 297 bitsel harici OR ileci, 297 bitsel ileler, 296 bitsel OR ileci, 297 Black.Hole yntemi, 211 bloklar, ifadeleri gruplandrmak iin kullanmak, 73 bool veri tr, 34, 68, 173 Boolean deerleri, eksi yapmak, 68, 152 Boolean deikenleri bildirmek, 67 if ifadeleri iin deyimler olarak, 72 Boolean deyimleri, 67 if ifadelerinde, 72 while ifadesinde, 87 Boolean ileleri, 68, 68-71 bo dizeler, Text zelliini ayarlamak, 89 bounds-checked, olarak dizi esi eriimi, 189 boyutlandrma tutamac, formlar, 22 blmeler, 418, 423 blnemez boluk (HTML), 579 break ifadesi switch ifadesinde, 79 switch ifadesinde baarszl durdurmak, 81 switch ifadesinde zorunluluk, 81 yineleme ifadesinin dna atlamak, 94 Brushes snf, 252 Build Solution komutu, 11 BuildTree projesi, 351 Button denetimleri, 572 formlara eklemek, 22, 419, 420 olaylar yantlamak, 443 otomatik olarak Click olaylarn ortaya karmak, 326 ButtonType zellii (commandfield nesneleri), 613 btnlk kstlamalar, koleksiyonlar iin, 381 byk kk harf duyarl aratrma, gerekletirmek, 36 byktr, tanmlanm, 340 byte veri tr, 173 zerinde numaralandrma, 170

647

C,
C dili, iaretciler, 162 C# dili, .NET Frameworkde rol, 3 C# dili, byk harf-kk harf duyarll, 8, 30 C# dilinin byk kk harf duyarll, 8, 30 C# kodunu derlemek, 11 C#da tek trnak iareti (), 83 C#da yuvarlama, 39 C/C++ baarszlk, C#de taklit etmek, 81 C++ dili, iaretiler, 162 C++da ilev iaretcisi, 312 calculateClick yntemi yakalama ileyici eklemek, 117 Yntemlerin, 55 calculateFee yntemi, 59 boyunca adm adm ilerlemek, 65 retmek, 61 camelCase gsterimi, 32, 50, 127 CanBeNull parametresi, 513 Cancel dmesi (Save File iletiim), 469 CancelEventArgs snf, 447 Cards projesi, 201 case anahtar szc, 79 case etiketleri, 80 case etiketleri, switch ifadeleri, 79 catch anahtar szc, 104 catch blou, try bloundan sonra eklemek, 110 catch ileyicileri, 104 calculateClick ynteminde eklemek, 114 calculateClick yntemine eklemek, 117 oklu kullanmak, 106 genel dnda daha zel yerletirmek, 108 genel olarak eklemek, 117 szdizimi, 105 ChangeConflictException zel durumu, 546-548 ChangeConflicts zellii (DataContext), 546 ChangePassword denetimi, 603 char veri tr, 34 CheckBox denetimi, 430 checked anahtar szc, 112

648

checked ifadeleri checked ifadeleri, 112 Checked zellii, 580 CheckedChanged olay, 578 Circle snf, karlatrlabilir yapmak, 342 class anahtar szc, 124 Class znitelii, XAML form tanm, 417 Class View penceresi, 249, 254 Classes projesi, 130 Clear Name komutu, 465 Clear yntemi (ArrayList), 205 Clear yntemi (koleksiyonlar), 205 clearName_Click yntemi, eklemek, 465 Click olay Add dmesi iin, 444 Exit dmesi iin Click olay yaratmak, 459 ilemek, 444-447 men esi iin belirtmek, 460 menlerde en sk kullanlan olarak, 458 OK dmesi iin ilemek, 23 Clock snf saat grnmn modellemek, 317 Start yntemi, 319 Stop yntemi, 318 Clone yntemi (Array), 192 Clone yntemi (Data zellii), 301 Close yntemi (SqlDataReader), 508 Close yntemi (TextReader), 263 Closing olay formlar iin, 447-448 pencereler iin, 447 Code and Text Editor penceresi, 17 formlar iin kodu grntlemek, 24 IDEde, 7 Code and Text Editor penceresinde ScreenTip, 33 CodeBehind znitelii, @ ServiceHost ynergesi, 630, 635 CodeFile ynergesi, 576 Collection Editor, amak, 454 Color Syntax formu, 250 ColorSyntaxVisitor snf, 250-254 dzenlemek, 252 her simgeyi renkli sunmak, 251 ComboBox denetimi, 430 Command snf, 506 CommandBehavior parametresi (ExecuteReader), 511 Common blm, Toolbox, 20 Common Language Specification (CLS) uygunluu, 32 Common Login Tasks mens, 600 Compare yntemi (DateTime), 78 compareClick yntemi (Selection), 75 CompareTo yntemi, 240 Circle nesnelerini karlatrmak, 342 IComparable arabiriminin CompareTo yntemi, 342, 346 uygulamak, 385 varsaylan uygulamasn retmek, 385 CompareValidator denetimi, 588 CompositeType snf, 630 Connection zellii (SqlCommand), 506 Connection snf, 504 ConnectionString zellii (SqlConnection), 504 <connectionStrings> esi (app. config), 535 Console snf, 9 System ad alan iinde, 15 WriteLine yntemi iin ar ykler iermek, 212 Console.WriteLine yntemi, 131, 212 ar yklemenin klasik rnei olarak, 207 bamsz deikenlerinin ToString yntemini armak, 181 Console.Write ile karlatrlmas, 60 numaralandrma deikeni grntlemek, 168 const alan, bildirmek, 137 const anahtar szc, alana n ek olarak eklemek, 137 const zellikleri, izin verilmedi, 283 ContainsKey yntemi (Hashtable), 198 Content zellii formlar iin Properties penceresi, 431 onay kutular, 441 WPF denetimleri, 441 ContextMenu zellii, 465 null olarak ayarlamak, 467 ContextMenu tr, 467 Continue dmesi, Debug ara ubuu, 65 continue ifadesi, while ifadesinde, 94 Controller snf, makina eitlerinden bamsz hale getirmek, 315 Controls blm, Toolbox, 20 ControlToValidate zellii (RequiredFieldValidator), 590 Convert yntemi (IValueConverter), 568 Convert.ToChar (digitCode) yntemi, 97 ConvertBack yntemi (IValueConverter), 568 ConvertToBase yntemi, 235, 236 Copy statik yntemi (Dizi), 192 Copy Web Site komutu, 574 copyOne yntemi (SwitchStatement), 82 CopyTo yntemi (Dizi), 192 Count zellii (ArrayList), 195 Count yntemi, orijinal koleksiyon zerinde dorudan armak, 383 Create User sayfas, 602 CreateDatabase yntemi (DataContext), 514 .csproj son eki, 35 Current zellii (IEnumerator), 356 Current zellii (TreeEnumerator), 358 Current zellii, enumData deikenini incelemek, 360 currentData deikeni (TreeEnumerator), 358 currentItem deikeni (TreeEnumerator), 358, 361 CustomValidator denetimi, 589 arma yntemleri, 53-55

Design View penceresi alma zaman, nesne yok etme ve, 258 arpmsal ve toplamsal ileler, 44 ekirdek derleme, 17 karma iin eksi iareti (-), 38 k, 154 ift alnt iareti (), 83 ok biimlilik, 227, 232 ok boyutlu diziler ile params anahtar szcne izin verilmez, 209 koleksiyonlarla taklit etmek, 200 yaratmak, 187 okbiimli yntemler, bildirmek, 225 p toplama, 258 kullanm nedenleri, 260-261 potansiyel olarak pahal, 150 ykclar armay durdurmak, 267 zm dosyalar, 7, 35 dateCompare yntemi (Selection), 75-77 DateTime deerleri, karlatrmak, 78 WindowsFormsHost denetimine alt zellik olarak eklemek, 433 DateTime tr, 78 DateTime yaps, 328 DateTimePicker denetimi balatmak, 442 tarihleri semek ve grntlemek, 430 DateTimePicker denetimleri, 74 DbType parametresi, 513 Deal yntemi (Pack), 202 Debug ara ubuu, 63, 98 Debug klasr, 13 Debug mens Start Debugging komutu, 14 Start Without Debugging komutu, 13 decimal tr, 173 decimal veri tr, 33 declaration ifadesi, 32 default anahtar szc, 79, 358, 361 defaultDate yerel deikeni, bildirmek, 181 DefaultExt zellii, SaveFileDialog snfnn, 469 deer metin kutusu, deer atamak, 36 deer trleri, 145 bavuru trleri ile karlatrmas, 146 eitleri, 167 kuyruklarn oluturmak, 336 kuyruktan karmak, 335 null izin verilmez, 361 olarak yaplar, 172 yn zerinde yaratlan, 156 deer tr deikeni, 174, 279 deer tr parametreleri, 156 deer, deikene atamak, 33 deiiklikleri veritabanna yanstmak, 544 deiken trleri bildirmek, 32 sonu karmak, 47 deikenler, 31 1 karmak, 46 adlandrmak, 32 artrmak ve azaltmak, 45-46 balatmak, 45, 150 bildirmek, 32-33, 56, 92, 145 deerler atamak, 125, 153 geerli deerini grntlemek, 64 kapsam, 56 yap iin oluturmak, 176 yerel, 29 yntemler iinde yaratmak, 56 deikenleri balatmak, 150 delegate anahtar szc, 313, 322 delegate yntemi, 404 Delegates projesi, 316 denetim oda, dorulama ve, 473, 479 denetimler adlar ve trlerini gstermek, 42 Control snfndan kaltmla almak, 427 formlar zerinde bakmak ve hissetmek, 424-429 formlar zerine srklemek, 22 formlara eklemek, 430-437 kaynaklara bavurmak, 424 klavuz zerine yerletirmek, 419 menu komutu iin etkinletirmek, 459 sraya koymak, 431 tarafndan desteklenen olaylar, 445 WPF menlerine eklemek, 457 dequeue ileci, 196 Dequeue yntemi, 334 derin kopya, dizilerin, 192 derleme, 341 derlemeler, 8, 16 derlenmi kod, bavurular, 8 derlenmi program dosyas, 14 derleyici, 210, 351 derleyici tr hatasn ortaya karamaz, 47 derleyicinin rettii varsaylan kurucu, 175 Design View penceresi, 17 bo bir WPF formu grntlemek, 19 kod grntlemek, 25 Visual Studio 2008de kullanmak, 326

649

D
DailyRate projesi, 58 daralma dntrme. Bkz. ak bir ekilde dntrme DataContext zellii, 539 DataContext snf, 514, 534 ChangeConflicts zellii, 546 CreateDatabase yntemi, 514 gncelleme akmalarnn stesinden gelmek, 545-548 LoadOptions zellii, 521 zel, tanmlamak, 522 Refresh yntemi, 545 SubmitChanges yntemi, 545548 veritabann deitirmek. Bkz. veritaban verisini deitirmek veritabann gncellemek, 544 DataField zellii (boundfield denetimleri), 609 DataLoadOptions snf, 521 DataNavigateUrlFormatString zellii, 615 DataReader nesneleri. Ayrca bkz. SqlDataReader snf DataSourceID zellii (GridView), 608 Date yaps, 180

650

destedeki kartlar datmak destedeki kartlar datmak, 201 DestinationPageUrl zellii, Login denetimi, 600 deyimler, birleim zellii kullanarak deerlendirmek, 44 Dictionary snf, 336 DictionaryEntry snf, 198 dinamik HTML, giri dorulama ve, 596 DispatcherTimer snf, 316, 328, 405 Dispose yntemi (IDisposable), 265, 266-267 DistanceTo yntemi, 134 Distinct yntemi, 379, 382, 387 DivideByZeroException zel durumu, 117 dize birletirme ileci, 181 dizeler alnt iaretlerinde, 10 birini dierine eklemek, 86 birletirmek, 43 bo olarak balatmak, 96 deerini snamak, 306 dntrmek, 42, 43, 104 ekrana yazdrmak, 60 sadece dizeler grntleyen metin kutular, 37 tamsaylara dntrmek, 39 tutmak iin ikili aa yaratmak, 350 dizi deikenleri adlandrmak, 186 balatmak, 187-188 bildirmek, 185 diziler zerinde yinelemek, 190191 diziler, 185 anonim nesneler iermek, 191 ar ykleme izin verilmedi, 300 bavuru trleri olarak, 191, 301 boyutlar, 200 boyutu, 187, 200 ok boyutlu diziler yaratmak, 187 ok kstlayc olarak sradan diziler, 194 diziler arasnda ortak anahtar, 380 diziler zerinde tekrarlamak, 190-191 dizilere eler eklemek, 194 dizinler, 189, 300 ilkel trlerle snrl olmayan eler, 186 koleksiyonlarla karlatrlm, 200 kopyalamak, 191-192 oluumlar yaratmak, 186-187 eleri kaldrmak, 194 zellikler olarak gstermek, 301 ref ya da out parametreleri olarak eler, 300 yararlar ve eksikleri, 207-208 yeniden boyutlandrmak, 194 dizileri kopyalamak, 192 dizilerin shallow (s) kopyas, 192 dizin deeri zerinde aralk denetimi, 299 dizinler dizinleyici bildiriminde belirtilen, 298 sfr tabanl olarak dizilerde, 189 dizinleyiciler, 295 arabirimlerde, 302-303 ar yklemek, 300 bir ile simle etmek, 396 dizilerle karlatrmak, 300 saysal olmayan alt simgeler kullanmak, 300 tanmlamak, 297 TKey tr anahtar kullanarak TValue tr deerlere erimek, 337 Windows uygulamalarnda armak, 306-307 Windows uygulamalarnda, 303-308 DLINQ gncelleme akmalarnn stesinden gelmek, 545-548 kiisel DataContext snflar, 522 mevcut veriyi gncellemek, 544 sorgular oluturmak ve altrmak, 514-516, 525 tablolar birletirmek ve ilikiler yaratmak, 517 varlk snflar tanmlamak, 512514, 523 veri eklemek ve silmek, 548-556 veri kaynana balamak, 529544 veritabann deitirmek, 544556 veritabann sorgulamak, 512527 veriyi hemen almak ve daha sonra almak, 516, 521 .dll son eki, 16, 341 do ifadeleri dngy sonlandrmak, 101 incelemek, 94-97 szdizimi, 93 zerinden adm adm ilerlemek, 97-101 yazmak, 93-101 DockPanel denetimleri, 453 Document Outline penceresi, 42 dolayl deiken bildirimleri, C#da izin verilmez, 33 dolayl dnm, 406, 408, 409411 DoStatement projesi, 94 double deiken tr, 33, 135 double tr, 173, 407 double veri tr, 39 double.Parse yntemi, 60 dngler, brakmak, 94 dngsel dolamlar, Server denetim olaylar, 582 dnm ileleri, 406-411 kullanc tanml, 407-408 DropDownList denetimleri, 571 durum bilgisi, snf tarafndan saklanan, 124 durum ynetimi, Web uygulamalar, 562, 626 dm, ikili aa, 338 dzenleyici yntemler, 277 DynamicResource anahtar szc, 426

E
Edit mens, 36, 452 EditText zellii (ortak alan nesneleri), 613 eik izgi (/) aklamalar iin, 11 blme iin, 38 ekran sa alt kesinin koordinatlar, 132 else anahtar szc, 71

genelletirilmi snflar, generics ile karlatrmas EnableClientScript zellii (dorulama denetimleri), 593 Enqueue yntemi, 334 EntitySet< > zellii, 539, 542 Entrance yntemi (Program), 131 enum anahtar szc, 167 enum tr. Bkz. numaralandrmalar enumData kuyruu (TreeEnumerator), 358 Enumerable snf, 375 Enumerable.Select yntemi, 375 EnumeratorTest projesi, 362, 367 Equals yntemi, 343, 403 equi-joins, LINQ tarafndan desteklenen, 383 eriilebilir kuyruk, 261 eriilebilir nesneler, 261, 262 eriilemeyen nesneler, 262 eriim eriim dzenleyici, izin verilmedi, 241, 259 zelliklere, 281-282 public ve private anahtar szckleri, 227 snfa, denetlemek, 126-127 veritabanna, Windows Vista eriim haklar, 531 Eriim Kurallar blm, 603 eriim yntemi, 277 eriimciler, farkl eriilebilirlikler tanmlamak, 281 Error List penceresi, 11 ertelenmi deerlendirme, 389 eitlik (==) ileci, 68, 169 eitsizlik (!=) ileci, 68 eittir iareti (=) ileci, 45 eittir ileci, on yantmcecii ile, 383 event anahtar szc, 323 Exception ailesi, 107 ExceptionValidationRule esi (Balamak), 478, 492 .exe dosya ad uzants, 16 ExecuteReader yntemi (SqlCommand), 506, 511 Exit komutu (File mens), 27, 452 Click olay yntemi, 459 Express Edition, 4 proje dosyalarnn konumunu belirtmek, 6 SQL Server veri dosyas, balanmak, 530 yeni grafik uygulamas yaratmak, 18 yeni konsol uygulamas yaratmak, 6 extends anahtar szc (C#da mevcut deil), 219 Extensible Application Markup Language. Bkz. XAML ExtensionMethod projesi, 234 Extract Method iletiim kutusu, 62 FormatException zel durumu, 104, 105, 110 formlar denetimler eklemek, 20, 22, 430-437 iin kodu grntlemek, 24 kapatmak, 23 uygulamalara eklemek, 429 yeniden boyutlandrmak, 22 formlar zerinde dzenleme gstergeleri, 22 Formlara dayal gvenlik, 469, 598-605 <forms> esi (system.web), 384 oturum ama formu oluturmak, 599-601 yaplandrmak ve etkinletirmek, 601-605 formlar kapatmak, 23 FormView denetimi, 563 From a local network seenei (Users blm), 602 from sorgu ileci, 381 From the Internet seenei (Users blm), 602 Func tr, 375

651

F
FailureText zellii, Login denetimi, 600 _File men esi, deitirmek, 455 File mens, 451 FileInfo snf, 89 OpenText yntemi, 89 FileName zellii (OpenFileDialog), 88 FileName zellii (SaveFileDialog), 469 Finalize yntemi, 260 finally blou, 118-119 dezavantajlar, 264 Finalize yntemini armak, 260 yok etme yntemini armak, 263 Find and Replace komutu, 36 first-in, first-out (FIFO) (ilk giren ilk kar) mekanizmas, 196 FirstPageText zellii (GridView), 470 float veri tr, 33, 36, 173 FontSize zellii (etiketler), 21 for ifadeleri, 91-93 dizilerde kullanmak, 190 yeni dizi iinde deerleri ayarlamak, 192 foreach ifadesi, 190, 194, 198, 199, 355 eleri basit dizide listelemek, 355 sfr uzunluunda dizi zerinde yinelemek, 211 tm eleri biraraya eklemek, 213

G
geerli tarih, denetim iin elde etmek, 442 geersiz klmak karlnda gizlemek, 224 genel alanlar ya da yntemler, 126, 139 eklemek, 148, 181, 235 kapsllemeyi ihlal etmek, 228 yaplarda nerilmez, 174 genel ileler, 397 genel kurucu, 131, 132, 180, 221 genel olaylar, 325, 327 genel oluum alan, eklemek, 148 genel snf yeleri, iin isimler, 127 genel tanmlayclar, 127 genel veri, kt fikir olarak, 276 genel yntemler, C#da desteklenmez, 50 genel/zel adlandrma kural, 278 genelletirilmi snflar, generics ile karlatrmas, 337

652

Generate Method Stub Wizard Generate Method Stub Wizard, 59-62 generic snflar birden fazla trde parametreye sahip olmak, 336 derleyici tarafndan kullanlan ablon tanmlamak, 337 yaratmak, 338-350 generic snflarn tre zel srmleri, 337 generic yntemler, 350-353 generics genelletirilmi snflara kar, 337 ikili aa snf oluturmak, 341350 kstlamalar ve, 338 tarafndan salanan zmler, 335-337 geniletilebilir ereve (framework), uygulamak, 247 geniletme dnm. Bkz. rtl dnm geniletme yntemleri, 233-236 geri gnderimler, 582 get anahtar szc, zelliklerde, 278 get eriimcisi, 279 arabirimlerdeki get eriimcisi yntemleri, 284 dizinleyicide, 298, 305 dizinleyicinin, 299 generic Current zelliinin, 360 iin zellik eriilebilirliini deitirmek, 281 parametrelere izin verilmez, 283 sadece get eriimcisi ieren zellikler, 280 GetBinding (BindingOperations), 570 GetData yntemi (IService), 630 GetDataUsingDataContract yntemi (IService), 630 GetEnumerator yntemi amac, 362 bir numaralandrma nesnesi dndrmek, 356 bir yineleyici kullanarak uygulanan, 364 bir yineleyici tanmlamak, 365 GetList yntemi (IListSource), 543 GetTable< > yntemi (DataContext), 515, 522 GetTypeName yntemi, 227 GetXXX yntemleri (SqlDataReader), 507, 516 giri dorulama, 473-496 dorulama noktas, 491-495 etkisizletirmek, 593 hata iletisi kiiselletirme, 479481 iin stratejiler, 473 istemci taraf dorulama (Web formlar), 588-595 mteri ynetimi rnei, 474 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592 sunucu taraf dorulama (Web formlar), 588, 593 ValidationSummary denetimi, 594-595 veri balamay kullanmak, 475491 goto ifadesi, 81 grnm durumu, Server denetimi, 582 gvde, lambda deyimi, 321 gvde, snf, 125 grafik uygulamalar iin ablonlar, 18 grafiksel kullanc arabirimi. Bkz. GUI grafiksel uygulamalar, 17-27 Grid denetimi, panel denetimi olarak, 423 Grid esi (Window), 418 Grid yerleim blmesi, 418 GridView denetimi, 563 bilgi almak iin veri kayna, 606 formu snamak, 609 formu yerletirmek, 566, 607609 gvenlik, 610 veri sorgulamak ve grntlemek, 605-612 veriyi dzenlemek, 612-614 veriyi sayfalandrmak, 469, 605 GridView denetim sayfalarndaki oklar, 470 GridView denetimleri ile veri gncellemek, 612-614 group ileci, 382 GroupBox denetimleri, formlara eklemek, 433 GroupBy yntemi, 378 gruplarn numaralandrlabilir kmesi, GroupBy yntemi ve, 378 GUI (grafiksel kullanc arabirimi) GUI denetimleri tarafndan retilen olaylar, 326 olaylar bolca kullanmak, 325 gvenlik, 597 ASP.NET, 563 Formlara dayal, 469, 598-605 giri dorulama. Bkz. kullanc giriini dorulamak kod iine yazlm kullanc adlar ve parolalar, 505 oturum ama formu oluturmak, 599-601 SQL saldrlar, 506 Web formlar, 610 Web servisleri, 625 yaplandrmak ve etkinletirmek, 601-605

H
ham bellek, ayrmak, 257 HasError zellii (Dorulama), 479 Hashtable snf, 198-199 Hashtableslarda anahtar kopyas, 198 HasValue zellii, 152 hata ileme, 103 bulma ve uyarmaya kar, 116 dinamik HTML kullanmak, 596 dorulama ile ilgili hata iletileri, 479-481 giri dorulama ile, 594-595 kodu ana program kodundan ayrmak, 104 hazr bilgi deerler, int deikenlerle deitirmek, 54 Header znitelii (MenuItem), 454 HeaderText zellii (boundfield denetimleri), 609, 617 heceleyici ziyareti snf, 247 Height zellii (formlar), 431 _Help men esi, deitirmek, 455 Help mens, 452, 461

int parametresi, snf iine alnm int parametresi geirmek hiding ve overriding yntemleri, 224 HorizontalAlignment zellii (Dme), 419 HorizontalAlignment zellii (Men), 453 HTML (Hypertext Markup Language), 560 HTML denetimleri, 575 HTTP (Hypertext Transfer Protocol), 560 istemci taraf, 562, 626 InsertIntoTree yntemi snamak, 353 yazmak, 351-352 Int32.Parse yntemi, 39 IntBits yaps, 297 IntelliSense, 9-11, 232 simgeler, 10-11 Internet Information Services (IIS), 610 Web sitelerini yaymak, 574 InvalidCastException zel durumu, 160, 161, 334 InvalidOperationException zel durumu, 116, 117, 360, 515 IsChecked zellii, 116, 441, 569 ile dorulama, 568 IsDeleted zellii (ObjectChangeConflict), 546 IsEnabled zellii, temizlemek, 458 ISerializable arabirimi, 632 IService arabirimi, 629 IsNullOrEmpty statik dize yntemi, 306 IsPrimaryKey parametresi, 513 IsSynchronizedWithCurrentItem zellii, 539 IsThreeState zellii (CheckBox), 430 Ile iftleri, tanmlamak, 403 Items zellii (ComboBox), 439 Items zellii (liste kutular), 440 Items zellii (Menu denetimi), 454 ItemTemplate zellii, 539 ITokenVisitor arabirimi, 250, 252 IValueConverter arabirimi, 568 IVisitable arabirimi, 248 IVisitableToken arabirimi, 248, 249 zgara, 20 i deikeni, while dngsnde, 87 ierik menleri. Bkz. ksayol menleri. if anahtar szc, 71 if ifadeleri, 71-78 basamaklandrmak, 73-78 i ie geirmek, 73 while ifadeleri ile karlatrmas, 87 ifadeleri aklama satrna dntrmek, 16 ikili aa kullanarak sralanmam tekrarlama, 340 ikili aalar, 338 generics kullanarak oluturmak, 341-350 IEnumerable arabirimi uygulamak iin dzenlemek, 361 ieriklerinin ktsn almak iin yineleme algoritmas, 367 ieriklerinin ktsn almak, 347 ikili aalara veri elerinin listesini eklemek, 351 ints tutmak iin, 349 oluturmak iin generic yntem tanmlamak, 351-353 teorisi, 338-341 zerinde ilerlemek, 347 yaratmak ve yerletirmek iin ifadeler eklemek, 363 ikili aalar kullanarak veriyi sralamak, 339 ikili ileci, 395 bildirmek, 398 iki ak bamsz deiken, 397 standart infix gsterimi ile kullanmak, 397 ilikili dizi, 198 ilikisel ile, 68 ilkel trler edeer .NET Framework trleri, 173 iin deerleri grntlemek, 34-35 snf trlerine kar, 145 yaplar iin takma adlar olarak, 172 ilkel veri trleri, 33-40, 35-38 ile switch geerli, 80 sabit boyutu, 111 int alanlar, Point snfna eklemek, 132 int anahtar szc, 349 int deiken tr, 33 int deikenleri bildirmek, 145, 147 int deikenleri dizilerini nesnelerin dizileri ile karlatrmak, 193 int parametresi, snf iine alnm int parametresi geirmek, 148

653

I,
IComparable arabirimi, 240, 342, 343, 345, 357, 384 IDE (tmleik programlama ortam), 4 IDENTITY stunlar, 548 IdentifierToken snf, Class View penceresi, 249 IDisposable arabirimi, 265 Dispose yntemi, 359 IEnumerable arabirimi, 364, 512 GetEnumerator yntemi, 356 IEnumerable<T> ve IEnumerator<T> karlatrmas, 356 uygulamak, 361-363 IEnumerator arabirimi, 356, 357, 359, 361-362 IIS (Internet Information Services), 610 Web sitelerini IISe yaymak, 574 IListSource arabirimi, 543 Indexers projesi, 303 IndexOf yntemi (Array snf), 305 IndexOutOfRangeException zel durumu, 189 Infinity deeri, 40 InitialDirectory zellii (SaveFileDialog), 469 INotifyPropertyChanged arabirimi, 534, 542 INotifyPropertyChanging arabirimi, 534, 542 Input string was not in correct format (Giri metni doru biimde deil) iletisi, 118 Insert yntemi (ArrayList), 194 Insert yntemi (Tree<TItem>), 346

654

int veri tr int veri tr, 33, 173 bitleri tek tek deitirmek, 295 bitleri ynlendirmek, 296 Boolean deerler kmesi olarak altrmak, 296 dizeye dntrmek, 43 double trn int trne evirmek, 407 numaralandrma hazr bilgilerine int tr deer verilir, 170 sabit boyutu, 111 int.Parse yntemi, 104 interface anahtar szc, 240 nternet altyaps, 560-563 is ileci, 161, 222 istekler. Bkz. sunucu istekleri ve yantlar istemci durumu, 562, 626 istemci taraf (client-side) giri dorulama, 588-595 dinamik hata iletileri, 596 etkisizletirmek, 593 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592 ValidationSummary denetimi, 594-595 i modeli, paras olarak dorulama kurallar, 474 iaretiler, 162-164 ilecin son ek biimi, 46 ile olarak, 162, 222 ile sembolleri, 396 ileler, 38, 395-400 artma ve azalma, 401-402 ar yklenmi, 396-397 dil birlikte ilerlii ve, 399 farkl ileler iin ayn sembol, 181 ncelik ve birleirlik, 70 simetrik, 398-399, 408 trler tanmlarken ar yklemeleri snrlamak, 402 uygulamak, 404-406 zerinde kstlamalar, 396 veri trleri ve, 39 yap trleri iin ak bir ekilde ileler bildirmek, 174 yaplar ve snflarda, 402 ilenenler, 39 trlerini kartrmak, 39 ilenmemi zel durumlar, 117, 117-118 levler tanmlama iin gsterim, 321 yntem eidi olarak, 51 kayp gncellemeler, 546 kaynak dosyalar, ieriini grntlemek, 7 kaynak kod ayr dosyada saklamak, 129 kod satrlarna bakmak iin gerekli, 110 tek bir projede, 8 kaynak ynetimi, 262-267 kaynaklar serbest brakmak, 262 KeepChanges deeri (RefreshMode), 546 KeepCurrentValues deeri (RefreshMode), 546 kestirmeler yaratmak, 70 Key deeri, 424 Key zellii (DictionaryEntry), 198, 199 klavuz izgileri, Design View, 431 klavuz ziyareti snf, 247 krmz dalgal izgi (Visual Studio), 12 ksayol menleri, 464-467 kstlamalar arabirimler zerinde, 241 zellikler zerinde, 282-283 ksmi snflar, 129-130 Kod aklama satrn koda evirmek, 390 iyi tasarlanm, 283 zel durum gvenli, 267-269 kod arkasndaki dosyalar, 576 kod bloklarn aklama satrna dntrmek, 390 kod grnm, 17 kod unsurlarn yeniden belirlemek, 62-66, 244 kodda tekrarlama, uyar iareti olarak, 244 koleksiyon balatclar, 200 koleksiyon snflar, 192-205, 300 koleksiyon trleri, balatmak, 200 koleksiyonlar bellekte, ilikili veritaban tablolar ile karlatrmas, 381 dizilerle karlatrmak, 200 koleksiyondaki eler olarak, 200

J
join ifadesi, 517 join ileci, 383 Join yntemi, 380

K
kalan ileci, 40 kaltmla alma hiyerarileri, 107, 221, 247-250 kaltmla almak, 217, 218-233 yaplarda izin verilmez, 233 kapatma ilevi, denetim programnda uygulamak, 312 kapsam, 56-58 kapslleme alan benzeri szdizimine izin verirken kapslleme tespit etmek, 277 amalar, 124 ayr ayr Add ve Remove yntemleri uygulayarak tamamlama salamak, 315 kapsllemenin altn kural, 276 yntemleri kullanarak uygulamak, 276-277 karakter iftleri, eleen yazmak, 10 karakter setleri, 96 karakterler her karakter iin esiz kod, 96 tamsaylar olarak ele almak, 96 XMLe eletirmek, 81 karklk ziyareti snf, 247 kart destesi, kartrmak, 202-204 kartlar datmak, 201-202 desteye almak, 204-205 oynamak iin koleksiyon snflar kullanmak, 201-205 kayan noktal (tamsay olmayan) aritmetii, 113

LINQ (Language Integrated Query) koleksiyonlardaki eleri numaralandrmak, 355-363 numaralandrlabilir yapmak, 363 ortak anahtarda birletirmek, 383 nbellekte saklanan statik koleksiyonlar retmek, 389 komut satr penceresi, 3 konsol uygulamalar, 3 oluturmak ve altrmak, 11-14 Visual Studio 2008de yaratmak, 4-8 yeni yaratmak, 5-7 konumsal gsterim, 242 korumal alanlar, 228 korumal eriim, 227-233 korumal temel snf yesi, 228 koullu mantksal ileler, 69-70 keleme ift-ulu ok iaretisi, 22 keli parantezler, 44, 185 kullanc adlar ve parolalar kod iinde yazmak, 505 kullanc adlar, kod iinde yazlm, 505 kullanc arabirimi, 20-26 formlara dayal, 17 oluturmak iin WPF zellikleri, 448 sezgisel, iin neriler, 452 kullanc dorulama Formlara dayal gvenlik, 469, 598-605 oturum ama formu oluturmak, 599-601 yaplandrmak ve etkinletirmek, 601-605 kullanc giri dorulama, 473-496 dorulama noktas, 491-495 etkisizletirmek, 593 hata iletisini kiiselletirme, 479-481 iin stratejiler, 473 istemci taraf dorulama (Web formlar), 588-595 mteri ynetimi rnei, 474 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592 sunucu tarafnda dorulama (Web formlar), 588, 593 ValidationSummary denetimi, 594-595 veri balamay kullanarak, 475491 kullanc giriini dorulamak, 473-496 dorulama noktas, 491-495 etkisizletirmek, 593 hata iletisi kiiselletirme, 479481 iin stratejiler, 473 istemci tarafnda dorulama (Web formlar), 588-595 mteri ynetimi rnei, 474 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592 sunucu tarafnda dorulama (Web formlar), 588, 593 ValidationSummary denetimi, 594-595 veri balamay kullanmak, 475491 kullanc tanml dntrme ileci, 407 kullanclar dorulamak <authorization> esi (system. web), 384 Formlara dayal gvenlik, 469, 598-605 oturum ama formu oluturmak, 599-601 SQL Server Authentication, 505 yaplandrmak ve etkinletirmek, 601-605 kurucular, 24, 127 arabirimlerde izin verilmeyen, 241 ar yklemek, 128-129 Clock snf, 405 farkl srmlerini yazmak, 128 ile almak, 127-136 nesne balatmay denetlemek, 257 nesneleri balatmak, 288-289 snf adlar ile eletirmek, 127 snflarda kurucularn sras, 129 Ticker snf, 328 Tree<TItem> snf, 345 TreeEnumerator snf, 358 varsaylan olmayan kurucularla birlikte nesne balatclar belirlemek, 290 Kutu pencereleri ablonu hakknda, 461 kutulamak, 159 aklszca kullanmak, 161 ek yk performans, 335 kutulamay kaldrmak, 159-161, 335 kutulanm int deeri, erimek, 159 kuyruklar, 333, 336, 359 kme parantezleri. Bkz. parantezler

655

L
Label denetimleri, 20, 431, 567 <Label> etiketi, 21 Lambda Calculus, 321 lambda deyimleri, 320 anonim yntemler ve, 322 bir anonim yntem tanmlamak, 374 formu, 321-322 parametre listesi ve yntem gvdesi ieren, 320 szdizimi, 320 uyarlayclar olarak, 345 Where ile kullanlan, 377 lambda deyimleri tarafndan dndrlen deerler, 322 Language Integrated Query. Bkz. LINQ LastPageText zellii (GridView), 470 Length zellii (diziler), 190, 191, 195 LINQ (Language Integrated Query), 371-392 ertelenmi deerlendirme ve, 389-392 ertelenmi ve yakalanm deerlendirmenin etkileri, 389-392 ilikili ilemler, 377 SQL szdizimi ve anlambilim benzerlii, 372 tarafndan salanan yntemler, 383 veri sorgulama kapasitesi ve szdizimi, 374-381

656

LINQ kullanarak veri semek LINQ kullanarak veri semek, 374-376 LINQ kullanarak veriyi birletirmek, 380-381 LINQ kullanarak veriyi filtrelemek, 377 ListBox denetimleri, 431, 434 ListView denetimi, 540 LoadOptions zellii (DataContext), 521 LoadWith yntemi (DataLoadOptions), 521 Locals penceresi, 98 Location alan, belirlemek, 6 Login denetimi, 563, 599 long veri tr, 33, 173, 296 LostFocus olay, 473 Members alr listesi, 37 Menu denetimleri, 452 MenuItem eleri, 454, 457, 464 MenuItem_Click varsaylan ad, 458 men ubuu, 7 men olaylar, 458-463 men eleri iin metin stili belirlemek, 456 men eleri, 457, 458 menler klavuzlar ve stili, 451 yaratmak, 452-456 Message zellii (FormatException), 105 MessageBox snf, 446 Show yntemi, 26 metin dosyalar, veri kaydetme biimi, 460 Microsoft IIS (Internet Information Services), 610 Web siteleri yaymak, 574 Microsoft Visual C#. Bkz. C# dilinde girdiler Microsoft Windows Presentation Foundation (WPF) formu. Bkz. WPF formu Middleshire Bell Ringers Association projesi, 415, 416417 Middleshire Bell Ringers men e olay, 461-462 Min yntemi, 208 MinimumValue zellii (RangeValidator), 592 MinValue zellii, 111 modls ileci, 40 MoveNext yntemi (IEnumerator), 356, 359 multiplyValues yntemi, sessizce tama, 113 mhrlenmi snflar, 218, 246 mhrlenmi yntemler, 246 &nbsp varlk (blnemez boluk), 579 nesneler, 239, 243 balatmak, 288-292 dize gsterimlerine dntrmek, 224 iki aamal sre olarak yaratmak, 257 ile problemler, 333-335 olarak eler dndren koleksiyon snflar, 193 snflara kar, 125 System.Object iin takma adlar olarak, 222 tm snflarn kk olarak, 211 yaratmak, 156, 257, 291 ykma sras, 261 yok etmek, 258, 260 nesnelere bavurular, yaratmak, 258 .NET Framework snf ktphanesi, 17 .NET Framework software development kit (SDK) (.NET Framework yazlm gelitirme kiti), 15 .NET Framework, 312 NETWORK SERVICE hesab, 610 new anahtar szc, 125, 156, 255 bir anonim snf yaratmak, 141 diziler oluumu yaratmak, 186 iki yntemin ayn imzaya sahip olmasna izin vermek, 223 temsilciyi ak bir ekilde balatmak, 314 <New Event Handler> komutu, 444, 458, 462 new ileci, 257 New Project iletiim kutusu, 5, 6, 18 new yntemleri, bildirmek, 222224 Next yntemi (System.Random), 187 NextPageText zellii (GridView), 470 no operator selected (hibir ile seilmedi) iletisi, 117 nokta (.) ileci, ar yklemeye izin verilmez, 396

M
Macar simgelemi, kullanlmyor, 32 Main yntemi, 8, 25 Application nesnesi ile karlatrmas, 429 mantk, uygulamalar iin gelitirmek, 58-59 mantksal AND (&&) ileci, 69 mantksal OR (| |) ileci, 69 Margin zellii dmeler, 419 Image denetimleri, 422 Label denetimleri, 20 onay kutular, 441 MARS (oklu etkin sonu kmeleri), 508 Match Case onay kutusu, 36 Math snf, 125, 136 Math.PI alan, 125 MathsOperators zm, 108 MathsOperators projesi, 40, 42-43 bir zel durum oluturmak iin kod eklemek, 115 mavi, olarak renklendirilmi anahtar szckler, 31 MaximumValue zellii (RangeValidator), 592 MaxValue zellii, 111 MemberChangeConflicts snf, 546-548 MemberConflicts zellii (ObjectChangeConflict), 546

N
Name zellii Button denetimi, 22 src deikeni, 89 TextBox denetimleri, 22 NaN (say deil) deeri, 40

ortak iletiim kutular iin kapsayclar nokta iareti nesne yelerine eriim, 258 yntemlere bavurmak, 234 yntemleri armak, 128 noktal virgl, ile tm ifadeleri sonlandrmak, 29 Northwind veritaban, hakknda, 500 Northwind veritaban, yaratmak, 500 NOT (!) ileci, 152 NOT (~) ileci, 296 NOT ileci, 68 NotImplementedException zel durumu, 253 Notify yntemi (Ticker), 328 null deerler, 430 bavuru deikenlerine atamak, 150 null dizisi, 187 null olabilen srm numaralandrma deikeninin, 168 yap deikeninin, 177 null olabilen trler, 151, 152, 156 null olabilen veri tr, 116, 151, 152 null olaylar, ortaya karmaya almak, 325 NullReferenceException zel durumu, 314, 325 numaralandrlabilir koleksiyon, 355, 376 numaralandrlabilir veri yaps, LINQ tarafndan istenen, 373 numaralandrma deikenleri ak bir ekilde dizeye evirmek, 168 altnda yatan tamsay deeri, 169 deer atamak, 168 deerini kullanmak, 168 numaralandrma deikenleri zerinde matematik ilemleri, 171 numaralandrma hazr bilgileri, 169 numaralandrma sras, tanm,363 numaralandrmalar, 167-172 arka plandaki tr semek, 170-173 dizileri, yaratmak, 186 yaplara kar, 172 numaralandrmalar, 356, 366-368 elle uygulamak, 357 hazr bilgi kullanarak uygulamak, 363-368 listedeki eleri gsteren iareti olarak, 356 MoveNext yntemi, 359 snamak, 362-363, 367-368 NumCircles alan (Circle), 137 olaylar meydana getirmek, 325 olaylar, 323, 327-329 abone olmak, 324 abonelii iptal etmek, 324 bildirimleri olaylarla etkinletirmek, 323 bildirmek, 323-324 dmeler arasnda ileyici kodu paylamak, 444 GUI denetimleri tarafndan retilen, 326 her denetim tarafndan desteklenen, 445 ortaya karmak, 325 tetikleyicilere kar, 428 Windows Formsda olaylar ilemek, 443-448 WPF formunda ilemek, 443448 yerleik gvenlik zellii, 325 olaylara abone olmak, 324 olaylara abonelii iptal etmek, 324 oluum alanlar, balatmak, 176 oluum yntemleri, 134-136 on yan tmcecii, 383 onaylanm deyimler, yazmak, 113-114 ondalk noktalar, ile tam saylar, 39 OnTimedEvent yntemi (Ticker snf), 328 Open iletiim kutusu, 88 Open Project iletiim kutusu, 34 openClick yntemi, 251 OpenFileDialog snf, 88, 471 FileName zellii, 88 openFileDialogFileOk yntemi, 88, 268 OperationContract znitelii (IService), 629 Operators projesi, 404, 409 OR (|) ileci, 297 orderby ileci, 382 OrderBy yntemi, 377 OrderByDescending yntemi, 378 ortak anahtar, diziler arasnda, 380 ortak iletiim kutular iin kapsayclar, 468

657

O
OASIS (Organization for the Advancement of Structured Information Standards), 626 obj klasr, 13 object anahtar szc, 158 object dizileri, 198 Object Relational Designer, 532 Object snf, 158 object tr, 61, 173, 333 dorulamak, 161 Object.Finalize yntemi, 259 ObjectChangeConflict snf, 546548 objectCount alan, artrmak, 139 ObjectCount yntemi, 140 odak, dorulama ve, 473, 479 OK dmesi, iin kod yazmak, 26-27 ok_Click yntemine kod eklemek, 26 okuma balam, zellikler, 279 olay alanlar, dolayl olarak null, 325 olay ileme bedelleri ve dngsel dolamlar ilemek, 582 Server denetimleri iin, 576-580 olay kayna, olarak grev yapacak ekilde tasarlanan snf, 323 olay yntemleri dmelerin Click olay iin olay yntemi oluturmak, 462 kaldrmak, 445 parametreleri, 444 olay yntemlerinin bamsz deikenler parametresi, 444

658

otomasyonlu fabrika iin denetim sistemleri otomasyonlu fabrika iin denetim sistemleri, 312 otomasyonlu fabrika, 312-316 otomatik zellikler nesne balatclar kullanarak tanmlamak, 290-292 Polygon snfna eklemek, 291 szdizimi, 288 retmek, 287-288 oturum ama formu, oluturmak, 599-601 out anahtar szc, 154 out bamsz deikeni, 283 out dzenleyici, 210 out parametreleri, 154-156 OutOfMemoryException zel durumu, 157 Output penceresi, 11 oval ayralar. Bkz. parantezler OverflowException zel durumu, 112 override anahtar szc, 181, 225, 226, 255 override yntemleri, 225-226, 246 mhrlemek, 246 OverwriteCurrentValue deeri (RefreshMode), 545, 546-548 OverwritePrompt zellii (SaveFileDialog), 469 bek bellei, 156, 157 eler dizilerin bildiriminde trleri kartrmak, 189 koleksiyonlarda numaralandrmak, 355-363 eler kmesi, ynlendirmek, 185 leklenebilirlik, Server denetim olaylar ve, 582 n ek deyimi, 401 ncelik, ileci, 70, 395, 396 denetlemek, 43-44 rtl yazlm deikenler, 47 rtl yazlm dizi, 188-189 zel alanlar ya da yntemler, 126, 139 adlandrmak, 282 okumak ve yazmak, 277 yaplarda, 174 zel durum oluturduktan sonra uygulama, 118 zel durum-gvenli yok etme, 263-264 zel durumlar birden ok zel durum yakalamak, 106-111 ilemek, 105 ilenmemi, 105 zel durum oluturma ifadesi iin, 115 zel durum oluturmak, 114118 zel duruma neden olan kod satrlarn grntlemek, 109 zel durum-gvenli kod yapmak, 267-269 tm potansiyel zel durumlar yakalamak, 107 uygulama akn deitirmek, 118 yakalamak, 117 yararl bilgi iermek, 107 zel durumlar oluturmak, 114118 zel durumu farkeden programlar, yazmak, 104 zel durumu yakaladktan sonra uygulama, 105 zel kurucular, 127 zellikler, 278-283 adlandrmak, 282 alanlar gizlemek, 275, 287 arabirimler olarak, 284 atama (=) iaretini ile olarak simle etmek, 396 dinamik olarak deitirmek, 439-443 diziler dndrmek, 301 dizinleyicilere kar, 299 eriilebilirlik, 281-282 ierikleri okuma ve yazma, 279 iin derleyicinin rettii kod, 287 nesneleri balatmak, 288-292 null olabilen trlerin, 152 otomatik, retmek, 287-288 tanmlamak iin nedenler, 287 zerinde kstlamalar, 282-283 Windows uygulamalarnda, 285-286 zet ilevleri, 382 zet yntemleri, 379 znitelikler, programa eklemek, 8 zyinelemeli algoritmalar, 340, 357, 367

P
Pack snf, 202 @Page znitelii, 583, 585 PageButtonCount zellii, 470 PagerSettings zellii (GridView), 470 Parameters projesi, 147 parametre dizileri, 207 parametreler ak bir ekilde parametre trlerini belirtmek, 50 hibir zaman ykclarla bildirilmez, 259 lambda deyiminde parametreler belirlemek, 322 ref anahtar szc ile n ek eklemek, 153 WriteLine yntemi iin, 9 yap iin yaratmak, 176 yntemler iin, 50 params anahtar szc, 207, 209, 210 params dizisi, 209-210, 212-214 bildirmek, 209-210 params iermeyen yntem, 210 params nesnesi, 211 ParamsArray projesi, 212 parantezler, 44 bir if ifadesinde, 73 geersiz klma ncelii, 44 her yntem arsnda kapsamak, 54 if, while ve for ifadeleri zerinde ifade blounu ak ekilde betimlemek, 92 olaylarla kullanmak, 331 while ifadesinde, 87 parolalar, kod iinde yazmak, 505 Parse yntemi Int32 yapsnn, 55, 173 int trnn, 42 partial anahtar szc, 130 PascalCase isimlendirme kural, 127 PasswordRecovery denetimi, 563, 602 paylalan alan, 137, 139 pencere ksayol mens, 466-467 pencere uygulamalar dizinleyiciler, 303-308 zellikleri kullanmak, 285-286

sbyte tr pencereler, 286 performans p toplama, 150 daha sonra veri almaya karlk hemen veri alma (DLINQ), 516, 521 Server denetimi olay ileme, 582 veritaban balantlar ve havuzlama, 510 veritabanlarnda kilitlenmi veri, 508 pi, yaklak deeri, 125 Point snf, 131 Polygon nesneleri, 291 pop ileci, 197 pozitif rastgele tamsay, retmek, 203 Press any key to continue... (Herhangi bir tua basn) uyars, 13 PreviousPageText zellii (GridView), 470 PrimitiveDataTypes projesi, 34 private anahtar szc, 126, 139, 141, 255 procedures (yordamlar), yntemler olarak, 51 ProductsService Web servisi (rnek). Bkz. Web servisleri, oluturmak program iin girdi noktas, gsteri, 8 Program.cs dosyas, 8 programn uygulanabilir srm, 13 programlanabilir Web kavram, 624 programlar C#da programlar yazmak, 8-14 derlemek, 11 ilenmemi bir zel durum ile sonlandrmak, 105 snamak, 63 proje dosyalar, 8, 35 Project Types blmesi, 18 Properties klasr, 8 Properties penceresi, 20, 421 Properties penceresi, ASP.NET Web uygulamas, 566, 578 protected anahtar szc, 228, 255 public anahtar szc, 126, 141, 255 kurucu iaretlemek, 128 push ilemi, 197 resimler, Grid arkaplannda grntlemek, 422 ResizeMode zellii, 461 Resources esi (denetimler), 424 result yan tmcecii, 53 return anahtar szc, 51 return ifadeleri, 51-53, 113 return tr, 50 ReturnCardsTo yntemi (Hand), 204 rol datm, 161-164, 169 RoutedEventHandler temsilcisi, 325 RoutedEventHandler tr, 466 run yntemi, 58, 63 runat znitelii (HTML denetimleri), 575 runat znitelii (Server denetimleri), 575

659

Q
QueryBinaryTree zm, 384 Quick Find iletiim kutusu, 36 Quick Replace iletiim kutusu, 36

R
RadioButton denetimleri, 434, 442, 570 Random snf, 202 Random.Next yntemi, 203 RangeValidator denetimi, 588, 592-593 rasgele say retici, 187 rasgele say retimi, 187, 202 tekrarlanabilir sralama, 187 Read yntemi (SqlDataReader), 507 readDouble yntemi, 59, 64 readInt yntemi, 59, 60 ReadLine yntemi, 60, 89, 263 ref anahtar szc, out anahtar szc karlatrmas, 154 ref bamsz deikeni, zellikte izin verilmez, 283 ref dzenleyici, 210 ref parametreleri, 153, 155-156 References klasr, 8 Refresh yntemi (DataContext), 545, 555 RefreshMode numaralandrma, 545, 546 RefreshTime yntemi (Clock), 317 RegularExpressionValidator denetimi, 588 Release klasr, 13 Remove yntemi (ArrayList), 194 Remove yntemi, 548, 549 RequiredFieldValidator denetimi, 588, 589-592 Reset yntemi, 356, 439-443, 444, 459 resim denetimleri, 422, 423 resim dosyalar, bir uygulamaya eklemek, 422

S
sa alt aa, 338, 347 sa-birleik ileler, 395 sadan sola birleirlik, 45 salt ileri imleler, 508 salt-okunur dizinleyici, 300 salt-okunur zellikler, 280 salt-yazma dizinleyiciler, bildirmek, 300 salt-yazma zellikler, 280, 281 sanal dizinleyici uygulamalar, 303 sanal yntemler, 224 bildirmek, 224-225 okbiimlilik, 226-227, 232 IntelliSense grntlemek, 232 sadece geersiz klmak, 226 yntemlerin ilk uygulamas olarak, 246 Save File iletiim kutusu, 469 Save Member Information men esi, 460-461 SaveFileDialogBox snf, 468-471 saveMember_Click yntemi, 470 saylar, tabann deitirmek, 235 saysal alan, TextBox denetimi olarak, 318 saysal saat uygulamas tamamlamak, 316-319 yeniden yazmak, 327-329 sbyte tr, 173

660

ScreenPosition yaps ScreenPosition yaps, 277, 278 sealed anahtar szc, 246, 255 Security sekmesi (ASP.NET Web Site Administration Tool), 601 seenek dmeleri, balamak, 568, 570 sekizlik (8 taban) deer, 94 Select yntemi (Enumerable), 374, 375, 376, 377 Selection projesi, 74 selector parametresi (Select), 375 sender parametresi, olay yntemi, 444 Sentinel deikeni, 87 <Separator/> esi, 455 serbest biimli dil, 30 seriletirme, 629, 632 seriletirmeyi iptal etmek, 629 Server denetimleri, 562, 575-582. Ayrca bkz. zel denetim adlar iin olay ileyiciler, 576-580 olay ileme ve dngsel dolamlar, 582 Service znitelii, @ServiceHost ynergesi, 630, 635 Service.svc dosyas, 630 <service> esi (Web.config), 636 ServiceContract znitelii (IService), 629 @ServiceHost ynergesi, 630 <services> esi (Web.config), 635 set eriimcisi arabirimlerdeki yntemler, 284 bir dizinleyicide, 298 armak, 279 dizinleyicinin, 299 iin zellik eriilebilirliini geersiz klmak, 281 parametreler izin verilmedi, 283 sadece set eriimcisi ieren zellikler, 280 Setter eleri, 427 shift ileleri, 296 short tr, 170, 173 Show All Files ara ubuu dmesi, 13 Show Steps dmesi, 94 Show yntemi (MessageBox), 446 Show yntemi (Selection), 75 showBoolValue yntemi, 38 ShowDeleteButton zellii, 613 ShowDialog yntemi, 469, 470, 471, 553 showDoubleValue yntemi, 38 ShowEditButton zellii, 613 showFloatValue yntemi, 36 ShowInsertButton zellii, 613 showIntValue yntemi, 37 showResult yntemi (Method), 53, 55 showStepsClick yntemi, 95 Shutdown yntemi (Controller), 314 sfr uzunlukta dizi, zerinden tekrarlamak, 211 sfra blmeye alma iletisi, 118 snamak InsertIntoTree yntemi, 353 numaralandrmalar, 362-363, 367-368 programlar, 63 veri balama ile kullanc dorulama, 490, 494 Web formlar, 573, 580, 609 Web servisleri, 642 snf alanlar. Bkz. statik alanlar snf izelgeleri, retmek, 254 snf ktphaneleri, 341 snf ktphaneleri, snamak, 348 snf trleri, 145 snf yntemleri. Bkz. statik yntemler snflandrma, 123 kaltmla alma, 217 snflar hiyerarisi, 228-233 snflar, 123 adlandrma kurallar, 127 anahtar szck kombinasyonlar, 255 arabirimler zerinden bavurmak, 243 bavuru trleri olarak, 402 derlemelere dntrmek, 16 dizileri, yaratmak, 186 dzenlemek, 221-222 hiyerarisi yaratmak, 228-233 hiyerarisinde gezinmek, 254 ileler, 402 kaltm, 218 kapsam tanmlamak, 56 ksmi, 129-130 miras kalma yoluyla balanmak, 227 mhrl (sealed), 246 oluumlar (nesneler), 176, 290 snf hiyerarisine eklemek, 245 statik snflar bildirmek, 138 tanmlamak ve kullanmak, 8, 15, 124-125 tarafndan tanmlanan deikenler, 56 tasarlamak, 123 temel snf olarak kullanmaktan kanmak, 246 varolan tm snflarn izelgesini retmek, 254 yaplar vb., 172, 175-176 sralanm ikili aa, 340, 341, 346 silme ileci, C# sahip deil, 258 simetrik ileler, 398-399, 408 simgeler, men elerine eklemek, 455 Single yntemi, 515 sistem zel durumlar, tm olas sistem zel durumlarn yakalamak, 107 sizeChanged yntemi, 286 .sln dosyalar, 35 SOAP (Simple Object Access Protocol), 624 Web servisine istemci arlar, 637, 639-642 Web servisleri kullanmak, 638643 sol alt aa, 338, 347 sola eik izgi (\) k karakteri, 83 sol-birleik ileler, 44 sol-kaydrma (<<) ileci, 296, 297 Solution alan, 18 Solution Explorer, 7, 13 son ek deyimi, 401 son giren ilk kar (last-in, first-out (LIFO)) mekanizmas, 197 sonlandrma, 261, 262 Sonsuz Atama Kural, 34 sonsuz yinelemeli dngler, 282 sorgu ileci semek, 381 sorgu ileleri, 381-383, 388 SortedList koleksiyon snf, 199200 soru iareti (?), 151

System .Random snf source parametresi (Select), 375 soyut snflar, 244-246 arabirimlerle karlatrmas, 239 sealed (mhrl) olmasna izin verilmedi, 246 soyut yntemler, 245 SQL DELETE komutlar, 548 SQL INSERT komutlar, 548 SQL ifadeleri, 372 SQL ilikili ilemler, 377 SQL saldrlar, 506 SQL SELECT komutlar, 515, 516 tablolar birletirmek, 517 SQL Server 2005 Database, iin izinler, 501 SQL Server 2005 Veritaban yaratmak iin izinler, 501 SQL Server Authentication, 505 SQL Server veri dosyas, balanmak, 530 SQL Server veritaban, eriim, 372 SQL UPDATE komutu, 544 SqlClient ad alan, 503 SqlCommand snf, 506 SqlConnection snf, 504 kapatmak, 508 SqlDataReader snf, 506, 516 kapatmak, 508 veritabanlarnda kilitlenmi veri, 508 SqlDataReader ve SqlConnection nesnelerini kapatmak, 508, 510 SqlException zel durumu, 504 SqlNullValueException zel durumu, 510 Sqrt yntemi (Math), 135, 136 src FileInfo deikeni, 89 Stack koleksiyon snf, 197 StackOverflowException, zellik bavurusundan, 282 StackPanel denetimleri, 418, 433 standart ileler, numaralandrma deikenleri zerinde kullanmak, 169 Start Debugging komutu (Web uygulamalar), 573 Start Without Debugging komutu, 13 Start yntemi, 319, 329 StartEngine yntemi (Vehicle), 229 StartupUri zellii, 25, 429 static anahtar szc, 137, 139 StaticResource anahtar szc, 426 statik alanlar, 136-138, 173 statik deikenler. Bkz. statik alanlar statik dizinleyiciler, izin verilmez, 299 statik ileler, 397 statik kaynaklar, kapsama kurallar, 426 statik olmayan alanlar, 137 statik zellikler, bildirmek, 280 statik snflar, 138-141, 234 statik snftaki statik yeler, 138 statik yntemler, 136, 173 Step Into dmesi (Debug ara ubuu), 64, 65, 99 Step Out dmesi (Debug ara ubuu), 64, 65 Step Over dmesi (Debug ara ubuu), 64, 65 stiller denetimler, 429, 437-438 kapsam, 424 kaynaklar olarak, 424 pencereler iin kaynaklar olarak tanmlamak, 425 tanmlarn deitirmek, 426 Stop yntemi, 318, 329 StopEngine yntemi (Vehicle), 229 Storage parametresi (Association znitelii), 518 StreamReader snf, 263, 265 StreamWriter snf, 460 Stretch deeri, 420, 453 string anahtar szc, 145, 349 string tr, 173 bavuru tr olarak, 145 semek, 35 string veri tr, 34, 446 String.Format yntemi, 446 StringBuilder snf, 446 StringReader snf, 263 struct anahtar szc, 174 StructsAndEnums projesi, 170, 180 Style zellii (denetimler), 424 Style znitelii, Web form denetimleri, 569 <Style.Triggers> esi, 428 <Style> esi (denetimler), 424 SubmitChanges yntemi (DataContext), 545-548 subroutine, yntem tr olarak, 51 subtractValues yntemi, 42 Sum yntemi (Util), 212 sunucu istekleri ve yantlar, 560, 562, 626 Server denetimleri ile olay ileme, 582 Web servis isteklerini ynlendirmek, 626 sunucu taraf giri dorulama, 588, 593 Supplier zellii, 518 SuppressFinalize yntemi, 267 Swap<T> yntemi, 350 switch anahtar szc, 79 switch ifadeleri, 78-83 kurallar, 80-81 szdizimi, 79-80 switch ifadelerinde gei, 81 SwitchStatement projesi, 81 System ad alan, tm eleri grntlemek, 16 System.Array snf, 190, 192, 355 System.Collections ad alan, 192 System.Collections.Generic. Queue<T> snf, 337 System.Collections.IEnumerable arabirimi, 355 System.Collections.Queue snf, 337 System.Data.SqlClient ad alan, 503 System.GC.Collect yntemi, 261 System.IComparable arabirimi, 342, 342-343 System.Int32 tr, 233, 349 System.Int32 trnde struct deikeni, 349 System.Object snf, 158 kaltmla otomatik geen yntemler, 220 otomatik kaltmla alma, 333 tm snflarn kk snf olarak, 219 System.Random snf, 187

661

662

System .Runtime .Serialization ad alan System.Runtime.Serialization ad alan, 629 System.ServiceModel ad alan, 629 <system.serviceModel> esi (Web.config), 635 System.String snf, 145 system.web dosyas, 384 System.Windows.Forms ad alan, 442 SystemException ailesi, 107 ValidationSummary denetimi, 594-595 TargetType znitelii, 426, 427 tarihler, gerek dnya uygulamalarnda karlatrma yapmak, 78 tasarm grnm, 17 tamay denetlemek, 111, 112 tek tek dizi eleri, erimek, 189 tekrarlama anahtarlar, 198, 199 tekrarlama deerleri, ihmal etmek, 382 tekrarlamalar, yok etmek, 379 temel snflar gizli yelere eriim iin tretilmi snflara izin vermek, 227 kaltmla alnan tretilmi snflar, 218 kurucular armak, 220-221 Templates blmesi, 18 temsilciler, 311, 316-319 ilev arsn ile olarak simule etmek, 396 otomasyonlu fabrika senaryosu, 313-316 tetikleyicilere kar olaylar, 428 Text blm, Properties penceresi, 21 Text zellii, 36 ComboBox denetimleri, 446 TextBox denetimleri, 42, 446 TextBox denetimleri, 42 formlara eklemek, 22, 431 nceden tanml zelliklerini kullanmak, 285 varsaylan ksayol mens ile ilgili, 464 zengin metin kutular ile karlatrmas, 251 TextChanged olay, 588 TextPointer deikenleri, 252 TextReader snf, 89, 263, 264 ThenBy yntemi, 378 ThenByDescending yntemi, 378 this anahtar szc deikenler nitelendirmek, 133 dizinleyicilerde, 298 geniletilmi yntem tanmlamak, 234 statik alanlar ve yntemler ile izin verilmez, 139 throw ifadesi, 115 TItem tr, 352, 361 Tick temsilcisi, 317 Ticker snf, 316, 327 tilda (~), 258 tipik iletiim kutusu, 469 Title zellii (formlar), 22 Title zellii (SaveFileDialog), 469 Title znitelii, 417 to do deeri, Sample deer kutusunda, 35 ToArray yntemi, 516, 521 generic ve generic olmayan srm, 391 nbellee alnm koleksiyonlar diziler olarak saklamak, 389 tock yntemi (Clock), 404 Today yntemi (DateTime), 442 Token.Accept yntemi, geersiz klmak, 253 Tokenizer projesi, 247 tokens (simgeler), 247 ToList yntemi, 389, 391, 516, 521 Toolbars komutu, View mens, 63 Toolbox amak, 20 eriilebilir tutmak, 20 Toolbox sekmesi, Design View penceresi, 20 ToolTip denetimleri, dorulama hata iletileri iin, 479 toplama ileleri, ncelii, 44 ToString yntemi amac, 43 eklemek, 181, 384 int trnn, 43 kendi srmnz salamak, 224 numaralandrmalarda, 168 System.Objectin, 220, 224 varsaylan davran, 181 yaplarn, 172 Tree<TItem> nesneleri, veri sorgulamak, 383-388 Tree<TItem> snf bir geniletilmi yntem yaratmak, 352 IEnumerable<TItem> uygulamak iin deitirmek, 361

T
T (type parametresi), 336 Table koleksiyonu, deitirmek. Bkz. veritaban verisini deitirmek tablo ilikileri, belirlemek (DLINQ), 517 tablolar arasndaki ilikiler, belirlemek (DLINQ), 517 tablolar birletirmek (DLINQ), 517 tamsay aritmetii, 111-114 tamsay deerler koleksiyonlarda otomatik olarak kutulanm, 193 tamsay deerin en kn bulmak, 209 tamsay dizin, 198 tamsay sabiti, 169 tamsay trleri, 170 dizeleri tamsay trlerine dntrmek, 39, 42 tanmlama bilgileri, 384, 561 tanmlayclar, 30 anahtar szckler olarak ayrlm, 30 ar yklenmi, 57 C# tarafndan kullanlan, 31 iin esiz ve anlaml isimler, 222 sadece byk harf-kk harf asndan farkllk, 32 taraycya dayal giri dorulama, 588-595 dinamik hata iletileri, 596 etkisizletirme, 593 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592

veri iin numaralandrc uygulamak, 366 snamak, 348-350 yaratmak, 344-348 TreeEnumerator snf, 357-360 TResult parametresi (Select), 375 try blou, 104, 110 try/catch ifadeleri, 108-111 TSource parametresi (Select), 375 tmleik programlama ortam (integrated development environment). Bkz. IDE tr nesnesi deikenleri, 159 tretilmi snf yntemi, 222 tretilmi snflar, 218 ortak uygulamalar paylamak, 244 temel snf kurucusunu aran kurucu, 220 uygulamalar inemek, 284 yeni yntem uygulamalarn bildirmek, 225 trler arabirimde trlerin yuvalanmasna izin verilmez, 241 dnmn baarsz olmasna neden olan uyumsuzluk, 160 indicated by an IntelliSense simgesi, 10 kodu etkilemeden geniletmek, 233 statik yntemlerle geniletmek, 233 Type zellii (RangeValidator), 592 type parametreleri, 335 birden fazla type parametresi belirtmek, 336 generic snflar ve yntemler tarafndan kabul edilen, 335 ile tanmlanan deikenler balatmak, 361 UpdateTarget yntemi, 570 Use Windows Authentication seenei, 533 ushort tr, 173 using ifadesi, 16, 264-265 ad alann kapsam iine getirmek, 15, 24 using ynergesine karlk, 264 yazmak, 267-269 using ynergesi, 15, 16, 348 using ifadesine karlk, 264 UsingStatement projesi, 267 Util snf kapsam iine getirmek, 234 Sum yntemini snamak, 214 uyarlar gizlemek, kapatmak, 224 uyarlayc yntemler, 320 uyarlayclar, 320 lambda deyimlerini uyarlayclar olarak kullanmak, 320-321 uygulama ak, kesmek, 311 uygulama mens, oluturmak, 452-456 uygulama programlama arabirimi. Bkz. API uygulama yaplandrma dosyalar, 535 uygulamalar ASP.NET. Bkz.ASP.NET gerek dnyada tarihleri karlatrmak, 78 uygulamalar iin mantk gelitirmek, 58-59 uygulamalar ile uyumluluk, 287 uygulamalarn mr, 429 l ile, 482 nlem iareti (!), 68 ValueConversion znitelii, 568 var anahtar szc, 47 ak bir ekilde yazlm deiken bildirmek, 141 Variant ile karlatrmas, 47 varargs makrolar, tr gvenli edeeri, 209 variadic yntemi, 207 Variant tr, 47 varlk, 123 varlk snflar, tanmlamak, 512514, 523 varlk snflar, retmek, 532 varsaylan kurucu, 128 Date yaps iin, 180 derleyicinin rettii, 127 Point snflar iin, 131 Polygon snfna eklemek, 291 Random snf iin, 187 statik snf iin, 138 yap iin izin verilmez, 175 yapdaki alanlar balatmak, 178 yazmak, 129, 132 varsaylan olmayan kurucular, 128, 175 Vehicles projesi, 228 veri azalan srada numaralandrmak, 378 belirli bir srada veri almak, 377 bellekte dzenlemek, 156 bilgiyi elde etmek iin veri kayna, 606 formu dzenlemek, 566, 607609 formu test etmek, 609 geniletilmi yntemleri kullanarak BinaryTreeden veri almak, 384-388 gruplamak, 382 LINQ kullanarak birletirmek, 380-381 LINQ kullanarak filtrelemek, 377 LINQ kullanarak semek, 374376 metin dosyasna kaydetmek, 460 ortak deerlere gre gruplamak, 378 snf verisi, 124 sralamak, 382

663

V
ValidateNames zellii (SaveFileDialog), 469 ValidationRules esi (Binding), 478, 492 ValidationSummary denetimi, 589, 594-595 value anahtar szc, bir dizinleyicide, 299 Value zellii (denetimler), 152, 442 Value zellikleri (DictionaryEntry), 198

U,
uint tr, 173 ulong tr, 173 unary ileleri, 46, 395, 397 unchecked anahtar szc, 112 unsafe anahtar szc, 163 /unsafe seenei, 164 UpdateSourceTrigger zellii, 492

664

veri almak ve grntlemek veri (devam) sorgu ilelerini kullanarak BinaryTreeden veri almak, 388 Tree<TItem> nesnelerinde, 383-388 veriyi sayfalandrmak, 469, 605 Web formlar ile dzenlemek, 612-614 Web formlar ile sorgulamak ve grntlemek, 605-612 veri almak ve grntlemek, 521 veri balamak, 529-556, 562, 618 dorulama noktas, 491 hata iletisi kiiselletirme, 479481 veri balama kullanarak giri dorulama, 475-491 veriyi dzenlemek iin DLINQ, 544-556 veri btnl, koleksiyonlar, 381 veri gncellemeleri akmas, ilemek, 545-548 veri kaynana balamak, 529556, 562, 618 dorulama noktas, 491 hata iletisi kiiselletirme, 479481 kullanarak giri dorulama, 475-491 veriyi dzenlemek iin DLINQ, 544-556 veri kaynana balanmak, 606, 616 veri trleri, ayn ilemi farkl veri trlerinde gerekletirmek, 58 veritaban balantsn kesmek, 508, 509, 510 veritaban dzenleme DLINQ ile, 544-556 gncelleme akmasn halletmek, 545-548 mevcut veriyi gncellemek, 544 veri eklemek ve silmek, 548-556 veritaban eriimi, Windows Vistaya eriim hakk vermek, 531 veritaban gncellemeleri DLINQ ile, 544 gncelleme akmalarnn stesinden gelmek, 545 veritaban sorgular, 499-528 ADO.NET ile, 499-511 DLINQ ile, 512-527 null deerleri ilemek, 510, 511 zel DataContext snflar, 522 sorgular yaratmak ve altrmak, 514-516, 525 tablolar birletirmek ve iliki yaratmak, 517 veritaban balantsn kesmek, 508 veritabanna balanmak, 503504 veriyi almak ve grntlemek, 507 veriyi hemen almak ve daha sonra almak, 516, 521 veritaban verisini deitirmek DLINQ ile, 544-556 gncelleme akmalarnn stesinden gelmek, 545-548 mevcut veriyi gncellemek, 544 veri eklemek ve silmek, 548-556 veritaban, veritabanna balanmak, 503-504 balantlar kapatmak, 508, 509, 510 veritabanna veri eklemek, DLINQ ile, 548-556 veritabanndan ertelenmi veri alma, 516, 521 veritabanndan veri almak, 499528 ADO.NET ile, 499-511 DLINQ ile, 512-527 null deerleri ilemek, 510, 511 zel DataContext snflar, 522 sorgular yaratmak ve altrmak, 514-516, 525 tablolar birletirmek ve iliki yaratmak, 517 veri almak ve grntlemek, 507 veritaban balantsn kesmek, 508 veritabanna balanmak, 503504 veriyi hemen almak ve daha sonra almak, 516, 521 veritabanndan veri silmek, DLINQ ile, 548-556 veritabann gncellemek DLINQ ile, 544 gncelleme akmalarnn stesinden gelmek, 545 veritabanlarna balanmak, 503504, 508 veritabanlarnda kilitlenmi veri, 508 veritabanlarndaki bilgiyi sorgulamak, 499-528 ADO.NET ile, 499-511 DLINQ ile, 512-527 null deerleri ilemek, 510, 511 zel DataContext snflar, 522 sorgular yaratmak ve altrmak, 514-516, 525 tablolar birletirmek ve tablolar arasnda ilikiler yaratmak, 517 veri almak ve grntlemek, 507 veritaban balantsn kesmek, 508 veritabanna balanmak, 503504 veriyi hemen alma ve daha sonra alma, 516, 521 veritabanlarndaki null deerler, 510, 511 veritabanlarndan hemen almak, 516, 521 veriyi filtrelemek iin where ileci, 382 VerticalAlignment zellii (Button), 419 VerticalAlignment zellii (Menu), 453 View mens (Properties penceresi), 20 virtual anahtar szc, 224, 255 geersiz klma yntemi ile izin verilmez, 226 zel ynteme izin verilmez, 225 yap oluturmak geerli deil, 285 VisitIdentifier yntemi, 249 Visitor modeli, uygulamak, 247 visitor parametresi, 248 Vista, veritaban eriim hakk vermek, 531 Visual Basic uygulamas, iin Add yntemi salamak, 400

Windows Communication Foundation (WCF) Visual C# 2008 Express Edition, 4 proje dosyalarnn konumunu belirlemek, 6 SQL Server veri dosyas, balanmak, 530 yeni grafiksel uygulama yaratmak, 18 yeni konsol uygulamas yaratmak, 6 Visual Studio 2008 kmak, 27 grafiksel uygulama yaratmak, 18-26 ile programlamaya balamak, 3-8 Visual Studio 2008 hata yakalayc, 63-66 Visual Studio 2008 Professional Edition, 4 Visual Studio 2008 Standard Edition, 4 Visual Studio Just-In-Time Debugger iletiim kutusu, 109 Visual Studioyu balatmak, 5 void anahtar szc, 50, 51 ValidationSummary denetimi, 594-595 veri sorgulamak ve grntlemek, 605-612 veriyi dzenlemek, 612-614 yerletirmek, 566, 607-609 Web formlar arasnda gezinmek, 614-621 Web formlar iin stil, 569, 582 Web formlar ile veri dzenlemek, 612-614 Web formlar ile veri sorgulamak, 605-612 bilgi almak iin veri kayna, 606 formu snamak, 609 formu yerletirmek, 566, 607609 Web formlarnda Update dmesi, 612 Web formlarnda veri dorulamak, 614 Web formlarnda veri grntlemek, 605-612 bilgi almak iin veri kayna, 606 formu test etmek, 609 formu yerletirmek, 566, 607609 veriyi sayfalandrmak, 469, 605 Web formlarnda veriyi sayfalandrmak, 469, 605 Web formlarndaki Cancel dmesi, 612 Web formlarndaki denetimler. Bkz. Server denetimleri Web formlarndaki dmeler, 612 Web formlarn yerletirmek, 566, 607-609 Web formu denetimlerinin zellikleri, 568 temalar kullanmak, 582-586 Web formunda Edit dmesi, 612 Web Services Enhancements (WSE) paketi, 627 Web servis isteklerini adreslemek, 626 Web servis isteklerini ynlendirmek, 626 Web servisleri, 623-644 anlamalar tanmlamak, 631-633 istemci uygulamalarndan armak, 637 kullanmak, 638-643 oluturmak, 627-636 temelleri, 623-627 Web servisi yaplandrmak, 635-636 Web servisleri iin ilkeler, 626 Web servisleri ile a zel durumlar, 641 Web servisleri kullanmak, 638-643 Web sitelerini IISe yaymak, 574 Web sitelerini korumak. Bkz. gvenlik Web sitesi gvenlii. Bkz. Formlara dayal gvenlik Web sunucu istekleri ve yantlar, 560 Server denetimleri ile olay ilemek, 582 Web servis isteklerini ynlendirmek, 626 Web uygulamalar iin temalar, 582-586 Web uygulamalar. Bkz. ASP.NET Web formlar Web servisleri web.config dosyas, 564 Web servisleri yaplandrmak, 635-636 Web uygulamalar iin temalar, 584 Where yntemi, 377 while dngs, 90, 92 while ifadeleri, 87-90 while ifadelerinin sonlandrmas, 87 WhileStatement projesi, 88 Width zellii (formlar), 431 Width zellii (Menu), 453 Window snf, nceden tanml zellikleri, 285 Window_Closing olay yntemi, 447 window1SizeChanged yntemi, 286 WindowProperties projesi, 285 Windows aa yukar oku (Debug ara ubuu), 98 Windows Authentication, 505, 533 Windows Communication Foundation (WCF), 627

665

W
WalkTree genel yntemi, 347 WCF (Windows Communication Foundation), 627 Web form verisi iin veri kayna, 606, 616 Web form yerleimi iin Toolbox, 567 Web formlar arasnda gezinmek, 614-621 bilgiyi almak iin veri kayna, 606 denetimler. Bkz. Server denetimleri etkisizletirmek, 593 istemci tarafnda giri dorulama, 588-595 RangeValidator denetimi, 588, 592-593 RequiredFieldValidator denetimi, 588, 589-592 snamak, 573, 580, 609 sunucu tarafnda giri dorulama, 588, 593

666

Windows formlarnda olaylar ilemek Windows formlarnda olaylar ilemek, 443-448 Windows Forms Application ablonu, 18 Windows Forms ktphanesi, kapsam iine getirmek, 432 Windows ortak iletiim kutular, 468 Windows Presentation Foundation. Bkz. WPF WPF formlar Windows simgesi (Debug ara ubuu), 98 Windows Vista, veritabanna eriim hakk vermek, 531 WindowsFormsHost denetimleri, 432, 433 WPF (Windows Presentation Foundation), 18 WPF Application simgesi, 18 New Project iletiim kutusunda, 19 WPF Application ablonu, 18 WPF denetimleri, 430-438, 444 WPF formlar beklenen anlk yant, 311 iin kod, 326 olaylar ilemek, 443-448 WPF kullanc arabirimi olaylar, 325-327 WPF uygulamalar, 415-429 WrapPanel, 418 WrappedInt deikeni, 148 WrappedInt nesnesi, 149 WrappedInt parametresi, 148 writeFee yntemi, 59, 65 WriteLine yntemi, 57, 131, 212 ar yklemenin klasik rnei olarak, 207 bamsz deikeninin ToString yntemini armak, 181 bir numaralandrma deikeni grntlemek, 168 girmek, 9 srmleri, 9, 57 yertutucular ieren dize bamsz deikeni biimini desteklemek, 212 WS-Addressing bildirimi, 626, 627 WSDL (Web Services Description Language), 625 WSE (Web Services Enhancements) paketi, 627 WS-Policy bildirimi, 626, 627 WS-Security bildirimi, 626, 627 yeni satr karakteri (\n), 90 yerel deikenler, 29, 56 atanmam, 34 do dngsnde, 99 dolayl yazlm yerel deikenler bildirmek, 47-48 geerli yntemde grntlemek, 98 yerel int deikeni, bildirmek, 147 yerel kapsam, tanmlamak, 56 yerel WrappedInt deikeni, bildirmek, 148 yerleik dnmler, salamak, 406-407 yerleik snf, 9 yerleik trler anlamlarnn deitirilmesine izin verilmedi, 396 iin yerleik dnmler, 406 yerleim blmesi, balca amac, 418 yerleim, formlar iin ayarlamak, 434 yn bellei, dzenlenmesi, 156 yn zerindeki elere bavurular (izin verilmeyen), 159 yn, 156, 157 ykclar, 241 bir arabirimde izin verilmez, 241 dikkatlice yazmak, 262 ieren snflar, 262 kstlamalar uygulamak, 259 nlemek, 262 yazmak, 258, 258-260 ykclardan Dispose yntemini armak, 266-267 yield anahtar szc, GetEnumerator ile, 364 yineleme ifadeleri, yinelemenin denetleme says, 85 yineleme mekanizmalar, alternatif, 365 yineleyiciler uygulama ilkeleri, 363-365 var olarak bildirmek, 191 y-koordinatlar, 131, 134 Ynetici hesab, 501 yntem adlar, 49, 50, 246 yntem arlar, 53-55, 242, 314 yntem gvdesi, 49, 50 yntem imzalar, ayn, 225

X
XAML (Extensible Application Markup Language), 540 XAML blmesi, menler yaratmak, 452 XAML, 19, 417 x-koordinatlar, 131, 134 xmlns znitelikleri, 417 XMLPad, indirmek, 19 XOR (^) ileci, 297

Y
ya hep ya hi kural, 403 yap deikenleri, kopyalamak, 179-182 yap trleri, 172-173, 174, 180-182 yaplar ak ekilde mhrlenmi olarak, 246 balatmak, 177-178 bildirmek, 174-175 derleyicinin rettii varsaylan kurucu, 175 dizilerini oluturmak, 186, 188 iin kurucular, 178, 188 ile almak, 172-182 ile kaltmla almaya izin verilmez, 218 ileler, 402 rnekleri, deerler olarak, 176 snflarla karlatrmas, 175-176 tarih gstermek, 179 yapl trler, 337 Yapsal Sorgu Dili (Structured Query Language). Bkz. SQL ifadeleri yararl yntemler, 136 yaygn iletiim kutular, 468 yaz tipi, tm form denetimlerine uygulamak, 429 yazlm gelitirme ortam ayarlar, varsaylan, 4 yazma balam, zellikler, 279 Year zellii, dateCompare ile karlatrmas, 76

z-sras yntem parametreleri, 133, 146 yntem uyarlayclar, yaratmak, 319 yntem yerletirmek, 358, 359 yntemler liste kutusu, 440, 441 yntemler, 29, 49, 52-53, 123 ar yklemek, 207 bamsz deikenleri deitirmek iin yntemler yazmak, 153 bamsz deikenlerin deiken saysn almak iin yntemler yazmak, 207 bildirmek, 49, 136, 228 armak, 53-55 dizinleyicilerle karlatrmas, 298 geersiz klmak, 181, 231 gizli alanlar kullanmak, 276 iine ve dna adm atmak, 63 kaltmla almak, 218 kapsam, 56 kastl olarak geersiz klnm, 224 maksimum uzunluk, 53 minimum uzunluk, 53 ortak yntemler ilemek, 217 eleri, 320 parametreler olarak farkl trler tanmlamak, 243 program yntemlere ayrmak, 67 ref parametresi almak iin dzenlemek, 155 snflarn yntemleri, 124 szdizimi, 50-51 temsilciler tarafndan bavurulan, 311 Tick olayna abone olmak, 328 yazmak, 58-66 yndan kazanlm bellek, 156 yntemler dndren deyimler, 320 yntemler kullanarak kapslleme uygulamak, 276277 yntemlere bamsz deikenler geirmek, 152, 333 yntemlerin iine (dna) girmek, 63 yuvalanm MenuItem eleri, 457 yzde iareti (%), 40

667

Z
zamanlayc snflar, 317 z-ekseni, 423 zengin metin kutusu, 251 ZIndex zellii (denetimler), 423 ziyareti snfn grntlemek, 247 ziyareti snfn saymak, 247 ziyareti snfnn ktsn almak, 247 z-sras, 423

John Sharp
John Sharp, ngilteredeki bir teknik eitim irketi CM Group Ltd.in paras olan Content Masterda (www.contentmaster.com) Teknoloji Uzmandr. Burada aratrmalar yapmakta, teknik eitim kurslar, seminerler, atlye almalar, klavuzlar, kitaplar ve teknik yazlar iin ierik gelitirmektedir. John, Microsoft .NET Framework uygulama gelitirme ve uygulamalarn birlikte alabilirlii konusunu derinlemesine incelemitir. C# ve J# dillerinde yazlm gelitirmenin yansra, datlm sistemler ve Web servisleri, Microsoft Windows/.NET Framework ve UNIX/ Linux/Java arasnda uygulama tamas ve uygulamalarn birlikte alabilirlii konusunda teknik yazlar ve kurs belgeleri yazm, klavuzlar oluturmu ve konferans sunumlar hazrlamtr. John ayn zamanda, Microsoft Press tarafndan yaynlanm olan Microsoft Windows Communication Foundation Step by Step ve Microsoft Visual J# Core Reference kitaplarnn da yazardr.

You might also like