Page 1

0


İçindekiler ➢

Önsöz ............................................................................................................................................... 7

Yazar Hakkında ................................................................................................................................ 8

1 Yazılımda Kendimi Nasıl Geliştirebilirim? ..................................................................................... 9 ✓

Yazılıma Nasıl Başladım? ............................................................................................................. 9

Yazılım İçin Algoritma Nedir? Neden Bu Kadar Önemli? ............................................................. 9

Amerika’yı Yeniden Keşfetmeyi Çalışmayı Bırakın..................................................................... 10

Kod ve Algoritma Ezberlemeyin ................................................................................................ 11

Tutku Ve Adanmışlık .................................................................................................................. 12

Kitap Takip Ederek Yazılımda Gelişebilir Miyim? ....................................................................... 14

Sabırlı Olmak İşin Püf Noktası .................................................................................................... 15

İngilizce Neden Önemli? ............................................................................................................ 16

Google ve Yazılımdaki Önemi .................................................................................................... 16

Blog Sayfanızı Açın ve Gelişim Sürecinizi Paylaşın ..................................................................... 17

2 Kurulum Ve Visual Studio Ortamını Tanıma ............................................................................... 18 ✓

Visual Studio Kurulumu ............................................................................................................. 18

3 C# Projesi Oluşturma .................................................................................................................. 21

4 Daha Önce Çalıştığımız C# Projesini Açma ................................................................................. 24 ✓

1. Yöntem .................................................................................................................................. 24

2. Yöntem .................................................................................................................................. 27

3. Yöntem .................................................................................................................................. 27

5 Visual Studio’da Kodları Numaralandırma ................................................................................. 29

6 Word Wrap Özelliğini Aktifleştirme ............................................................................................ 32

7 C# Genel Yapısı ........................................................................................................................... 35

8 Veri Tipleri Genel Bilgi ................................................................................................................ 42

9 Değişkenler Ve Değişken Tanımlama ......................................................................................... 45 ✓

Değişken Tanımlama Kuralları ................................................................................................... 45

Değişken Tanımlama Yöntemi ................................................................................................... 45

Değişkenlerin Geçerlilik Alanları ................................................................................................ 46

Özet Geçersek............................................................................................................................ 47

10 Char Tipi .................................................................................................................................... 48 ✓

ToString() Metodu Kullanarak Casting İşlemi ............................................................................ 50 11 String Tipi .................................................................................................................................. 52

String Değişken Tanımlaması..................................................................................................... 52 1


✓ ➢

Parse() Dönüşüm Metodu ......................................................................................................... 53 12 String Türünün Özel Durumları................................................................................................. 55

String Değişkenleri Birleştirme .................................................................................................. 55

+= Operatörünün Kullanımı ....................................................................................................... 57

\ (Ters Slash) Kaçış Karakterinin Kullanımı ................................................................................ 59

\n Kullanımı ............................................................................................................................... 59

@ Karakteri Kullanımı ................................................................................................................ 60

13 Sayısal Veri Tipleri............................................................................................................................. 62 ✓

Sbyte Veri Tipi............................................................................................................................ 62

Byte Veri Tipi ............................................................................................................................. 62

Short Veri Tipi ............................................................................................................................ 66

ushort Veri Tipi .......................................................................................................................... 67

int Veri Tipi ................................................................................................................................ 68

Float Tipi .................................................................................................................................... 70

Double Tipi................................................................................................................................. 71

Decimal Tipi ............................................................................................................................... 73

Bool Veri Tipi ............................................................................................................................. 75

14 Const & Readonly Kavramları ........................................................................................................... 78 ✓

Const Kavramı............................................................................................................................ 78

Readonly Kavramı ...................................................................................................................... 80

15 Var Tipi.............................................................................................................................................. 82 ✓

Var Tipli Değişken Tanımlama ................................................................................................... 82

Var Tipinin Çalışma Mantığı ....................................................................................................... 83

Var Tipli Değişkenin Tuttuğu Veri Tipini Öğrenme .................................................................... 83

String Türü İle Değerlendirme ................................................................................................... 85

İnt Türü İle Değerlendirme ........................................................................................................ 87

16 Object Veri Tipi ................................................................................................................................. 89 ✓

Object Tipi Nedir? ...................................................................................................................... 89

Object Tanımlama ..................................................................................................................... 89

Object Vs Var ............................................................................................................................. 89

Boxing & Unboxing .................................................................................................................... 91

GetType() Kullanımı ................................................................................................................... 93

17 Var Vs Object Performans Değerlendirmesi..................................................................................... 94 18 Dynamic Veri Tipi .............................................................................................................................. 96 ✓

var ve dynamic Tip Farkı ............................................................................................................ 96

Dynamic Tanımlama .................................................................................................................. 96 2


Dynamic Değeri Derleme Anında Türünü Değiştirme ............................................................... 96

Dynamic Tipinin Kullanımları ..................................................................................................... 97

19 Tür Dönüşümleri ............................................................................................................................. 100 ✓

ToString() Metodu ................................................................................................................... 100

Parse() Metodu ........................................................................................................................ 100

Boxing Yöntemi........................................................................................................................ 101

Convert Sınıfı İle Dönüşümü .................................................................................................... 102

Checked & Unchecked............................................................................................................. 102

Bilinçsiz Tür Dönüşümleri ........................................................................................................ 104

Bilinçsiz Yapılabilecek Dönüşümler ......................................................................................... 105

20 Değer Ve Referans Tipi ................................................................................................................... 106 ✓

Stack Ve Heap .......................................................................................................................... 106

Değer Tipli Değişkenler ........................................................................................................... 107

Referans Tipli Değişkenler ....................................................................................................... 107

21 Stack ve Heap Alanları .................................................................................................................... 109 ✓

Stack Özellikleri ....................................................................................................................... 110

Heap Özellikleri........................................................................................................................ 110

22 Operatörler ..................................................................................................................................... 111 ✓

İlişkisel Operatörler ................................................................................................................. 111

Mantıksal Operatörler ............................................................................................................. 114

23 Karar Yapıları .................................................................................................................................. 120 24 For Döngüsü ................................................................................................................................... 125 ✓

Genel Kullanım ........................................................................................................................ 125 •

C# da Değişken_İsmi++ gibi bir ifade ifadenin bir artırılmasını sağlar. ............................. 127 For Döngüsü Kullanımları ........................................................................................................ 128

o

Değişkenin Değerini Döngü İçinde Değiştirme .................................................................. 128

o

Değişkenin Başlangıç Değerinin Dışarda Tanımlanması .................................................... 128

o

Sonsuz Döngü Oluşturma ................................................................................................... 129

o

Birden Fazla Değişken Birden Fazla Şart ............................................................................ 129 Proje Tanımı............................................................................................................................. 129

Böyle bir kodlamanın kusurlarını sıralayacak olursak; ................................................................ 130 ✓

Kod Açıklaması (Algoritma) ..................................................................................................... 131

Kod Açıklaması (Algoritma) ..................................................................................................... 134

25 While Döngüsü ............................................................................................................................... 136 o

Genel Kullanım ........................................................................................................................ 136

o

Döngü Sonlandırma ................................................................................................................. 136 3


Kod Açıklaması( Algoritma) ..................................................................................................... 137

Sonsuz Döngü Oluşturmak ...................................................................................................... 137

Proje Tanımı............................................................................................................................. 139

Proje Tasarım ........................................................................................................................... 139

Kod Açıklaması( Algoritma) ..................................................................................................... 141

Düşünme Aşaması ................................................................................................................... 141

Kod Açıklaması( Algoritma) ..................................................................................................... 142

26 Do While Döngüsü .......................................................................................................................... 145 o

Genel Yapı................................................................................................................................ 145

o

Sistem Nasıl Çalışır ................................................................................................................... 145

Proje Tanımı............................................................................................................................. 145

25 Struct (Yapılar) ................................................................................................................................ 147 ✓

Struct Nedir?............................................................................................................................ 147

o

Genel Yapı................................................................................................................................ 147

o

Yapı Örneği .............................................................................................................................. 147

Kod Açıklaması( Algoritma) ..................................................................................................... 149

Yapıların Özellikleri .................................................................................................................. 149

27 Enum Yapısı .................................................................................................................................... 151 o

Enum Nedir? ............................................................................................................................ 151

o

Neden Enum Kullanırız? .......................................................................................................... 151

o

Genel Yapı................................................................................................................................ 151

Proje Tanımı............................................................................................................................. 151

Enum’u String Diziye Dönüştürme (GetNames() Metodu) ...................................................... 152

ToString() Kullanımı ................................................................................................................. 152

Kod Açıklaması( Algoritma) ..................................................................................................... 154

28 Switch Case Yapısı........................................................................................................................... 156 o

Neden Switch Case? ................................................................................................................ 156

o

Genel Yapı................................................................................................................................ 156

Yapının Açıklaması ................................................................................................................... 157

29 Özel Atama İşlemleri....................................................................................................................... 159 ✓

x++ ........................................................................................................................................... 159 Böyle bir değişkeni işleme soksaydık ne olurdu? ...................................................................... 159

++x ........................................................................................................................................... 159 Peki, bir önceki kullanımdan farkı nedir? .................................................................................. 159

x - - ........................................................................................................................................... 160

--x ............................................................................................................................................. 160 4


x+=y ......................................................................................................................................... 160

x-=y .......................................................................................................................................... 161

x*=y ......................................................................................................................................... 161

x/=y .......................................................................................................................................... 161

x%=y......................................................................................................................................... 161

30 Break & Continue ........................................................................................................................... 162 ✓

Break Deyimi ........................................................................................................................... 162

Proje Tanımı............................................................................................................................. 162

Proje Tasarımı .......................................................................................................................... 162

Kod Açıklaması( Algoritma) ..................................................................................................... 164

Continue Deyimi ...................................................................................................................... 164

Proje Tanımı............................................................................................................................. 165

Proje Tasarımı .......................................................................................................................... 165

Kod Açıklaması( Algoritma) ..................................................................................................... 166

o

Neden Diziler? ......................................................................................................................... 167

o

Dizi Tanımlama ........................................................................................................................ 167

Diziye Değer Atama ................................................................................................................. 169

o

Dizi Değerlerine Ulaşma .......................................................................................................... 171

32 Dizilerde Array Metotları 1 (Resize Metodu) ................................................................................. 173 o

Genel Kullanım ........................................................................................................................ 173

Proje Tanımı............................................................................................................................. 173

Proje Tasarımı .......................................................................................................................... 173

Kod Açıklaması( Algoritma) ..................................................................................................... 175

33 Dizilerde Array Metotları 2 ............................................................................................................. 177 ✓

Sort Metodu ............................................................................................................................ 177

Reverse Metodu ...................................................................................................................... 178

CreateInstance Metodu........................................................................................................... 180

Instance Nedir?........................................................................................................................ 180

IsArray Metodu........................................................................................................................ 181

SetValue Metodu ..................................................................................................................... 181

GetValue Metodu .................................................................................................................... 182

Join Metodu............................................................................................................................. 183

Copy Metodu ........................................................................................................................... 185

Length Özelliği ......................................................................................................................... 188

Clear Metodu........................................................................................................................... 188

Indexof Metodu ....................................................................................................................... 189 5


o

2 Boyutlu Dizi Tanımlama ........................................................................................................ 190

o

Değer Ataması ......................................................................................................................... 191

o

Diziden Değer Okuma .............................................................................................................. 192

o

Dizi Elemanlarına Döngü İle Ulaşma ........................................................................................ 192

Proje Tanımı............................................................................................................................. 192

Proje Tasarımı .......................................................................................................................... 192

Kod Açıklaması( Algoritma) ..................................................................................................... 194

Length Metodu ........................................................................................................................ 195

35 N Boyutlu Diziler ............................................................................................................................. 196 o

3 Boyutlu Dizi Tanımlama ........................................................................................................ 196

o

Diziye Değer Atama ................................................................................................................. 196

o

Çalışma Anında Atama............................................................................................................. 196

o

Dizi Elemanlarına Ulaşma ........................................................................................................ 197

36 Jagged Diziler .................................................................................................................................. 199 o

Jagged Dizi Nedir? ................................................................................................................... 199

o

Neden Jagged Dizileri Kullanmalıyız? ...................................................................................... 199

o

Jagged Mantığı......................................................................................................................... 199

Proje Tanımı............................................................................................................................. 200

Proje Tasarımı .......................................................................................................................... 200

Kod Açıklaması( Algoritma) ..................................................................................................... 203

o

Çok Boyutlu Jagged Dizi Tanımlama ........................................................................................ 204

o

Değer Ataması ......................................................................................................................... 205

37 Foreach Döngüsü ............................................................................................................................ 206

o

Çalışma Mantığı ....................................................................................................................... 206

Kod Açıklaması( Algoritma) ..................................................................................................... 206

o

Doğrusu ................................................................................................................................... 207 38 1. Cilt Sonu .............................................................................................................................. 208

6


➢ Önsöz Üniversite 2. Sınıfta iken ilk defa bloğumu açtığımda, gelecekteki hedeflerimi yazdığım defterime bir hedef daha eklemiştim. Bir gün kendi kitabımı yazarak da insanlara bir fayda sağlayacağım. Geleceğime, benden sonraya da bir şeyler bırakacağım. İşte 6 yıl sonra gerçekleşen hayalimin tam ortasındasınız. Yazılım benim tutkunu olduğum alan. Üniversitede hazırlık yıllarında hayatıma giren yazılım, artık işim. Bu kitap 7 yıllık bir serüvenin, yaşanmışlıkların eseri oldu. Bu ilk cilt’i. Bundan sonra 3 cilt daha yayınlanacak.

Bu kitap www.industryolog.com sayfasında yazılmış olan Sıfırdan C# Eğitimlerinin kitap olarak düzenlenmiş halidir. Sıfırdan başlama nedenim, yolun sonuna geldiğimizde, geride her kesim için bir kaynak bırakabilme isteğimdir. O yüzden en baştan başlayacağız ve C# ileri seviye diyebileceğimiz OOP yapısı, katmanlı mimari, Linq To SQL kullanımı, Entity Framework, Design Pattern gibi pek çok konuyu ele alacağız. Sıfırdan C# Eğitimleri kitabında temel programlama bilgilerine şimdiye kadar görmediğiniz bir yaklaşım getirmeye çalıştım. Detaylı konu anlatımları, karşılaşabileceğiniz olası sorunların net çözümü, proje bazlı çalışmalarda hem kodların anlatımını, hem de algoritmalarını, bazı yerlerde düşünme şekillerini bulabileceğiniz bir kitap. Kodlamanın mantığını öğrenip kendi projelerinizi çok rahatlıkla geliştirebileceksiniz.

Kitaptan bir fayda görmediğiniz takdirde herhangi bir iletişim adresimden ulaşıp paranızı iade isteyebilirsiniz.

Anne, baba ve kardeşime ithafen…

7


➢ Yazar Hakkında

21.02.1992 Tarihinde Aydında doğmuştur. İlköğrenim ve Lise hayatını Aydında tamamlamış ve 2011 yılında Isparta Süleyman Demirel Üniversitesi Endüstri Mühendisliği bölümünü kazanmıştır. 2016 yılında Endüstri Mühendisliği bölümünden bölüm 2. Si olarak mezun olmuştur. Üniversite hayatı boyunca pek çok proje takımlarında yazılım geliştirici olarak görev almıştır. Hayatında attığı en önemli adım olarak gördüğü blog sayfasını 12 Temmuz 2012 tarihinde açmıştır. 6 yıldır aktif olarak Bloggerlık hayatını sürdürmektedir. Endüstri Mühendisliği ve Yazılım alanlarında kendi sitelerinde yayınladığı 1200 den fazla makale bulunmaktadır. 9 Mayıs 2016 yılında, Endüstri Mühendislerinin en çok bildiği ve takip ettiği platformu Industryolog Akademiyi kurmuştur. Industryolog Akademi 1 yıl gibi kısa bir sürede başarılı ekibiyle büyük bir ivme ile büyümüş, sektördeki Endüstri Mühendislerinin dikkatini çekmeyi başarmış ve Yapısında üst seviye Genel Müdür yazarlarını barındırmakta ve Endüstri Mühendislerine sektör hakkında bilgilendirme görevini yerinde getirmektedir. Öğrencilik yıllarında pek çok firmaya özel yazılımlar geliştiren Murat Bilginer şu anda(2017 itibariyle) özel bir yazılım firmasında Canias ERP Danışmanı ve Yazılım Uzmanı olarak çalışmaktadır. Hayat Devam Ediyor… Kitap ile ilgili tüm soru ve görüşlerinizi bana tüm iletişim adreslerimden iletebilirsiniz.

İLETİŞİM BİLGİLERİ

Kişisel E-Mail:

muratbilginer09@gmail.com

Kurumsal E-Mail: mbilginer@industryolog.com Facebook:

https://www.facebook.com/mrt.bilginer

Twitter:

https://twitter.com/mrtblgnr

Linkedin:

https://www.linkedin.com/in/muratbilginer/

8


➢ 1 Yazılımda Kendimi Nasıl Geliştirebilirim? C# Eğitimlerine başlamadan önce işin felsefesine bir bakmak lazım. Yani yazılım nedir? Kendimi yazılımda nasıl geliştirebilirim? Gibi sorularımıza cevaplar aramaya çalışalım. Bunları baştan konuşursak belki kitaptan alacağınız fayda daha da artacaktır. Kitap boyunca bilginin de, hikâyenin de olduğu yerde kendi hayatımdan, yaşadıklarımdan örnekler göreceksiniz.

✓ Yazılıma Nasıl Başladım? Yazılıma 7 yıl önce ilk olarak, oynadığımız oyunları nasıl yapıyorlar sorusunu araştırarak başlamıştım. Araştırmalarım sonucunda Programlama dilleri yardımı ile yapıldığını öğrenmiştim. Araştırmalarıma devam ettim ve ilk C dili ile tanıştım. C dili ile çok bilinçsiz bir başlangıç yapmıştım yazılıma. Yapmış olduğum bu bilinçsiz dalışın ceremesini daha 2. dersinde dili çalışmayı bırakarak çekmiştim. Çünkü şöyle bir ifade kullanmıştı anlatan kişi x=x+1. Mantıksal olarak düşündüğümde 2=3 gibi bir ifadeydi bu ve çok mantıksız gelmiş ve çok iyi hatırlıyorum nasıl olur ya bu diye diye C dilini çalışmayı bırakmıştım. Çünkü dilden önce yazılımın var olan kendi edebiyatından, kendi literatüründen haberdar olmalıydım. Evet, yazılımın kendine ait bir lisanı kendi arasında tüm dünyayla ortaklaşa konuşabildiği bir dili vardı. Yazılıma karşı olan heyecanım ve merakım hiç gitmedi. Sonra araştırmalarıma devam edince Algoritma kavramı ile karşılaştım. Algoritma kavramlarını öğrenmeye başlayınca anladım ki x=x+1 bir eşitlik değil bir atama işlemi idi yazılımda eşitlik == (yan yana iki eşit) ifadesiyle ifade ediliyordu.

✓ Yazılım İçin Algoritma Nedir? Neden Bu Kadar Önemli? Yazılıma başlayacaksanız eğer, bilen birine sorduğunuzda size söyleyeceği şey bu olacaktır öncelikle Algoritmayı halletmelisin. İnsan böylesi bir yönlendirmeyi dinleyip, hadi o zaman Algoritma öğreneyim deyip işe giriştiğinde, şöyle bir şeyle karşılaşır. Özel algoritmaları bir kenara bırakırsak başlangıç seviyesinde algoritmik kavramlar, sadece 3 4 makalede yazılıp bitirilecek, okunup anlanabilecek şeylerdir. Yazılıma başlayan arkadaşlarımız genelde bu 3 4 temel seviye algoritma dersini okuyup anlayınca artık yazılımda çığır açabilirim durumuna gelirler, ama öğrenmek istedikleri dile giriş yaptıklarında olayın pekte böyle olmadığını fark ederler. Otomatikman moraller bozulur ve yazılım belki de hep bu seviyede bırakılır. Genelde arkadaşlarımda gördüğüm şey bu oldu. Şimdi burada bahsedilen asıl olaya değineyim. Bu anlam karmaşasına da son vermiş olalım. Aslında Algoritma demek bir olayı parçalara bölebilme, sıralı bir şekilde gerçekleyebilecek şekilde adım adım yazabilme ya da düşünebilme becerisi demektir. Yani yazılımcıların aslında algoritma çok önemli, yazılıma başlamak istiyorsanız öncelikle bunu geliştirmelisinizde ki bahsettiği algoritma bunu ifade eder. Düşünme yeteneğinizi geliştirmelisiniz demek istemektedirler genelde. O yüzden Algoritmayı geliştirmek için, yani düşünme şeklinizi geliştirmek, problemlere bakış açınızı değiştirmek için yapmanız gereken bir kaç yol var. Sayacaklarım çoğaltılabilir ama ben temel olarak gördüklerimden bahsetmek istiyorum. Ama en önemlisi çok fazla antrenman yapma, çok fazla problem çözmedir. Düşünme şeklinizi geliştirdikçe, sorunlara bakış açınız değişecek farklı yollar farklı çözümler bulabildiğinizi göreceksiniz. O zaman ilk olarak şunu diyelim.

9


Algoritmayı Geliştirmek İçin Çok Fazla Problem Çözmeliyiz. Yazılıma ilk başladığımda elime gelen her problemi çözmeye çalışırdım. İlk zamanlarda boş anlarımı değerlendirmek için bir algoritma defterim vardı ve içinde önceden not aldığım sorularım vardı onları çözmek için uğraşırdım.

✓ Amerika’yı Yeniden Keşfetmeyi Çalışmayı Bırakın

10


Burada düşünme şeklimizi geliştirmenin bir diğer yolu da başkalarının çözümlerine göz atmaktan geçer. Bazen dünyayı tek bizden ibaret sanırız ve her şeyi kendimiz yapalım, biz düşünelim diye çabalar dururuz. Çoğu zaman yaptığımız iş Amerika’yı yeniden keşfetmeye çalışmaktan öteye geçmemektedir. Oysaki var olan çözümlere bakma, onları inceleme bize yeni bakış açıları kazandırabilmektedir. Amerika’yı yeniden keşfetmek yerine keşfedilmiş kıta üzerinde yenilikler yapmak çok daha yararlı olan bir adımdır. Hem para edende bu olacaktır. En kötü ihtimal bu şekilde de çözülebiliyormuş diyebilmemizi sağlayacaktır. Var olanın üzerine geliştirmeye çalışmak her zaman daha mantıklıdır. Yalnız burada bahsettiğim biz hiç düşünmeyelim zaten mutlaka yapılmışı vardır onu alıyım kullanayım seviyesine gelmemelidir. Burada gelişiminizin farkında olmakta sizlere kalmaktadır.

✓ Kod ve Algoritma Ezberlemeyin

Özellikle öğrenci arkadaşlarımda gördüğüm bir yanlışın üzerinden konuya devam edeyim. Derslerde hocaların anlattıklarını güzel bir şekilde ezberleyen arkadaşlarım yapılan yazılımların, geliştirilen algoritmaların ya da verilen soruların üzerine hiç kafa yorma, farklı şekilde çözülebilir mi acaba diye düşünme gereksinimi duymuyorlar. Sınav günü geldiğinde hoca birazcık düşünmelerini gerektirecek bir soru sorduğunda bütün her şeyi ezberleyen öğrenci arkadaşlarım kalem oynatamaz duruma geliyorlar. Çünkü o ana kadar o düşünme işini, antrenmanını hiç yapmamış orada da ilahi bir dokunuş olmazsa yine yapamayacaktır. İlk yazılım sınavlarından sonra sınıf genelde dökülür. Lütfen kodları ve algoritmaları ezberlemeyin. Yapamayabilirsiniz, çok kısa sürede çözüme kavuşturamayabilirsiniz ama üzerine düşünün. Zaten bazı algoritmalar ve kodlar sürekli yaptıkça akılda kalmaktadır. Üniversite 1 de hocamızın bütün kodları ezbere bildiğini sanırdım. Bir gün bu soruyu kendisine sorduğumda bana şöyle demişti Google var niçin ezberleyeyim. Hocam böyle deyince rahatlamıştım evet ezberlemeye gerek yok Google var.

11


Buradan yola çıkarak kendimi bir sorunun çözümü ile ilgili ezbere mi gidiyorum, yoksa gerçekten o konu hakkında düşünmeyi öğrenmişmiyimi şöyle sınardım. Çözümü yapılmış soruyu 3 4 gün sonra tekrar çözerdim, eğer birebir aynı şeyleri yapmamış isem anlardım ki, evet bu işi öğrenmişim, ezbere gitmiyorum. Sizlerde böyle sınayabilirsiniz gelişiminizi. Algoritma konusunda yapabilecekleriniz bu kadarla sınırlı değil tabi ki ama en önemli kısımlarından bahsetmeye çalıştım.

✓ Tutku Ve Adanmışlık

Şimdi yazılımda gelişmek isteyen arkadaşlara biraz farklı bir şey söyleyeceğim. Yazılımda gelişmek biraz tutku ve adanmışlık ister. Öğrenmesi maddi açıdan en ucuz ve en kolay olan bu iş manevi anlamda bir takım zorlukları barındırır. Aslında her iş bu tür şeyleri barındırır, ama yazılımda bunlar bana göre bir tık daha fazladır. Neden öğrenmesi maddi anlamda en ucuz. Çünkü bir bilgisayara (artık olmayanımız yok) ihtiyacımız var.

12


Yazılım dillerini geliştirenler, çalışma Studio’larının ücretsiz sürümlerini veriyorlar zaten. İnternetimiz de varsa sınırsız bir kütüphaneye de sahibiz demektir. İşte aslında geriye bizim büyük bir tutku ve adanmışlıkla bu işin üzerine düşmemiz kalıyor.

✓ Küçük Bir Yaşanmışlık Üniversite tercihlerimi yapacağım zaman Koç Üniversitesinde Matematik bölümü okumuş bir abime tercihlerimle alakalı fikir danıştığımda bana şöyle demişti. Ben “abi matematiği seviyorum iyide yapıyorum yazayım mı ne dersiniz” demiştim. Bana şunu sordu, “Tercih listende matematikten sonra yazmayı düşündüğün başka bölümler de var mı?” dedi. Var dedim. “O zaman yazma” dedi. “Çünkü Matematik okuyacaksan o senin kesinlikle tek seçeneğin olmalı” demişti. Onun üzerine Endüstri Mühendisliğini yazmıştım. Yazılımda tamda bu olayda anlattığım gibi, eğer bu alanda kendinizi geliştirmek istiyorsanız başka seçeneğiniz yokmuş gibi adanmışlık isteyen bir iştir. Adanmışlık seviyeniz bu düzeyde olursa tutkunuz her geçen gün artıyor ve ortaya güzel işler çıkıyor. İşinize yarayan işler çıkardığınızda da bağlılığınız artıyor. Gelişim süreci bir birini tetikleyen bir süreç olarak devam ediyor. İkinci bir seçenek olmaktan çıkarın yazılımı.

✓ Tek Amacım Kısa Sürede Para Kazanmak

Eğer kısa sürede büyük paralar kazanma gibi hayallerle yazılıma başlıyorsanız büyük ihtimal bir ay sonra ne yazılım adına bir şey konuşuyor olursunuz ne de para namına bir şey görürsünüz. Yazılım iyi para kazandırıyor ama işe sadece bu gözle yaklaşmayanlara çok para kazandırıyor bunu çok net söyleyebilirim. Amaçlarınızdan biri çok para kazanmak olabilir ama tek amacınız bu olmasın yazılımda gelişmek istiyorsanız. Programlama Diline başladığımızı varsayarak dil üzerinde nasıl gelişim gösterebiliriz bunları inceleyelim.

13


✓ Kitap Takip Ederek Yazılımda Gelişebilir Miyim? Yazılım öğrenmeye başlayacağım bana hangi kitabı önerirsiniz? Ya da yazılıma kitaptan oturup çalışsam ne kadar yol kat edebilirim? Evet, yazılım öğrenirken en önemli sorunlardan biride genelde bu oluyor. Bir kitap alsam, baştan sona 4 5 ayda kitabı bitirsem yazılımda gelişebilir miyim? Elbette gelişirsiniz ama bir kitabı baştan sona bitirme azmi ve gayretini gösterebilir misiniz orası muamma. İşte ben bu noktada yazılıma yenice başlayan arkadaşlarıma genelde şunu tavsiye ediyorum. Kitaplar yazılım dilinin kökenine inerek detaylı bir anlatım yapma gayreti içinde olduğu için, genelde oturup 100 sayfa bir kitap okuduğunuz da hala daha değişkenler konusuna bile gelememiş olabiliyorsunuz. Daha değişkenler konusuna bile gelememiş bir yazılımcı elle tutulur “Hello World” dışında bir program bile yazamadığından otomatikman 100 sayfa okudum hiç bir şey yapamıyorum daha oluyor ve motivasyon 0’a iniyor. Kitap bir köşeye, yazılım kafada diğer köşeye atılıyor ve serüvene belli bir süreliğine ya da tamamen nokta konabiliyor. Ben böyle bir sonla karşılaşmamak için genelde şunu tavsiye ediyorum. Yazılımda belli başlı en temelde öğrenilmesi gereken konular vardır. Nedir onlar Değişken türleri ve özellikle değişkenler içinde string yapısı (C# adına konuşuyorum şu noktadan sonra artık) karar yapıları if else vs. döngüler ve diziler bu 4 ana konu hemen halledildiğinde bunu gerek kitaptan çalışarak, gerekse güzel bir blog takip ederek ya da videolar izleyerek öğrendiğinizde yapabileceğiniz şeyler artıyor ve buda size özgüven sağlıyor ve aynı veya artan motivasyonla yazılıma devam etmenize yardımcı olabiliyor. Özetlersek; sayfa sayfa kitap takip etmektense öncelikle temel kavramları öğrenerek işe başlayın.

Bir başucu kitabını elinizin altında bulundurun, takıldığınız konulara kitaptan göz atın veya öğrenin.

14


Eğer gerçekten gelişmek istiyorsanız asıl yapmanız gereken şeyde proje yapmaktır. İnternette bulabileceğiniz pek çok soruyu kendiniz kodlayabilirsiniz. İlkyazımda da söylediğim gibi bunları yaptıktan sonra çözümlerini yapan ve paylaşan diğer yazılımcıların projelerine ve kodlarına göz atabilirsiniz. Ama Kodlayın Kodlayın Kodlayın. Gelişmek istiyorsanız açıkçası başka bir yolunuz yok. Proje yaparken de genelde şöyle yapardım, yapılan projelere bakardım, soruları alırdım. Üzerine yeni bir şeyler eklemeye çalışırdım. İşte o zaman araştırmanız gereken yeni şeyler ortaya çıkıyor ve gelişiminizin sihirli bir anahtarı daha oluşmuş oluyor. Yoksa sürekli var olan, bildiğiniz şeyleri yapmanız veya kodlamanız sadece o konudaki hızınızı artıracaktır. Ama yazılım dünyasının bir derya olduğunu ve öğrenilmesi gereken çok fazla konu olduğunu hiç aklımızdan çıkarmamız gerektiğini bilmemiz gerekmekte.

✓ Sabırlı Olmak İşin Püf Noktası

15


Sabır bir yazılımcının olmazsa olmaz özelliklerinden biridir ya da olmalıdır. Eğer yanlışlarla uğraşma, yeni şeyler keşfetme, hatalarla uzun süre boğuşma azminiz ve sabrınız yoksa, ne yazık ki yazılım yine bir süre sonra bırakılan bir branş oluyor genelde. Yazılıma başladığım ilk zamanlarda, şimdiki gibi blog yazan çok fazla kişi yoktu, yardımlaşabileceğiniz insanları bulmanız bu kadar kolay değildi. Sorularınızı hemen sorabileceğiniz ve anında cevap alabileceğiniz Facebook grupları, WhatsApp grupları yoktu. Varsa yoksa her şeyimizin forumlar olduğu bir zamanda yaptığınız hataları bulmanız ve onları çözmeniz çok daha uzun zamanlar alıyordu. Bir hata ile tam belki saat olarak 48 saat olmasada gün olarak baktığımızda 2 gün boyunca yazılımın başına geçtiğim her an onu çözmekle uğraşmıştım. Çözecektim başka yolu yoktu. Aramadığım taramadığım hiç bir yer kalmamıştı bir türlü bulamıyordum. 2. günün sonuna doğru yabancı bir sitede sorunumun cevabını bulmuş ve çözmüştüm. O an yaşadığım mutluluk kelimelerle tarif edilemezdi. İşte bunun gibi bazen 2 gün sabretme olgunluğunu gösterebilmenizi bile gerektirebilir. Kafayı yeme seviyesine gelmenize bile sebep olabilir. Dışarıdan bakıldığında pek çekilecek bir durum değil gibi gözükse de, hep şunu derim yazılım geliştirmeyen ve o hazzı yaşamayan kişiler bunun ne demek olduğunu bilemezler. Çünkü sizden olan, sizin yaptığınız bir şeyi çalışırken görmek ve işe yaradığını bilmek yaşanabilecek en güzel duygu ve de haz diye düşünüyorum. Büyük ihtimal yazımı okuyan yazılımcı arkadaşlar veya büyüklerim varsa burada ne demek istediğimi anlamışlardır. Sabır bir diğer sihirli anahtar.

✓ İngilizce Neden Önemli?

Diğer bir konu İngilizce. C# konusunda artık Türkçe kaynaklar her geçen gün artsada, yine de yeni teknolojileri takip edebilme Türkçeye çevrilmesini beklemeden hemen öğrenme, sorunlarınıza çok daha çabuk çözümler bulmak istiyorsanız İngilizcenizi en azından okuma ve anlama seviyesinde iyi bir noktaya getirmeniz gelişiminiz açısından çok fazla önem arz etmektedir. Bazı yazılımların teknolojilerin Türkçe kaynakları henüz neredeyse yok denecek kadar az. İngilizcemizi geliştirirsek yazılımda belli bir seviyeye geldikten sonra gelişimimizin aritmetik değil geometrik olduğunu çok rahat görebiliriz.

✓ Google ve Yazılımdaki Önemi 16


Diğer bir mevzu ise Google ı kullanabilme. Her şey orada var, yeterki neyi nasıl arayacağımızı bilelim. Yazılımcının gözü kulağı eli kolu Google’dır. Çünkü her şeyi ezbere bilmemizin imkânı yok ve bir yazılımı geliştirirken pek çok şeyi arama, pek çok hatayı çözmek için başvurduğumuz kaynak Google’dır. Bu devasa kütüphaneyi çok iyi kullanabilmek, ondan optimum seviyede yararlanabilmek gelişimimiz adına çok fazla şey ifade edebilir. Zamanımız çok kıymetli olduğu içinde Google’ı iyi bir şekilde kullanmak her zaman büyük bir avantajdır.

✓ Blog Sayfanızı Açın ve Gelişim Sürecinizi Paylaşın

Son olarak bir şey söyleyeyim Blog yazın. İnsanlara karşı ya da kendinize karşı bir sorumluluk hissi oluşturacak bir blog yazmak yazılımdan vazgeçmenizin önünde durabilecek en güzel araçtır. Bildiğinizi paylaşmak, başkalarına yardımcı olabildiğinizi bilmek daha fazla gayretle çalışmanıza vesile olabilir. Bugüne kadar yaptığım en güzel işin kendi blog sayfamı açmak olduğunu rahatlıkla söyleyebilirim. 4 yıl önce muratbilginerncfkr.blogspot hesabı olarak açtığım blog sayfam 3 yıl sonra muratbilginer.net oldu bugün ise bu akademimizin sayfasından sizlere seslenmeme vesile oluyor. Gelişiminizi en güzel takip edebileceğiniz yollardan biri onu yazmaktır.

17


➢ 2 Kurulum Ve Visual Studio Ortamını Tanıma ✓ Visual Studio Kurulumu Projelerimizi Visual Studio 2017 de geliştireceğimiz için onun indirilmesi ve kurulumuyla işe başlamak istiyorum. Aşağıdaki Linki Kullanarak Visual Studio’nun Comminity yani Microsoft’un Ücretsiz sunduğu sürümü indirebilirsiniz.

Visual Studio 2017 İndir o

İndirdiğimiz dosyayı çalıştıralım. Gelen Ekranda Devam diyelim.

o

Visual Studio’nun diğer sürümlerine göre farklılaşmış bir yükleme ara yüzü görüyoruz bu sürümde. Açılan Ekranda Comminity’e yükle diyoruz ve yüklememiz başlamış oluyor. İnternet hızınız, bilgisayarınızın hızı gibi parametreleri göz önüne alırsanız bu indirme ve kurulum işlemi minimum 30 Dk. sürebiliyor. İnternet hızınız çok düşükse bu kurulumun saatleri alabileceğini de not düşmüş olayım.

18


Bu işlem sonunda kurulumunuz tamamlanmış olacak. Visual Studio 2017 yi açmak için Arama çubuğuna ismini yazmanız yeterli olacaktır.

İşte böylelikle Visual Studio’yu kurmuş olduk. Programı çalıştırdığımızda şöyle bir ekran bizi karşılayacak.

19


20


➢ 3 C# Projesi Oluşturma Visual Studio’yu açalım

Bu ekranda Yeni Proje Oluştur sekmesine tıklıyoruz. Ayrıca yeni bir proje açmak için;

Dosya — Yeni — Proje Yolu izlenerek de açılabilir.

Bir yöntemi daha klavye kısa yoludur.

21


CTRL + SHIFT + N Proje Oluştur Ekranında

Bu aşamadan sonra projemize kendimize göre bir isim veriyoruz, projenin kaydolacağı yeri belirliyoruz ve tamam diyerek projemizi oluşturmuş oluyoruz.

Burada oluşturduğunuz konum siz tekrar müdahale etmedikçe aynı kalacaktır.

22


Default olarak projeleriniz Sistemin kurulu olduğu dizinin C olduğunu varsayarsak.

C:\Users\user\Documents\Visual Studio 2017\Projects Adresinde oluşturulacaktır.

İlk projemizin ekran görüntüsü ile devam edelim.

23


➢ 4 Daha Önce Çalıştığımız C# Projesini Açma Visual Studio: VS Şimdi daha önceden üzerinde çalıştığımız bir projeyi tekrar nasıl açabiliriz buna bakacağız.

✓ 1. Yöntem Az önce oluşturmuş olduğumuz proje klasörünün içine girelim.

Dosyamızı çalıştırdığımızda bizi direk proje çalışma ortamına götürecektir. İlk defa C# kodlayacak, VS üzerinde ilk defa uğraşanlar için sorun olabilecek bir durum üzerinde durmalıyım. Diyelim ki projeyi açtık ve aşağıdaki gibi bomboş bir ekran karşıladı bizi. Çalışma ortamına nasıl ulaşacağım?

24


Burada yapmamız gereken, İngilizce kullananlar için Solution Explorer Türkçe kullananlar için Çözüm Gezgini alanına ulaşıyoruz.

Tekrar varsayalım ki Çözüm Gezgini sekmesini istediğimiz yerde bulamadık. Onu açmak içinde yapmanız gereken;

25


Bu şekilde açtıktan sonra yapmak istediğimiz her ne ise Çözüm Gezgini üzerinde onu açabiliriz. Ben Form1’i tekrar açmak istiyorum. Bunun için yapmam gereken aşağıdaki resimdeki işlemdir.

Form ekranımız tekrar açılmış oldu.

26


✓ 2. Yöntem

Bir diğer Proje açma yöntemimiz ise şu şekilde.

Proje Aç bölümünden sonra, sizi klasörlere erişim alanına getirecektir. Yapmanız gereken açmak istediğiniz proje içinde yine .sln uzantılı dosyaya erişip onu çalıştırmak.

✓ 3. Yöntem Son yöntemimizde şu şekilde.

27


Yukarıda gösterdiğim yöntemle de aynı işlemleri yaparak daha önceki proje dosyalarınızı tekrar açabilirsiniz. Bir projede, kod ekranına geçmek için kullanabileceğiniz en basit yöntem form üzerinde boşluğa çift tıklamaktır. Burada form üzerine koyduğunuz nesneler üzerine çift tıklayarak da kod ekranına geçebilirsiniz. İmleç tıkladığınız Component’in Default metodunun içine odaklanır, kod yazabilmeniz için. Örneğin form üzerine çift tıkladığınızda Form_Load metoduna odaklanacaktır. Bir buton üzerine çift tıklarsanız Button_Click olayına odaklanacaktır. Bunu deneme yanılma yöntemleri ile farklı componentler için test edebilirsiniz.

28


➢ 5 Visual Studio’da Kodları Numaralandırma VS kod ekranı Default olarak kod satırlarını numaralandırmaz. Ama hata takibi, kod satır sayısını görme gibi durumlar için satır sayılarını açmak güzel bir avantaj sağlayacaktır. İlk olarak Default halini görelim.

Şimdi yapmamız gereken işlemlere geçebiliriz.

o 1. Adım

29


o 2. Adım

o 3. Adım

30


Bu şekilde satır numaralandırmasını yapmış olduk.

31


➢ 6 Word Wrap Özelliğini Aktifleştirme Word Wrap’e niçin ihtiyaç duyarız? Çalıştığımız ekranın çözünürlüğüne göre, ya da kod satırlarının yazı boyutuna göre değişse de, bazen yazdığımı uzun kodlar görünen ekrana sığmaz ve Word Wrap özelliği aktif olmamış VS’de sağa doğru akmaya devam eder. Kodları tek seferde görmek istediğimizde bu durum bize sıkıntı çıkaracaktır. Örnek

İşte şimdi yapacağımız işlemle bu uzayıp giden kod satırını ekran sonuna geldiği yerde otomatik olarak aşağıya geçmesini sağlayacağız.

o 1. Adım

32


o 2. Adım

o

3. Adım

33


Bu işlem tamamlandığında artık aktif olmuş olacak ve uzunca yazdığımı o kod bloğunu ekranımızda tamamıyla görebileceğiz.

3. adımda Sözcüğü kaydır sekmesinin altında bir seçenek vardı, onuda aktifleştirerek o satırın aşağıya doğru devam ettiğini bir efektle görebiliriz.

34


➢ 7 C# Genel Yapısı Standart bir kod geliştirme serüvenimizde C#’ın 3 temel katmandan oluştuğunu söyleyebiliriz.

Bir Kütüphane ya da burada belirtildiği ismiyle isim uzayı, bu isim uzayına ait sınıflar ve her bir sınıfa ait metotlardan oluşur. Bunu daha net anlayabilmeniz için şöyle gerçek hayata uyarlayabiliriz. Mesela bir şehir kütüphanesi düşünün başlı başına bir binadır ya da yapıdır. C# da ki kütüphanelerde öyledir. Diğer kütüphanelerden bağımsız başlı başına birer yapıdır. Bu kütüphanenin içine girdiğimizde pek çok bölümünün olduğunu görürüz. Farklı işlevleri yapan aynı türden kitapları barındıran bölümler. Örneğin Bilim, Edebiyat, Fen, Matematik, Yazılım gibi. Gördüğünüz gibi bir kütüphane içinde birden fazla bölüm olabilir. Buradaki bölümler C# da sınıflara denk gelir. Ve bir isim uzayı içerisinde birden fazla sınıf bulunabilir. Bir bölüme odaklandığımızda belki yüzlerce, belki binlerce o bölüme ait kitaplar bulunacaktır. İşte bu her bir kitaba C# da metot diyeceğiz. Bir sınıf içinde birden fazla metot olabilir. Aynı zamanda bir kitabın içinde aynı konunun birden fazla çözümü, birden fazla yöntemi ele alınabilir. İşte bunlara da bir metodun Overload aşırı yüklenmiş hali diyeceğiz. Son bahsettiğim olaya daha sonra daha detaylı gireceğim. Metotlar içinde metotların çağırılabildiğini unutmamalıyız

35


Bir şekille tekrar ele alacak olursak.

Şimdi bu işlemleri birazda kod tarafında bir kaç ipucu ile devam edelim.

Kod kısmında kullanacağımız sınıflar ve metotlar hangi isim uzayına aitse, projenin başında using ifadesi ile programa deklere edilmeli, tanıtılmalıdır. Bir örnek vermek gerekirse.

36


Burada gördüğümüz MessageBox sınıfı System.Windows.Forms kütüphanesi ait bir sınıftır. Bu sınıfın bu şekilde hatasız kullanılabilmesi için de yukarıdaki gibi kütüphanenin deklere edilmesi gerekir. Peki ya deklere etmemiş olsaydık ne olacaktı buna bakalım.

Gördüğünüz gibi VS MessageBox sınıfının ait olduğu kütüphaneyi bulamadı ve ben böyle bir şeyi tanımıyorum, anlamlandıramadım diyor ve hata veriyor. Hata aldığımız satırda, hatalı bölümün altının kırmızı ile çizilmiş olduğunu görürsünüz. Diyelim ki bu hatanın sebebini hemen anlayamadınız. Bunu nasıl öğrenebileceğiz? Bunun için Error List bölümüne bakmamız yeterli gelecektir.

Burada zaten hatamızın ne olduğunu net bir şekilde anlayabiliyoruz. Bazen çok uzun soluklu programlarımızda derleme sonrası bir hata alabiliriz. O hatanın nerede olduğunu hemen göremeyebiliriz. Bunun için hata listesinde hatanın üzerine çift tıklarsak bizi hatanın olduğu satıra götürecektir.

37


Bu hatadan kurtulmak için kütüphaneyi deklere etmemiz yeterli olacaktır. Peki, kullanmaya çalıştığımız sınıfın hangi kütüphaneye ait olduğunu bilmiyorsak bunu nasıl yapacağız? Google tabi ki yardımımıza yetişebilir. Ama bunun için Google aramasına gerek yoktur. Hatalı kod satırının üzerine gidince size öncelikle hatanın ne olduğunu gösterecektir.

Çözümü bulmak içinse Alt + Enter yapabilirsiniz.

İşte bize olası çözümleri gösterdi. Buradan anlıyorum ki MessageBox sınıfı System.Windows.Forms Kütüphanesine ait bir sınıfmış. Çözüm önerisine çift tıkladığımda benim yerime bu kütüphaneyi using ifadesi ile oluşturacaktır.

38


İşte Sonuç.

Burada olayı biraz daha senaryolaştırıp, tam olarak kavramaya çalışalım. C# kod kütüphanesini Türkiye gibi düşünün. Türkiye’de bir sürü kütüphane olabilir. Oluşturduğunuz projeyi bir il gibi düşünün. Siz bu il içinde varlık gösterebilecek kendi kitaplarının kullanımını sağlayacak hangi kütüphanelere izin verirseniz onlar orada işlev görebilirler. Bunu yaptığımız yer, projeye referans eklediğimiz yerdir. Eğer bir kütüphane örneğin yukarıdaki System.Windows.Forms kütüphanesi refere edilmez ise bu ilden sorumlu olan yönetici (VS) o kütüphaneden haberdar olamayacaktır. O kütüphaneye ait hiç bir bölüm hiç bir kitap da bu proje içinde kullanılamayacaktır.

✓ Kütüphanelerimizi Projemize Ekleme

39


Başvurular sekmesi altında listelenen tüm kütüphaneler bu proje içinde kullanılabilecek kütüphanelerdir. Eğer System.Windows.Forms kütüphanesi burada eklenmemiş olsaydı, using ifadesiyle programa onu tanıtma imkanımızda olmayacaktı. Eğer o kütüphane burada ekli olmasaydı yapacağımız işlem.

Bu işlem sonunda kütüphane proje içinde tanımlı hale gelecektir.

40


Hatamıza geri dönersek başka şekilde çözme ihtimalimiz var mı ona bakalım. Kurgumuza devam edelim. Projeniz içinde birden fazla iş yapılacağını ve Visual Studio’nun da bu işlerin başındaki yönetici olduğunu varsayalım. Yöneticimiz doğal olarak deklere edilen tüm kütüphanelerin içeriklerini de biliyor olmalı. Biz yöneticiye using ifadesi ile ben bu iş için System.Windows.Forms kütüphanesini de kullanacağım diye bildirdikten sonra MessageBox diye bir sınıf çağırdığımda yönetici bunun o kütüphaneye ait olduğunu bilir ve geçiş izni verir. Hataya sebep olmaz. Başlangıçta tüm projede kullanılabilecek kütüphaneler arasına diyelim ki System.Windows.Forms kütüphanesine ekledik ama yapılacak bir iş içinde bunu kullanacağımı yöneticiye bildirmedim. O zaman kullanacağım bir sınıfın ona ait olduğunu her defasında yöneticiye bildirmem gerekir.

Gördüğünüz gibi yönetici kütüphaneye bakar bu kütüphane projede kullanılabilecek bir kütüphane mi? evet öyleyse yine geçiş izni verecek ve hata almayacağız. Yukarıya baktığınızda kütüphane tanımlı değildir. Ama yaptığımız işlem sonunda da bir hata almadık. Bu işlem uzun süreçli bir kod yazma işinde çokta mantıklı bir yöntem değildir. Kütüphanemizi o iş birimine tanıtıp işlerimizi daha kolay ve kodları karmaşıklaştırmadan işimize devam edebiliriz. Çünkü bu ileride kod okunurluğunu da etkileyecektir. Kodların okunabilir ve anlaşılabilir olması bir yazılımcının en asli görevlerinden biridir. Takım çalışmalarında bu durum daha büyük önem arz edebilmektedir. C# ve Visual Studio’da bir yaşam döngüsü içinde kafanızda örneklendirerek gidebilirseniz, öğrenme ve kavrama süreciniz çok hızlanacaktır. Çünkü yapay olan her yapı doğadaki canlı ve cansız yapılar model alınarak şekillendirilmektedir.

41


➢ 8 Veri Tipleri Genel Bilgi C#’da ve aslında .Net Framework alt yapısını kullanan tüm dillerde bilmemiz gereken en önemli kurallardan biri;

Her veri tipi bir sınıf, her sınıf bir veri tipidir. Klasik diyebileceğimiz dillerde tamsayılar, rasyonel sayılar, ondalıklı sayılar, karakter ve bool tipleri dil ile bütünleşik olarak gelir ve onlara ait bir belirteçle kullanılırlar. Ama C# da bu durum biraz daha farklıdır. Microsoft kullanılabilecek veri tiplerinin tanımlamalarını .Net Framework üzerinde bir sınıf olarak oluşturmuştur. Bizler oradan bu sınıflar üzerinden istediğimiz tipleri çağırarak kullanabilmekteyiz. Geliştiricilere şöyle bir kolaylık da sağlamışlardır. Her bir veri tipi üretme işlemi için sınıfı çağırmak yerine o sınıfa bir belirteçle erişebilmemizi sağlamışlardır. Yani tam olarak ne demek istiyorum? Örneğin string türünde bir değişken tanımlamak istediğimde ilk söylediğim bilgilere göre bu veri tipini üretebilmem için şunu yapmam gerekecekti

MessageBox sınıfını kullanmamın tanımlamayla bir alakası yoktur. Ayrıca ekstra bir kod olarak yazılmıştır. Burada String gördüğünüz gibi bir sınıftır ve ben o sınıf üzerinden bir tanımlama yaptım. VS üzerinde String İle string aynı anlama gelir. Bundan sonra string bir değişken tanımlayacağımızda bu belirteci kullanacağız.

42


İşte bu şekilde belirteçler oluşturularak kullanım kolaylığı sağlanmıştır tüm veri tiplerinde. Aklınıza belki biri büyük harfle başlıyor diğeri küçük başka türlü bir fark yok ve bir kolaylık sağladığı da görünmüyor diye bir soru gelebilir. Bazı Veri Tipleri sınıfı ile aynı isimde anılmakla beraber bazı veri tipleri öyle değildir. Örnek vermek gerekirse.

int değişkeni Int32 sınıfını işaret eder. short değişkeni Int16 sınıfını işaret eder. Buradan anladığımız gibi int ve short kullanımları daha pratik ve kolaydır. Ama yerine sınıflarının da kullanılabileceğini bilebilirsiniz. Veri tiplerinin toplu olarak sizinle paylaşmış olayım hemen burada.

43


Bu bilgiler yeri geldikçe işimize yarayacaktır.

44


➢ 9 Değişkenler Ve Değişken Tanımlama Değişken tanımlama ve değişkenlerle işlem yapma bir programlama dilinin en temel ve en önemli noktalarından biridir. Değişkenin yazılımdaki terminolojik anlamı; ana bellekte belirli veri tiplerine ait değerlerin girişinin yapılabileceği alanları işaret eden bölümlerdir.

✓ Değişken Tanımlama Kuralları Değişkenler 1 sayı ile başlayamaz. Alt tire (_) hariç özel bir karakterle de başlayamaz. _(alt tire) ya da bir harfle başlamalıdır. Bu ilk başlangıcı yaptıktan sonra yine özel karakter kullanmamak kaydı ile sayı ve harf olarak devam edilebilir. Bir değişken tanımlanmadan önce tutacağı veri tipi belirlenmelidir.

✓ Değişken Tanımlama Yöntemi [Değişken_Tipi] [Değişken_İsmi];

int sayi;

Yukarıdaki dört maddeyi özetlemiş olduk.

45


Değişkenler tanımlanırken ilk değer ataması yapılabilir.

Burada 3 farklı türü kullanma sebebim farkları size göstermek.

int değişkenler tam sayı değerleri bünyesinde barındırırlar ve sayılar normal şekilde yazılır. string değişkenlere değer ataması ise çift tırnaklar arasında yapılır. char değişkenler bünyesinde sadece tek karakter barındırırlar ve girilen değer tek tırnaklar içine yazılır. Bu veri tiplerinin durumlarını özelliklerini detaylı bir şekilde ele alacağız.

✓ Değişkenlerin Geçerlilik Alanları Yazılıma ilk başlayan kişilerde anlam karmaşasına neden olan bir konuda değişkenler yaşam alanlarıdır. C# değişkenler kütüphane içinde Global olarak tanımlanamazlar. Ya sınıf içinde tanımlanırlar, ya da metotlar içinde tanımlanabilirler.

46


Olayı senaryolaştıralım. Şimdi bir binanın içinde olduğunuzu varsayalım. Class dediğimiz yer binanın bir katı olsun. Metotlarda o kattaki odalar olsun. Şimdi sınıf içinde tanımlanan bir değişkene koridorda dolaşan insanlar olarak düşünelim. Metotlar içinde tanımlanan değişkenlerde odaları içinde bulunan insanlar olsun. Şimdi koridorda gezen bir Ahmet Abi var ve sıhhi tesisat uzmanı. A odasında elektrikçi bir Mehmet Abi var. B odası ise boş. A odasında da B odasında da musluklar bozuldu ve elektrik kaçağı var. Şimdi size bir Musluk tamircisi bir de elektrikçi lazım. Kapıdan çıktınız koridorda gezen Ahmet abiyi gördünüz üzerinde de yazıyor zaten ne iş yaptığı. Gel Ahmet abi burada musluk bozuk dediniz Ahmet abi binanın içinde ve görüş alanınızda olduğu için tamirat için çağırabildiniz. Elektrik içinde ihtiyacımız var. Odanın içinde bu işi yapabilecek kimse yok. Dışarı baktık yine yok. Bir odada var ama bize o odada olduğu bildirilmediği için haberdar değiliz. Ne yazık ki o diğer odada ki elektrikçiyi çağıramayız. Ama bize o odada olduğu bildirilse idi işte o zaman o kişiyi de kendi odamıza çağırabilirdik. Bu durumda işimizi tamama erdiremedik. Değişken belirteçlerini ileri ki yazılarımda daha detaylı anlatacağım şimdilik böyle geçmiş olalım. Aynı soruna B odası için ele aldığımızda. İçeride Mehmet Abi var bu işi çözebiliyor. Gel yap deyince yapar. Birde dışarı çıktık koridorda Ahmet Abi vardı oda musluk için geldi. Olayı böylece çözdük. İşte tamda bu olayda anlattığım gibi. Yazdığım kodlara bakarsanız. int sayi —> Ahmet Abi Method —> Oda B Method2 —> Oda A int sayi2 —> Mehmet abi Toplam da bozuk olan musluk ve elektrik kaçağı. Gördüğünüz gibi Oda B de sayi2’nin altı çizilidir. Çünkü o, Oda B de bulunduğu için A odasından çağrılamaz. Ama sayi class içinde olduğu için her metot tarafından görülüp çağrılabilir. Umarım karışmamıştır. Bu işe ilk defa başlayan biri için açıklayıcı olması açısından böyle anlatmak istedim. Kafanızda net bir şekilde oturması için.

✓ Özet Geçersek Sınıf içindeki değişkenin yaşam alanı o sınıf içinde bulunan her yerdir. Global bir değişken olduğunu sınıf için söyleyebiliriz. Metot içindeki değişken aksi belirtilmediği sürece yaşam alanı o metodun içidir.

47


➢ 10 Char Tipi C#’da char veri tipi String.Char yapısının bir Alias’ı olarak kullanılır. Alias nedir diye aklınıza gelebilir. Alias (as) ifadesi gibi onun gibi, onun yerine anlamını taşır. Yani char as String.Char diyebiliriz. .NetFramework’de ki karşılığı Char dır.

Char ifadesi character ifadesinden gelmektedir. Bünyesinde tek karakterlik veri barındırabilir. Boyutu 2 byte yani 16 bittir. Bu sayede sadece İngilizce karakterleri değil diğer dillere ait karakterleri de bünyesinde tutabilmektedir. Char veri tipini programımız içinde kullanacağımız verinin tek karakterden oluşacağını bildiğimizde kullanabiliriz. Bir örnekle yola çıkalım. Karşı taraftan Kadın ya da Erkek şeklinde cinsiyet bilgisi alacağımızı varsayalım. Bu bilgileri de K ve E olarak saklamak isteyelim. Böyle bir durumda cinsiyet değişkeni için char veri tipi kullanılabilir.

Char karakterinde String de olduğu gibi char cinsiyet2=” şeklinde iki tek tırnak açılıp kapatılıp bırakılamaz. Hata dönecektir. Mutlaka boşluk olduğunu belirten bir boşluk bırakılmalıdır. Şimdide aldığımız bu değeri kullanıcıya gösterelim. Bu işlemi de bir Label kullanarak yapalım.

48


İlk önce dikkat etmemiz gereken bir noktaya dikkat çekmek için yanlış bir kullanım örneği göstereceğim.

Bir label ya da textbox’ın text özelliğine atanan bir değer mutlaka string olmak zorundadır. Veri türümüz string değilse uygun dönüştürme koşuluyla string türüne dönüştürülmelidir. Burada hataya baktığımızda char türünün normal kullanım şeklinde string türüne dönüştürülemediğini söylüyor. O zaman uygun dönüştürme işlemini yapalım. Casting işlemlerine detaylı olarak incelenecektir.

49


✓ ToString() Metodu Kullanarak Casting İşlemi Herhangi bir tür sonuna yazılacak ToString() metodu ile string türüne dönüştürülebilir.

Dönüştürme işlemini yaptık şimdide sonuca bakalım.

Son olarak bir kaç not düşmek gerekirse.

Char türüne değer ataması yapılırken ‘ ‘ tek tırnaklar arasında yapılır. Char veri tipindeki bir değişkene bir karakterden daha uzun olan bir değer girildiğinde hata alırız. Bunlara dikkat etmeliyiz.

50


51


➢ 11 String Tipi string veri tipi String sınıfının kullanım adı, Alias’ıdır. String veri tipi C#’ın en önemli ve temel diyebileceğimiz veri tiplerinden biridir.

String; C# üzerinde bir metin, bir paragraf, belki bir roman şeklinde, uzunluğu kullandığınız bellek boyutuyla sınırlı olmak şartıyla, istediğimiz uzunluktaki veriyi tutan veri tipidir. String sınıfına ait pek çok metot vardır. Bunlara ileride daha detaylı giriyor olacağız.

✓ String Değişken Tanımlaması

En temel string değişkeni kullanımları yukarıdaki örnekte gibidir. String bir değişken tanımlanırken 2. sıradaki gibi, sadece çift tırnaklar açılıp kapatılarak yapılan bir tanımlama da değişkenin içi boşaltılır. Bellekte yeri ayrılmıştır ama içinde veri yoktur. Çift tırnaklar arasına ” ” bu şekilde bir boşluk bırakmış olsaydık, o zaman değişkenimize boşluk değerini atamış olurduk. String bir değişkene atanan değer çift tırnaklar arasına yazılır. 2. 4. ve 5. sıradaki kullanımların, bir birinden hiç farkları yoktur. Aynı şekilde değişkenin içini boşaltırlar.

String değişkenler bir char dizi gibi davranırlar.

52


Örnek olarak şu olaya bakalım.

Bu form üzerinde arka planda bir string değişkene Gistway Software değerini atayalım. Sonrada Index yazan kısma bir sayı girip metnin o sıradaki karakter değerini RichTextbox’a yazdıralım.

int türünde Index değişkenini tanımladık çünkü sayısal bir değer alacağız. Bir nesnenin Text özelliğinden gelen değer her zaman için string’dir ve istenilen türe dönüştürme işlemi yapılmalıdır.

✓ Parse() Dönüşüm Metodu Parse metodu ile string tür int türüne dönüştürüldü.

Parse metodu ile karşı bir dönüşüm yapılabilmesi için dönüşümü yapılacak türün mutlaka string olması gerekir. Kelime6 string bir değişkendi. Aynı zamanda bir dizi olduğunu da söylemiştik. Kelime6[Index] istenilen karaktere ulaşmamıza yardımcı olacaktır.

Dizilerin 0 dan saymaya başladığını unutmamalıyız. Yani Gistway Software Değerinde 0 değeri G harfine karşılık gelir.

53


Programda gรถrelim.

54


➢ 12 String Türünün Özel Durumları ✓ String Değişkenleri Birleştirme C# üzerinde 2 string tür bir biri ile birleştirme işlemi yapılırken + işareti kullanılır. Normal bir toplama işlemi yapıyor gibi gerçekleştirilir. Bir örnek proje ile bunu anlamaya çalışalım. TextBox1 ve TextBox2 üzerinde girilen değerleri alıp birleştirip Label1 üzerinde yazdıracağız.

Kodlarımız inceleyelim. İki tane string değişken tanımladık öncelikle. Burada öğrendiğimiz yeni bir kavram var. Aynı türden değişkenler yan yana virgül ile ayrılarak tanımlanabilirler. Ayrıca aynı konumda iken bu değişkenlere ilk değer ataması da yapabiliriz. Daha sonra değişkenlere TextBox’lardan gelen değerleri atadık. Son olarak da iki değeri birleştirdik ve Label’ın text özelliğine yazdırdık.

55


Sonucu görelim.

Değeri birleştirdi ve yazdı. Ama ben bunun böyle olmasını değil de, arada bir boşlukla daha düzenli yazmak isteseydim ne yapmam gerekecekti?

Bu sefer boşlukta bir string ifade olduğu için 3 string değeri bir biri ile bağlamış olduk.

56


Peki, TextBox değerlerini bir sayı olarak gönderseydim nasıl sonuç alacaktık? String ifadeler kesinlikle matematiksel işleme tabi tutulamaz girilen sayısal değerleri birer sayı olarak değil karakter seti olarak string bir veri gibi tuttu ve yan yana yazarak birleştirme işlemi uyguladı.

✓ += Operatörünün Kullanımı C# da ve daha önceki programlama dillerinde bulunan bir operatör olan += string ifadelerle de kullanılabilmektedir. Kısaca bahsetmek gerekirse

Burada yapılan işlem şudur. Kelime3 =”Murat”, Kelime4=”Bilginer” olsun. Kelime3 ün kendi değerini Kelime4 ün değeri ile birleştirir ve bunu en son Kelime3 değişkenine atar. Yani bu işlem bittikten sonra; Kelime3=”MuratBilginer” değerini tutmaktadır. Label’ın text özelliğine Kelime3’ü yazdırsam istediğim sonucu yine elde etmiş olurum.

57


Arasında yine bir boşluk koymak isteseydik şunu yapmamız yeterli olacaktı.

58


C#’da çift tırnak ve tek tırnak C# Runner’ı için anlamlı ifadelerdir. Böyle karakterler gördüğünde bir sonraki gelen karakterleri string ya da char ifade olarak değerlendirir. Yazacağımız string ya da char değerinin içinde çift tırnak ya da tek tırnak olmak zorunda olsaydı bu durumda ne yapmamız gerekecekti?

✓ \ (Ters Slash) Kaçış Karakterinin Kullanımı C# için anlamlı olan değerin önüne \ işaretini koyduğumuzda C# onu normal olarak bir tırnak işareti olarak algılayacaktır.

Klavyede bu ifadeyi yapabilmek için (AltGr+Soru İşareti) kullanılır.

✓ \n Kullanımı İfadeyi yazdırdı ama burada bir sorunla daha karşı karşıya kaldık. O da C#’ın string ifadeyi kod tarafında bir alt satıra indirmiş olmamıza rağmen bunu algılamayıp uzun bir şekilde tek satırda yazmasıdır. Buradan şunu anlayabiliriz. Kod tarafında gerçekleştirdiğimiz Enter tuşu ile string ifade içinde bir alt satıra geçmemiz normal bir kullanımda, C# için hiç bir anlam ifade etmemektedir.

O zaman biz yazdığımız cümleleri hiç alt satıra geçiremeyecek miyiz? Bir yolu var, oda bir alt satıra geçmemiz gereken yere \n ifadesini koymaktır. Bu NewLine anlamına gelmektedir. Yeni satıra geçecektir.

59


İstediğimiz \n olan noktalardan bir alt satıra geçmesini bekliyoruz.

Gördüğümüz gibi bunu da başarılı bir şekilde gerçekleştirmiştir.

✓ @ Karakteri Kullanımı Bu anlattığım yöntem 2 satır bir cümle için çokta bir sorun teşkil etmiyor. Ama biz binlerce satırlık bir string gireceksek ve belli başlı noktalarda da alt satıra geçmek isteseydik. 1000 tane \n’mi koymamız gerekecekti? Bunu da @ karakteri ile çözmüşler. Bu ifadeyi koyduğunuz bir string içinde tüm anlamlı ifadeler string değerin bir parçası olarak görülecektir. Burada tek handikabımız tırnak içine almamız gereken noktaları bu kullanım şekliyle tek bir string değişken içinde tırnaklar içine alıp gösteremememizdir. Bunun için birleştirme işlemleri ile bu durumu kolayca aşabiliriz.

60


@ ifadesini string değerine başına yazdıktan sonra kod içinde yazarken enter tuşu ile alt satıra geçmelerimi kullanıcı ekranında da aynen görebileceğiz.

61


13 Sayısal Veri Tipleri ✓ Sbyte Veri Tipi -128 ile 128 arasındaki sayıları bünyesinde tutabilen bir tam sayı veri tipidir. Bellekte 1 Byte yer kaplar. O yüzden negatif tarafta -128 den daha küçük olmadığını, pozitif tarafta +128 den daha büyük olmayacağını bildiğimiz değişkenleri SByte olarak tutabiliriz. Sbyte türünün tanımlayıcısı C# üzerinde sbyte şeklindedir.

Bu tür bir aralıktaki değerleri tutan değişkenlerde üst sınır ve alt sınırda hep bir kararsızlığa düşeriz. Örneklerim içinde bunu da göstermeye çalıştım. sbyte veri tipi üst sınırı en sonra 127 değerini alabilirken, alt sınırda -128 i alabilmektedir. 128 yazdığımda hata alıyoruz. Aynı şekilde -128 de bir hata almaz iken -129 değerinde hata alıyoruz.

✓ Byte Veri Tipi Byte da 0 ile 255 arası değer alabilen bir tam sayı veri tipidir. En son alabileceği değer 255’dir. C# üzerindeki tanımlayıcısı Byte şeklindedir.

Önemli bir noktadan bahsetmeye çalışacağım şimdi Boxing yaparak tür dönüşümünü de görmüş olacağız. 255’den büyük bir değer direk byte değere atadığımızda gördüğümüz gibi hata almaktayız. Peki, 255 den büyük bir türü byte türüne Boxing yaparak dönüşüme uğratsaydık ne olurdu.

62


Byte türünde Z4 tanımladık. int türünde Z3. Z3 değerine byte tipinin alacağı sınırların dışında bir değer verdik. Sonrada bu değeri bir Boxing işlemi ile int türünü byte türüne dönüştürdük. Ancak şöyle bir sorunumuz var geçmişten bildiğimiz bir konu var byte 255 den daha büyük bir değer alamazdı. Şimdi bu dönüşüm yapılınca 256 değerini alabilecek mi? Tabi ki hayır. Burada yapacağı işlem 256 değerine göre mod alma işlemidir. Yani gelen değeri 256 ya böler ve kalan değer yeni değerimizdir. Yani şu durumda Z4 ün 0 olmasını bekleyeceğiz.

Gördüğünüz gibi beklediğimiz gibi de gerçekleşti. Byte ile işlem yaparken buna dikkat etmelisiniz. Tür dönüşümleri konumuza geldiğimizde Boxing işlemi ile tür dönüşümüne detaylı değineceğiz. Byte türünün bir başka örneğine bakalım şimdi. Biliyorsunuz ki bir karakterin ASCII kodları bir sayı değeri ile ifade edilir. İşte char tipli bir değişken Boxing yöntemi ile byte türüne dönüştürülürse o karakterin ASCII kodlarındaki sayısal karşılığını görürüz.

63


Şimdi bunu örneklerle görelim.

Burada dikkat etmemiz gereken bir nokta string olarak gelen TextBox değerinin char.Parse() metodu ile char türüne dönüştürülmesi gerektiğidir. Eğer biz TextBox’a bir karakterden daha uzun bir değer yazarsak tür dönüşümünü yapamayacağı için hata alırız. Programlama yaparken bu tür kullanıcı hatalarının önüne geçmek için ilerde önleme yöntemlerine de göz atacağız. Şimdi programı çalıştırıp bakalım.

64


a harfinin ASCII kodu 97 imiş.

Büyük A ile Küçük a’nın bir birinden farklı sayı değerleriyle tutulduğunu buradan anlayabiliyoruz. Büyük A’nın değeri 65 imiş.

Birde hata mesajını görmek için bir karakterden uzun bir değer girdim. Hata mesajında da olayı net bir şekilde anlayabilmekteyiz.

65


✓ Short Veri Tipi Short veri tipi -32.768 ile +32767 arası değerler alabilen tam sayı tipidir. Int16 tipinin gösterimi short şeklindedir. Değişken tanımlama yaparken Int16 diyerek yapacağımız tanımlamayı short diyerek yapabiliriz.

Şimdi her yerde göremeyeceğiniz bir ipucu paylaşacağım sizlerle. Bir kodun Kütüphane içinde hangi metotlar içinde nasıl kullanıldığını ve neyi yaptığını merak ederseniz şunu yapabilirsiniz. İmleci o kodun üzerine getirin ve F12 ye basınız.

İmleci short üzerine getirdim ve F12 ye bastım. Gelen ekran.

66


Buradan gördüğümüz gibi short anahtar sözcüğünün Int16’yı ifade ettiğini anlayabiliyoruz. Burada her metodu açıp içindeki açıklamaları okuyarak kullanımları hakkında bilgi sahibi olabilirsiniz. Bu her kod için geçerlidir. Takıldığınız anlamakta zorlandığınızda bunu yapmakta her zaman fayda vardır.

✓ ushort Veri Tipi Bu veri tipi sadece 0 ve pozitif sayıları baz alır. 0 ile 65 535 değerleri arasındaki sayıları alabilmektedir.

ushort ifadesi UInt16 sınıfını işaret eder. MaxValue ve MinValue değerlerinde de hangi aralıkta değer alabildiğini aşağıdaki bölümden görebilmekteyiz.

67


✓ int Veri Tipi int türü Int32 sınıfının işaretçisidir. Bellekte 4 byte yer kaplar. Değerin sınırları -2.147.483.648 ile +2.147.483.647 arasındadır. En çok kullandığımız tam sayı veri tipi olarak genelde karşımıza çıkar. o

int Tanımlama

int türü ile ilgili bir noktaya temas etmekte fayda var. Özellikle bölüm işlemini yaparken yaşanabilecek bir sıkıntı. İki türünde int olduğu bir bölümde ondalıklı bir sayı elde edemezsiniz. Örneğin 10 / 4 işleminde 2.5 değerini bulamazsınız. Sonuç 2 olarak dönecektir. Bu tür işlemler için double değişken türü var onu kullanacağız.

68


int tipi ile alakalı küçük bir anekdot. Youtube izlenme sayılarını sayacın Aralığını 32 bit yani int değeri olarak ayarlamıştı. Ama bir gün Gangnam Style şarkısının int türünün üst sınırı olan 2.147.483.647 izlenme sayısını geçince bir anda sayaç kendinden geçmişti.

69


Sonra büyük ihtimal sayacın veri tabanı değişken türünü 64 bit olarak ayarlayınca sorunda düzelmişti. Bazı şeylerin büyümesi ve hızı hakkında aslında net bilgi veren olaylardan biriydi. Aşağıda bahsedeceğimiz 3 veri tipi C# ın ondalıklı sayı değer aralıklarını tutan değişken türleri olarak karşımıza çıkar. Reel sayıları elde edebildiğimiz değişkenler olup kullanım alanları digit hassasiyetine göre değişim gösterebilmektedir.

✓ Float Tipi .Net’de Single sınıfını temsilen kullanılan veri tipi olup, bellekte 4 byte yer kaplar.

Float değişken tanımlaması ve değer ataması aşağıda gördüğümüz gibidir. Biraz öncede bahsetmiştik, float, Single sınıfın belirtecidir.

Bu tanımlamayı yaparken daha önce görmediğimiz bir durum var. Oda sayının sonuna yazılan f harfi.

Sebebi şudur; Ondalık veri tiplerinin Default değeri double’dır. Ve yazılan double türündeki değer direk olarak float türüne dönüştürülemez. Float olduğunu özellikle bildirmemiz gerekecektir sayısal ifadelerde.

70


Aşağıda da görüyoruz sonuna f yazmadığım ondalıklı sayıda bir hata işareti bulunmaktadır.

✓ Double Tipi Double ondalıklı sayı (kayan noktalı sayı ifadesini de görebilirsiniz) grubunun Default veri tipidir. Yani C# üzerinde hiç bir tanım gözetmeden yazılan ondalıklı bir sayı double sınıfına aitmiş gibi davranır.

Aşağıda görüldüğü gibi tanımlaması ve ilk değer ataması yapılabilir. Ondalıklı sayı yazarken Visual Studio ayracı nokta olarak kabul eder. Türkçe’den alışkanlık 15,5 yazsanız hata alırsınız.

71


int türünde tanımlanmış bir değer, double türü ile işleme girerse tür otomatik olarak double türüne dönüştürülür ve işlem öyle gerçekleşir. Buna C# da değerin örtülü olarak tür dönüşümüne uğrayabildiği kavramıyla karşılaşabilirsiniz.

Eğer sonuç değişkenin türü int olsaydı bu işlem gerçekleşemeyecekti. Çünkü sağındaki işleme giren tüm değerler artık double’dır. Sonuç olarak değeri örtülü olarak int türüne dönüştüremeyecektir.

72


✓ Decimal Tipi C#’da decimal veri tipi ondalık sayılar için kullanılan veri tipleri içinde en fazla hassasiyete sahip olan veri tipidir. Decimal sınıfının belirtecidir.

Daha çok, yüksek hassasiyete sahip muhasebe ve para işlerinde ya da bilimsel araştırmalarda virgülden sonraki hassasiyetin çok önemli olduğu durumlarda kullanılan bir değişken türüdür. Aynı şekilde float da bahsettiğimiz gibi bu değişken türünde işlem yapacağımız zaman girilen ondalıklı değerin sonuna onun decimal türüne ait olduğunu bildiren m ya da M işareti koyulur. Decimal tanımlamaları gördüğünüz şekilde yapılabilir.

Örneğin bir işlem içinde int ve decimal türünden değişkenlerimiz olsun bakalım sonucumuz nasıl çıkacak.

73


Herhangi bir hata almadığımızı görüyoruz. Bu işlem int türünün decimal türüne doğru giderken herhangi bir değer kaybına uğrama olasılığı olmadığı içinde kendi içinde dönüştürme işlemini yapabilir. Sonuç bize decimal türünde gelecektir. Aynı durumda son değeri int bir değişkene atmaya çalışsaydık aşağıdaki hatayı alacaktık.

Bu dönüşümü bu şekilde yapamaz. Eğer kayıpları göze alabiliyorsak dönüşümü açık olarak bizim yapmamız gerekir.

Aynı durum double ve float türleri içinde geçerlidir. Kendi içinde tür dönüşümüne uğrayamazlar mutlaka kodlar içinde gerekli dönüşümler yaptırılmalıdır. Son olarak Decimal tipinin hassasiyetini bir işlem sonucunda görelim.

74


✓ Bool Veri Tipi C# doğru veya yanlış olmak üzere iki tip cevabı olan soruların değerlerini bool veri tipinde barındırabiliriz.

Bool veri tipi .Net’de Boolean sınıfının işaretçisidir. o

Bool Tipinin Tanımlanması

Pek çok karar mekanizmasında işlerimizi büyük ölçüde kolaylaştıran bir değişken tipidir bool. int türüne ilk değer ataması yapılmazsa otomatik olarak sıfır değeri atanır aynı şekilde string türüne bir atama yapılmazsa boşluk olarak otomatik ilk ataması yapılacaktır. Peki, bool tipine ilk atamasını yapmazsak ne değer döner geriye. Bool tipinin otomatik atanan ilk değer ataması boştur değerli arkadaşlar.

75


o

Bool Tipinin Değerini Gösterme

Bool tipi bir text özelliğine yazdırılmak istenseydi aşağıda gördüğümüz gibi string dönüştürme işlemi yapmak gerekecekti.

Bool veri tipinin bir diğer özelliği tuttuğu değeri int türüne dönüştürerek de kullanılmasına olanak sağlamasıdır. Yani bool tipinde false 0, true 1 değerine karşılık gelir. Tür dönüşümü yaptırıp değeri ekranda gösterdiğimde aşağıdaki bir sonuç görürüz.

76


77


14 Const & Readonly Kavramları Yazdığımız programlar içerisinde bazen bir değişkenin değeri hiç bir şekilde değiştirilemesin istediğimiz durumlar olur. Mesela bilimsel ve matematiksel sabitler gibi.

✓ Const Kavramı Bu tür sabit değerli değişkenler tanımlayabilmek için Const anahtar sözcüğünü kullanırız.

o

Const İle Tanımlama

Gördüğümüz şekilde tanımlanır.

❖ Kurallar Const ile yapılan tanımlamalarda mutlaka değişkenin ilk değeri atanmalıdır. Aksi halde aşağıda gördüğümüz hatayı alırız.

78


Const ataması yapılmış değişken değeri kodlar içinde tekrar değiştirilemez. Eğer böyle bir şey yaparsak aşağıdaki hatayı alırız.

Const tipli bir değişkene ilk değer ataması yine bir değişken yardımı ile yapılacaksa o değişkende const tipli olmak zorundadır. İlk olarak doğrusunu görelim.

Aksi bir durumda şöyle bir hata alacaktık.

79


Const ifadesi kullanılarak sayısal veri türleri üzerinde açık matematiksel işlemler yapılabilmektedir.

Const ile sadece sayısal sabitler değil tüm nesne grupları için sabit değerler oluşturabilirsiniz.

✓ Readonly Kavramı o

Readonly Kullanımı

İsminden de anlaşılacağı üzere sadece okunabilir demektir. Nesnelere ilk değerlerini verdikten sonra tekrar değiştirilmesini istemiyorsak bunu yapabilmenin bir diğer yöntemi Readonly kullanımıdır. Yalnız burada ilk değer yapıcı metot içinde değiştirilebilmektedir. Önemli olan bizim için yapıcı metot dışında diğer metotlar içinde sadece okunabilir olmasıdır.

❖ Kurallar

Readonly değişkenler tanımlanacağı zaman Class seviyesinde tanımlanırlar. Metotlar içinde tanımlanamazlar.

80


Önemli ve Const’dan ayıran bir diğer özelliği ilk değer ataması yapılmadan tanımlanabilir. Değişkene değer ataması yalnızca Yapıcı(Constructor) Metot içinde gerçekleştirilebilir. Bu sayede metotlar içinde sadece okunabilir özelliği ile yer alacaktır.

Yapıcı metot içinde değeri birden fazla kez değiştirilebilir. Son değeri tüm metotlar tarafından okunabilir değerini ifade eder.

81


15 Var Tipi C#’da var tipli değişkenler, değişkenin alacağı tip tam olarak bilinemediğin de tanımlama için kullanılabilir. Ayrıca bir diğer kullanım sebebi programlar arası geçişlerde global bir veri tipi olmasıdır. Örneğin C#’da double olarak tanımlanan bir değişken tipi Python da farklı olabilir. Böyle geçişlerde evrenselliği sağlamış ve hata oranlarını azaltmıştır.

✓ Var Tipli Değişken Tanımlama Gördüğümüz şekilde var tipli değişkenler tanımlayabiliriz.

var tipli bir değişken ilk değeri verilerek tanımlanabilir. İlk değeri verilmeden tanımlamanız mümkün değildir. Aşağıda gördüğümüz hatayı alırız.

82


✓ Var Tipinin Çalışma Mantığı Var tipli bir değişken tanımladığınız da bunun tipini siz değil verilen değere göre derleyici kendisi belirler. Bellekte buna göre yer ayrılır ve değişken o tipiyle kayıt altına alınır.

✓ Var Tipli Değişkenin Tuttuğu Veri Tipini Öğrenme Program içinde var tipli bir değişkenin hangi türde bir veriyi tuttuğunu öğrenmemiz gerekebilir. Bunun için yapmamız gereken işlem; GetType() Metodunu kullanmaktır

.

83


Eğer değişkenimizin tipini bariz biliyorsak bu değişkeni var ile kullanmak çok mantıklı değildir. Bunu tavsiye etmiyorum. Çünkü onun sebebi şudur; var tipli değişkenin içinde tuttuğu veri tipini derleyici kendi belirlemekte ve bunun içinde arkada bir kod blogu döndürmektedir. Bu durum uzun soluklu bir projede performans kayıplarına neden olabilecektir. O yüzden bu tavsiyede bulunuyorum. Bu durumu da görmek için bir program hazırladık. Bir var tipli, birde string tipli iki değişken tanımlayacağız. İki değişkene de aynı değeri gireceğiz. Ve sonrasında form üzerindeki ListBox’a bunları yazdıracağız. Ama bu işlemi 100 000 kere dönen bir for döngüsü içinde yapacağız. Burada her for döngüsü için bir süre tutacağız işlemler bittiğinde ne kadar süre sürdüklerini ekranda göstereceğiz.

84


✓ String Türü İle Değerlendirme Şu anda anlamlandıramadığınız kod bloklarına takılmanıza gerek yok. İleride detaylı bir şekilde hepsini göreceğiz.

85


private void button1_Click(object sender, EventArgs e) { Stopwatch SW = new Stopwatch(); SW.Start(); for (int i = 0; i < 100000; i++) { var Kelime1 = "Gistway Software"; listBox1.Items.Add(Kelime1); } SW.Stop(); label1.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { string Kelime2 = "Gistway Software"; listBox2.Items.Add(Kelime2); }

label2.Text = SW.Elapsed.ToString(); }

86


✓ İnt Türü İle Değerlendirme string türünü direk verdiğim değişkenin olduğu for döngüsü işlemini 37 saniyede tamamlarken var tipli olan for 39 saniye sürdü. Gördüğünüz gibi tipi biliyorsak, yazmak performans açısından daha iyidir. Bir de bu değişken tipimiz int olsaydı ne olurdu ona bakalım.

private void button1_Click(object sender, EventArgs e) { Stopwatch SW = new Stopwatch(); SW.Start(); for (int i = 0; i < 100000; i++) { var Sayi1 = 0; listBox1.Items.Add(Sayi1); } SW.Stop(); label1.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { int Sayi2 = 0; listBox2.Items.Add(Sayi2); } label2.Text = SW.Elapsed.ToString(); }

87


int tipinde daha farklı bir zaman çıktı ama aradaki fark yine neredeyse aynı. İşte bu sebepten dolayı var tipini zorunluluk harici tercih etmemekte fayda var.

88


16 Object Veri Tipi ✓ Object Tipi Nedir? Object tipi C# da değişken tipini belirtmek zorunda olmadan kullandığımız tüm veri tiplerini içinde barındırabilecek bir veri tipidir.

✓ Object Tanımlama

✓ Object Vs Var Bu noktada aklınıza gelebilecek sorulardan biri şudur. Bu kullanım haliyle var’a çok benziyor neden object türüne ihtiyaç duyulmuş, nedir farkları?

var tipli bir değişken tanımladığımızda buna ilk değer vermeden tanımlama yapamıyorduk.

Ama object tipine ilk atama yapmadan değişken tanımlaması yapabilirsiniz.

89


Herhangi bir hataya sebebiyet vermeyecektir. Sadece herhangi bir tipin deklere edilmediği ve bu değişkenin henüz hiç kullanılmadığı uyarısını alırsınız. Ancak böyle bir durumda herhangi bir atama yapılmadığı için verilen değişkenin tipini öğrenmek için GetType() metodun çağırsaydık hata alacaktık.

Var tipli bir değişkenin değeri Ram de Stack bölgesinde ve tipiyle ve değeriyle beraber tutulur bunu bir önceki yazımda şöyle göstermiştim.

90


Object tipli bir değişken ise RAM ‘in Heap bölgesinde object tipinde tutulur ve Stack alanda sadece bu değerin Heap deki adresi tutulur.

Bunun sağladığı en büyük güzelliklerden biri RAM’in Stack alanında en başta türden gelecek boyut kadar yer ayırmaz. Gelen değer sonrasında Unboxing yapıldıktan sonraki türün boyutu kadar yer anlık olarak oluşturulur. RAM’in optimizasyonu için önemli bir olaydır.

✓ Boxing & Unboxing Object tipli bir değişkenin tanımlanması ve ilk değerinin atanması anında olan olay Boxing(Kutulama) olayıdır.

object Sayi=1;

Normalde int tipli olan Sayi değişkeni object türü ile tanımlandığı anda türü tekrar kutu açılana kadar object olacak şekilde ayarlanır. Bu işlem Boxing olayıdır.

Object tipine gönderdiğimiz tipi kullanabilmemiz için mutlaka Unboxing işlemi yapılmalıdır.

91


Örneğin ilk başta Object Sayi=0; değişkenini tanımlayıp daha sonra int tipli Sayi2 ye Sayi değişkenini atama işlemini yapalım.

Aynı işlemi birde string için yapalım.

Var tipli bir değişkene ilk atama yaptığınız anda o değişkene ilk hangi tür atamayı yaptı iseniz program boyunca o tipte davranacaktır. Farklı bir tip set etmeye çalışırsanız hataya neden olacaktır.

92


Ama object tipinde böyle bir sınırlama yoktur programın her anında değişkene istediğiniz tipte değer ataması yapabilirsiniz.

Burada tek dikkat etmeniz gereken şey kullanabilmek için UnBoxing yapmanız gerektiği için o anki tuttuğu tipi bilmeniz gerektiğidir. Bunun içinde GetType() Metodunu kullanabilirsiniz.

✓ GetType() Kullanımı Object tipli bir değişkenin o anda tuttuğu değişken değerini bilmek için GetType() Metodu kullanılır.

93


17 Var Vs Object Performans DeÄ&#x;erlendirmesi

private void button1_Click(object sender, EventArgs e) { Stopwatch SW = new Stopwatch(); SW.Start(); for (int i = 0; i < 100000; i++) { var X = "Gistway Software"; listBox1.Items.Add(X); } label1.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { object Y = "Gistway Software"; listBox2.Items.Add((string)Y); } label2.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { string Z = "Gistway Software"; listBox3.Items.Add(Z); } label3.Text = SW.Elapsed.ToString(); SW.Reset(); }

94


Object tipi ile yapılan tanımlamanın Boxing ve Unboxing olaylarından dolayı 1 saniye daha geç gerçekleştiğini görüyoruz.

private void button1_Click(object sender, EventArgs e) { Stopwatch SW = new Stopwatch(); SW.Start(); for (int i = 0; i < 100000; i++) { var X = "Gistway Software"; listBox1.Items.Add(X); } label1.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { object Y = "Gistway Software"; listBox2.Items.Add((string)Y); } label2.Text = SW.Elapsed.ToString(); SW.Reset(); SW.Start(); for (int i = 0; i < 100000; i++) { string Z = "Gistway Software"; listBox3.Items.Add(Z); } label3.Text = SW.Elapsed.ToString(); SW.Reset(); }

95


18 Dynamic Veri Tipi Daha önce var ve object veri tiplerinden bahsetmiştik. Dynamic veri tipi bu iki tipten geri kalan eksikliği doldurmak için C# 4.0 ile beraber .net kodlayıcılarının hayatına girdi. Dynamic veri tipi bütün veri tiplerini tutabilen değişkendir.

✓ var ve dynamic Tip Farkı Dynamic tipi derleme anında belli koşulların gerçekleşmesini beklemez. Yani var tipi derleme anında değişkene ilk değeri ister. Ram de o tipte yer ayrılır ve daha sonra o tipten daha farklı bir tipi atamanıza izin vermez. Ama dynamic tipi derleme anında istediğiniz şekilde değer ataması yapabilirsiniz. Derleme anında bir değerlendirme yapmayacaktır. Object tipiyle farkı nedir derseniz. Object tipinde Boxing ve Unboxing olayları vardı. Atanmış bir değişkenin değerini almak için mutlaka Unboxing yapmak gerekiyordu. Bu durumda kod ve veri güvenliği açısından bir sıkıntı doğurabilmektedir. Dynamic tipinde ise böyle bir durum söz konusu değildir.

✓ Dynamic Tanımlama

dynamic Sayi; dynamic Sayi2 = 0;

✓ Dynamic Değeri Derleme Anında Türünü Değiştirme Dynamic veri tiplerinde kodlama anında istediğimiz şekilde veri tipini değiştirebiliriz. İlk olarak int değer verdiğimiz dynamic değişkene sonrasında string değer atayabiliriz. Bu durum sonunda herhangi bir hata geriye dönmeyecektir.

dynamic Sayi; dynamic Sayi2 = 0 Sayi2 = "Gistway Software";

96


o

Dynamic Veriden Değer Alma

private void button1_Click(object sender, EventArgs e) { dynamic Kelime = "Industryolog Akademi"; label1.Text = Kelime; }

Böyle bir kodlama yaptığımızda, derleme anında herhangi bir hata almayız. Çünkü dynamic veri tipine verdiğimiz değerler paketlenir ve çalışma anında açılır. Yazdığımız kodlama sonucunu ekranda görmek istersek tip çalışma anında belirlendiğinde string olarak döneceği için bu işlem çalışma anında da hata vermeyecektir. Ama tür string harici bir tip olsaydı o zaman çalışma anı hatası alacaktık.

private void button1_Click(object sender, EventArgs e) { dynamic Kelime = 2; label1.Text = Kelime; }

✓ Dynamic Tipinin Kullanımları •

dynamic tipi bir field olarak kullanılabilir.

static dynamic X;

dynamic tipi bir Property olarak kullanılabilir.

dynamic X {get; set;}

97


dynamic tipi bir metodun geri dönüş tipi olarak kullanılabilir.

public dynamic X(dynamic D) { return D; }

dynamic tipi is ve as gibi belirteçlerle kullanılabilir.

dynamic X=2; if(X is int) { // Kodlar }

Burada sorduğumuz soru şudur. X dynamic değişkeninin türü int ise bize true değerini döner. Eğer değilse false değerini döner. As kullanımı ise Boxing yöntemi yapmadan farklı türdeki bir değer dynamic değişkene atamak için kullanılabilir.

int X=0; dynamic D; D=X as dynamic;

98


Boxing Yöntemi İle Değer Atama

Yine farklı türde bir değişken Boxing işlemi uygulanacak dynamic türde dynamic bir değişkene atanabilir.

int X=0; dynamic D; D=(dynamic)X;

Özel Durum

if(someVar is dynamic)

Burada someVar ifadesi herhangi bir değeri, değişkeni ifade etmektedir. Burada someVar değişkeninin değeri null olmadığı sürece bu ifade her zaman true değerini geri dönecektir. •

typeof metodu ile kullanılabilir

Console.WriteLine(typeof(List<dynamic>));

99


19 Tür Dönüşümleri ✓ ToString() Metodu Herhangi bir türdeki veri tipi değişken sonuna yazılan ToString() metodu ile değer string türüne dönüştürülebilir.

private void button1_Click(object sender, EventArgs e) { int Sayi = 0; string Kelime = Sayi.ToString(); }

Bu şekilde tüm türlerden string türe dönüşüm yapılabilir.

✓ Parse() Metodu o

Parse Kullanımı Tür.Parse(Değişken)

Parse metodu sadece string türden farklı bir türe dönüşüm yapılmasını sağlayan metottur.

private void button1_Click(object sender, EventArgs e) { string Kelime = "5"; int Sayi = int.Parse(Kelime); }

100


✓ Boxing Yöntemi

o

Boxing Yöntemi Kullanımı (Tür)Değişken

private void button1_Click(object sender, EventArgs e) { int Sayi= 5; double Sayi2 = (double)Sayi; }

Tabi burada Boxing işlemi yaparken dikkat edilmesi gereken durumlar vardır.

Mesela string bir tür Boxing yöntemi ile sayısal türlere dönüştürülemez.

101


✓ Convert Sınıfı İle Dönüşümü Her tür arası dönüşümü en temiz yapabileceğimiz yöntem Convert yöntemidir.

Convert.ToTür(Değişken)

private void button1_Click(object sender, EventArgs e) { string Sayi= "5"; double Sayi2 = Convert.ToDouble(Sayi); }

✓ Checked & Unchecked Bilinçli tür dönüşümlerinde veri kayıplarının olması söz konusudur.

private void button1_Click(object sender, EventArgs e) { double Sayi= 5.2; int Sayi2 = Convert.ToInt32(Sayi); }

Böyle bir tür dönüşümünde 5.2 olan değerin ondalıklı kısmı atılır ve sadece 5 değeri int değerine atanır. Böyle tür dönüşümleri sırasında kayıpları engellemek için Checked ve Unchecked özelliği kullanılabilir. Bu durumda herhangi bir hata dönmeden işlemin tamamlandığını görürüz.

private void button1_Click(object sender, EventArgs e) { int i = 255; byte b; checked { b = (byte)i; } label1.Text = b.ToString(); }

102


private void button1_Click(object sender, EventArgs e) { int i = 256; byte b; checked { b = (byte)i; } label1.Text = b.ToString(); }

Eğer Byte değerinin sınırı 256 gibi bir değerle açılırsa bu işlemin yapılmasına izin vermeyecek ve Runtime hata dönecektir.

103


Checked içinde veri kaybı olduğunda bunun geriye hata döndürmesini istemeden bu veri kaybını kabul ediyorsak Checked içinde Unchecked kullanılabilir.

private void button1_Click(object sender, EventArgs e) { int i = 256; byte b; checked { unchecked { b = (byte)i; } }

✓ Bilinçsiz Tür Dönüşümleri C# da kodlama anında aynı tipler arası tür dönüşümü belirtmeden küçük olan tip büyük türe aktarılabilir. Örneğin int türü double türünden daha düşüktür. int türünden double türüne atama yaptığımızda herhangi bir kaybın olması söz konusu olmayacağı için bunu kodlama anında hiç bir belirteç kullanmadan yapabiliriz.

class TurDonusumu { static void Main() { byte a=5; short b=10; sbyte c=30; int d=a+b+c; string e="deneme"; char f='k'; object g=e+f+d; long h=d; float i=h; double j=i; double k=12.5f; Console.WriteLine(j+k); } }

104


✓ Bilinçsiz Yapılabilecek Dönüşümler Sadece bir tanesi açıklamak gerekirse Byte short ve sbyte değerleri int türünden daha küçük bir aralıkta olduğu için d=a+b+c; ataması yapılabilir. Ve bu işlem sırasında a b c int türüne o anda dönüştürülür.

sbyte

short, int, float, long, double, decimal

byte

short, ushort, int, uint, long, ulong, float, double, decimal

short

int, long, float, double, decimal

ushort

int, uint, long, ulong, float, double, decimal

int

long, float, double, decimal

uint

long, ulong, float, double, decimal

long,ulong

float, double, decimal

char

ushort, int, uint, long, ulong, float, double, decimal

float

double

105


20 Değer Ve Referans Tipi C# üzerinde oluşturduğunuz değişkenler, nesneler ram üzerinde tutulurlar ve orada işlem görürler. Değişkenler RAM’de 3 bölümde tutulurlar. Biz bugün sadece 2 alandan bahsedeceğiz. Stack ve Heap alanları.

✓ Stack Ve Heap Stack alan değer tipli değişkenleri ve değerlerini tutan alandır. Heap alan ise oluşturulmuş nesne tipli değişkenlerin tutulduğu alandır.

Bu şekilde görebiliriz. C# da veri tipleri de iki türdür. Değer tipli olanlar ya da referans tipli olanlar. Bu iki tipinde veri tiplerini görüp daha sonra detaylı inceleyelim.

Değişken türleri: “int”, “long”, “float”, “double”, “decimal”, “char”, “bool”, “byte”, “short”, “struct”, “enum” Referans türleri: “string”, “object”, “class”, “interface”, “array”, “delegate”, “pointer”

106


✓ Değer Tipli Değişkenler Değer tipli değişkenler RAM’de Stack alanda bulunup direk değişkenin değerini tutan değişkenlerdir. Bu anlamda erişimleri hızlı ve kolaydır. Örneğin C#’da; int Sayi=5; Tanımlamasını yapmış olalım. Değer tipli olan int türü verinin değerini RAM’de Stack alanında değeriyle beraber tutacaktır.

✓ Referans Tipli Değişkenler Referans tipli değişkenler nesnelerdir. Boyutu kullanım anında değişebileceği için RAM’de Heap alanında saklanırlar ve Stack alanda ise sadece o değerin Heap’deki adresi tutulur. O değer istendiğinde Stack’deki adres yardımı ile Heap’e ulaşılır ve veri gerekli çözümleme işlemleri sonucunda kullanılabilir duruma gelir.

Yukarıda gördüğümüz gibi.

107


Bir dipnotu vermekte fayda var bu noktada. string türü referans tipli olsa da özel bir durumu vardır ve metotlara işlem olarak geçerken değer tipli gibi davranır. Bu anlattıklarımızın hepsini bir örnek ile pekiştirecek olursak.

int a=2; int b=3; a=b; int a=2; int b=3; a=b; b=4;

Böyle bir kodlama sonucunda a değeri 3 b değeri 4 olarak sonuç verecektir. Yani değer tipli değişkenlerin değişimleri öncesindeki kullanımdaki değişkenleri etkilemezler. Şimdi yazacağım kodlarda X bir sınıf ve içerisinde Değer1 gibi bir Property’nin olduğunu varsayalım.

int a, b; X A1 = new X(); X A2 = new X(); A1=A2; A1.Değer1=5; int A3=A2.Değer1;

İşte böyle bir durumda referans tipli bir değişkenden değer alan A3 5 e eşit olacaktır. Çünkü ikisi değerde aynı referans tipli değişkenin değerini kullanmaktadır. Böyle bir durumda A2 değeri değişirse tüm değişkenlerin değerinin de değişmesini sağlayacaktır.

108


21 Stack ve Heap Alanları

C# ya da herhangi bir programlama dilinde yazdığımız kodlar bellekte bir yer kaplayacaktır. Biraz olayın üzerine düşünerek ilerliyor gibi yazmakta fayda var. İlk adım programı kodladınız. Bir tane küçük bir program kodlayalım hemen.

private void Form1_Load(object sender, EventArgs e) { int Sayi = 0; int[] Dizi1 = new int[20]; DataTable DT = new DataTable();

}

Adım adım gidersek. int türünün kapladığı alan belirlidir. Bunun için RAM’de 4 Byte’lık yer ayrılır. Dizi değişkeninde belirli boyutta ve türü verilmiştir.

109


Buda değerleri bilindiği için Stack alanda saklanacaktır. Peki, DataTable için nasıl bir boyut belirlemesi yapılabilir? İşte tamda burada Stack ve Heap kavramları karşımıza çıkar. Şunu demişler boyut değerini bildiğimiz değişkenleri RAM’in Stack alanından tutalım. Ama belirsiz olan referans tipli değişkenleri de Heap de tutalım. Stack ve Heap programlama yaparken Ram üzerinde kullandığımız iki alandır. Stack alanı Heap alanına göre daha az boyutludur. Çünkü Heap alana boyutu belirsiz değişkenler gelmektedir. C# da RAM’deki bu iki alana doğrudan müdahale yoktur. Programlama içinde belirlenen kurallar dâhilinde ilgili değişkenler ilgili alanlara yazılır. C# teknolojisi olan Garbege Collector ile Ram üzerinde işi biten değer silinir. Bu işlemde C# Runner’ı tarafından gerçekleştirilir.

✓ Stack Özellikleri Stack alan kullanımı kolay ve erişimi hızlıdır. Boyut değerleri sınırlıdır. Yani yukarıda 20 uzunlukta tanımladığım değişkene 21. değeri atamaya çalışırsam buna izin vermeyecek geriye hata dönecektir. Derleme zamanında oluşturulur. Eğer bir değişkene atanacak değeri net olarak biliyorsak burada değer tipli değişken kullanarak Stackde saklanmasını sağlamak tavsiye edilendir.

✓ Heap Özellikleri Stack alana göre erişimi yavaştır. Eğer doğru bir şekilde kullanmazsak bellek sorunlarımızın ortaya çıkması çok muhtemeldir. İhtiyacınız olan alanı ya da değeri tam olarak bilmiyorsanız referans tipli bir değişken kullanıp bunun Heap alanından saklanmasını sağlamalısınız. İşte Stack Ve Heap alanları böyleydi. Bir sonraki yazımda görüşmek üzere.

110


22 Operatörler ✓ İlişkisel Operatörler o

Atama Operatörü (=)

C# ve pek çok programlama dilinde bir değerin solundaki değişkene atama işlemi yapılır. Atama operatörü = (Eşittir) işaretidir.

Tek başına kullanılan eşittir bir eşitliği değil atamayı ifade eder.

int x; x=5;

Böyle bir ifade ile karşılaştığımızda diyeceğiz ki x’e 5 değeri atanmıştır.

X eşittir 5 demek yanlış olacaktır. o

Eşittir Operatörü (==)

Bu şekilde yan yana kullandığımız 2 eşittir ifadesi matematiksel eşitlik ifadesinin karşılığıdır. Yalnız bilmemiz gereken önemli bir kural normal bir kodlama esnasında bir değişkeni bir değere eşitlik ifadesi ile değer veremezsiniz. Eşitlik ifadesi genelde karşılaştırma operatörleri ile beraber kullanılır.

int x; x==5;

Metotlar içinde sadece karşılaştırma işlemi yapılırken kullanılabilir.

if(X==5) { //Kodlar }

111


Böyle bir kullanım şekli yoktur. Kodlar içinde yaptığımız işlem her daim atama işlemi olacaktır. Peki, nerede kullanacağız biz bu ifadeyi? Örneğin X e program boyunca değerler atandı. En sonda X in değerine göre bir işlem yapacağız. İşte böyle bir durumda x eşit mi 5 e sorusunu sorar ve eğer 5 e eşitse o if ifadesi geriye true değerini dönecektir.

Kullanımı aşağıdaki gibidir genelde.

o

Büyük ve Küçük Operatörleri

C# da bir değerin farklı bir değerden büyüklüğünü > (büyüktür) operatörünü kullanarak karşılaştırabiliriz. Bu ifadenin de tek başına kullanımı yoktur. Sadece şart ifadesi içinde kullanılabilir. Küçük operatörü < (küçüktür) şeklindedir.

112


o

Büyük Eşit ve Küçük Eşit Operatörleri

Büyük eşit >= (Büyük Eşit) şeklinde kullanılır. Küçük eşit <= (Küçük Eşit) şekliden kullanılır.

o

Kalan Bulma Operatörü

İki sayının bölümünden kalanı bulmak istediğimiz durumlarda kullanabileceğimiz operatör % (Yüzde) kalan bulma ifadesidir.

X=5%2;

Dediğimizde bize 1 değerini geri dönecektir. o

Toplama Çıkarma Çarpma Bölme Operatörleri

Topla : (+) Topla operatörümüzdür. Sayısal ifadeler için normal matematiksel toplama işlemini gerçekleştirirken string ifadelerde birleştirme işlemini gerçekleştirecektir.

int A=10+20;

Bu ifadenin eşiti 30’dur.

string A="10"+"20";

Bu ifade geriye string olarak 1020 değerini döndürecektir. Çıkar : (-) Çıkar operatörümüzdür. Matematiksel ifadeler için bir anlamı vardır sadece. Matematikteki çıkarma işlemini gerçekleştirir. Bir sayının önüne getirilerek o sayının negatif değer alması da sağlanabilir.

Çarp : (*) Çarpma işlemi operatörümüzdür. Matematiksel çarpma işlemi gerçekleştirir. Sadece sayısal değerler için bir anlamı vardır.

Bölme : (/) Bölme işlemi operatörümüzdür. Matematiksel bölme işlemini gerçekleştirir. Sadece sayısal değerler için bir anlamı vardır.

113


o

Üs Alma

C# da üs alma işlemini Math sınıfının Pow metodu ile yapmanızda fayda vardır. Hataları en az düzeye indirmiş olursunuz.

Math.Pow(Üssü Alınacak Değer, Üs Alınacak Değer);

Şeklinde bir kullanımı mevcuttur.

x=Math.Pow(3,2);

Bu işlem bize 9 değerini geri dönecektir

✓ Mantıksal Operatörler Mantık ifadelerinden bildiğimiz Ve, Veya ifadeleri C#’da da vardır. Matematiksel anlamdaki kullanımları ile aynı değerleri ifade ederler. o

Bitsel Ve : (&) Tek başına yaptığımız & işareti mantıksal ve işlemini ifade eder. Yapılan işlemler bit seviyesindedir. Yani verilen değerlerin bit değerleri arasında karşılaştırma yapılır. Sonuçlar o bitlerden gelen 1 ve 0 durumlarına göre karşılaştırılır.

private void button1_Click(object sender, EventArgs e) { string A = "Murat", B = "Murat"; if (A == B & B == A) { MessageBox.Show("Test"); } }

o

Bitsel Veya : (|) bu işlemde mantıksal veya ifadesidir. Değerlendirme şekli olarak mantıksal ve ifadesinden farkı yoktur.

114


o

Mantıksal Ve : (&&) İki tane yan yana ve işareti ile gerçekleştirilir. Değerlerin o anki tiplerinde karşılaştırma yapılır.

private void button1_Click(object sender, EventArgs e) { string A = "Murat", B = "Murat"; if (A == B && B == A) { MessageBox.Show("Test"); } }

o

Mantıksal Veya : (||) şeklinde kullanılır.

private void button1_Click(object sender, EventArgs e) { string A = "Murat", B = "Murat"; if (A == B || B == A) { MessageBox.Show("Test"); } }

o

Eşit Değil : (!=)

İfade eşitsizliği ifade eder. Bu ifadede bir değişkene değer ataması şeklinde bir kullanımı söz konusu değildir. Ancak karşılaştırma operatörü olarak kullanılabilir. ! İfadesi tek başına (değili) anlamını taşır. Yani önüne geldiği bir işlemin değilini kontrol eder. Eşitlik önüne gelince eşit değili. Büyüktür önüne gelirse büyük değili kontrol eder.

115


o

Sağa Ötele : (>>) Bu ifade ile yaparız. İlk baktığımızda sağa ötelemek tam bir anlam ifade etmiyor gibi gelebilir. Bir örnekle ne yaptığını açıklayalım.

int A=5; A=A>>5;

Bu işlem şunu yapacaktır. 5 değerini 25 değerine böler ve sonucu A değişkenine atayacaktır. Sonuç int türünde tanımlama yaptığımız içinde 0 olacaktır. Bir örnek daha yapalım. Değerinin 25 olduğu A değerini 3 sağa öteleyiniz.

private void button1_Click(object sender, EventArgs e) { int A = 25; A = A << 3; label1.Text = A.ToString(); }

Ne yaptığına bakalım. A= 25; 23 =8 A=A>>3 ün anlamı A=A/23 =8 Buda bize 25/8 den 3 değerini dönecektir. Çünkü tanımlamamız integer’dır. Öteleme işlemlerini double gibi ondalıklı sayı veri tipleri ile beraber kullanamazsınız.

116


o

Sola Ötele : (<<) İfadesi ile gerçekleştirilir. Hemen bir örnek ile olayı açıklayalım.

int A=5; A=A<<6;

Sola ötelemenin anlamı: A=5; A=A<<6; A=5*26

Sola ötelemenin anlamı da budur. Değişken değeri çarpı girilen sayının 2’nin kuvveti şeklinde yaz ve çarp.

private void button1_Click(object sender, EventArgs e) { int A = 25; A = A<<3; label1.Text = A.ToString(); }

117


o

Özel Veya : (^) şeklinde kullanılan operatördür. Bu operatör karşılaştırılan verilerin karşılıklı basamakları farklıysa ilgili basamağında 1 tutar, diğer durumlarda 0 tutar.

Bitsel operatörler aritmetik operatörler ve karşılaştırma operatörlerinden düşük önceliklidir fakat bu operatörler aynı satırda olduklarında aralarındaki öncelik sıralaması &(bitsel ve), ^ (bitsel özel veya), |(bitsel veya) şeklindedir. o

?: Operatörü: Bu operatör tek başına if else gibi davranabilir. C# da 3 operand alan tek operatördür.

koşul ? doğru_değer : yanlış değer

int B; private void button1_Click(object sender, EventArgs e) { int A = 5; B = (A == 5) ? 5 : 6; label1.Text = B.ToString(); }

118


Burada unutmamanız gereken B değerinin lokal değil Global tanımlaması gerektiğidir.

119


23 Karar Yapıları Günlük hayatımızda olduğu gibi, program yazarken de pek çok durumla karşılaşıp oluşan şartlara ve durumlara göre pek çok kararı aldırmamız gerekir. İşte böyle durumlarda imdadımıza yetişen yapılardır. o

Temel Anlamda Kullanımı

if(Şart) { //Kodlar } else if(Şart) { //Kodlar } else { //Kodlar }

Bunu hemen bir örnek ile gerçekleyelim ve tam olarak ne anlattığını bu ifadelerin öyle bakalım.

✓ Proje Tanımı 1 den 12 ye kadar 12 dâhil kullanıcıdan alınan sayıya göre bulunduğu mevsimi söyleyen bir C# programı yazalım.

İşte yapacağımız programın ara yüz tasarımı. Yavaş yavaş programlamaya da adım atıyoruz.

120


using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Karar_Yapıları { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int X1; X1 = int.Parse(textBox1.Text); if (X1>0 && X1<=2) { label3.Text = "Kış Mevsimi"; } else if (X1<=5) { label3.Text = "İlkbahar Mevsimi"; } else if (X1<=8) { label3.Text = "Yaz Mevsimi"; } else if (X1<=11) { label3.Text = "Sonbahar Mevsimi"; } else if (X1==12) { label3.Text = "Kıs Mevsimi"; } else { label3.Text = "Aralık Dışında Bir Sayı"; } } } }

121


Adım adım inceleyelim. Karar yapılarında işlem yaparken öncelikle ilk şartımız yazılır. Bunu if ifadesi ile yaparız.

if (X1>0 && X1<=2) { label3.Text = “Kış Mevsimi”; }

122


Girilen değerin öncelikle 0 dan büyük olması şartına bakıyoruz. Daha sonra && mantıksal operatörünü kullanıyoruz. Bir önceki dersimizde anlatmıştık bu operatörleri. X1<=2 x1 değeri 2 ye eşit veya küçük ise bu değer doğru olarak kabul edilir ve TRUE olarak geri döner. if ifadesinde şart geriye True değerini dönerse if şartının blokları içine yazdığımız kodlar çalışır. İf yapısında bir tane değer gerçeklendiğinde diğer değerlerin hiç biri kontrol edilmez. Yani böyle bir durumda şart sağlandığı için 1. adımda işlem sona erer. Eğer şart sağlanmaz ise diğer satıra geçilir.

else if (X1<=5) { label3.Text = “İlkbahar Mevsimi”; }

X1 e 4 değerinin girildiğini varsayarsak ilk if ifadesi false döneceği için bir alt satırdaki else if bloğuna geçiş olur o şarta bakılır. Böyle bir durumda 4 5 den küçük olduğu için true olur ve kodlar gerçeklenir. Eğer bu şartta sağlanmasaydı bir altındaki şart ifadelerine bakılacaktı. Ele alabileceğimiz tüm şartları yazdık ama bunların tamamen dışında olması ihtimali olan durumlar içinde en sonda else ifadesi kullanılır. Hiç bir şart sağlanmazsa buraya girilir ve buradaki kodlar gerçeklenir. İşte kısaca if yapısı ve çalışma mantığı böyledir.

Kod Yazarken İpucu 1

Eğer if ifadesinin gerçekleyeceği kod satırı sadece bir ise Scop ({ ) kod bloklarını kullanmanıza gerek yoktur. Ama kod okunurluğu açısından kullanılmasında fayda vardır. Böyle de yazılabilirdi.

if (X1>0 && X1<=2) label3.Text = "Kış Mevsimi"; else if (X1<=5) label3.Text = "İlkbahar Mevsimi";

123


Kod Yazarken İpucu 2

Kodlama esnasında if bloklarını otomatik olarak oluşturmak için yapmanız gereken şey if, else if ya da else yazdıktan sonra tab tuşuna art arda iki kere basmaktır.

if (true) { }

Sizin için şu formatta hemen yapıyı hazırlayacaktır. Çalışma Soruları Soru 1: Klavyeden öğrencinin vize ve final not bilgisi girildikten sonra, ortalama 60 ve üzerinde ise ekrana “Geçti” değilse “Kaldı” bilgisini hangi not ile geçip hangi not ile kaldığını söyleyen C# Programını yazınız. Soru 2: Bir adet kullanıcı adı ve şifre tanımlaması yaptığınız programa dışarıdan istediğiniz kullanıcı adı ve şifre ile giriş yapmasını sağlayınız. Eğer şifre ve kullanıcı adı doğru ise giriş başarılı değilse şifre veya kullanıcı adı yanlıştır mesajını kullanıcıya gösterdiğiniz bir C# Uygulaması yazınız.

124


24 For Döngüsü Programlamanın belki de en temel amacını gerçekleyen konusudur döngüler. Çünkü bilgisayar programları, bir dizi aynı işlemi kodlar sayesinde tekrar tekrar yaparak insanların hem güçlerinden, hem de zamanlarından tasarruf etmelerini sağlayan yapılardır. Döngüler belli sınırlama şartları sağlanana kadar belli kod satırlarını tekrar tekrar çalıştıran kod parçacıklarıdır.

✓ Genel Kullanım for(Değişken=Başlangıç Değeri; Değişken Durum Şartı, Değişkenin Değişme Aralığı) Böyle anlatınca karışık gibi gelebilir. Hemen örneğimiz üzerinde görelim.

for (int i = 0; i < 5; { // Kodlar }

i++)

İlk olarak döngümüzün şartını tutacak bir değişken tanımlaması yapıyoruz. int i tanımlaması ile bunu gerçekleştirmiş oluyoruz.

125


Aklımıza şöyle bir soru gelebilir. Tanımlamayı illa for döngüsü içinde yapmak zorunda mıyız? Tabi ki hayır. Bu tanımlamayı isterseniz metot içinde lokal bir değişken olarak yada sınıf içinde tanımlayarak global bir değişken olarak da kullanabilirdiniz.

private void Form1_Load(object sender, EventArgs e) { int i; for (i = 0; i < 5; i++) {

Bu şekilde bir tanımlama sonucunda i değişkeni döngü bittiği andaki değeri ile o metot içinde kullanılabilecektir.

Ama sadece for döngüsü için tanımlanmış bir i değişkeni metot içinde kullanılamayacaktır. Yada sınıf içinde global bir değişken olarak tanımlayabiliriz.

namespace For_Döngüsü { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int i; private void Form1_Load(object sender, EventArgs e) { for ( i = 0; i < 5; i++) { } } } }

126


Böyle bir tanımlama sonucunda tüm class içinde i değişkeni son değeri ile kullanılabilir. Değerine başka bir metot içinde müdahale edilebilir.

Daha sonra bir başlangıç değeri veriyoruz değerimize. int i=0; Bu noktada bu işlemi gerçekleştirmiş olduk. Bir sonraki kısım Şart belirleme kısmı. i<5 Burada söylediğimiz şey i değeri 5 den küçük olduğu sürece bu for döngüsü çalışsındır. Son kısımda ise i++ for döngüsünün değişiminin nasıl gerçekleşeceğini söylemiş olduk.

C# da Değişken_İsmi++ gibi bir ifade ifadenin bir artırılmasını sağlar. Yani i’nin yeni değeri 1 artırılarak elde edilecektir. Burada şartları da değişim aralığını da istediğiniz gibi belirleyebilirsiniz.

İ = i + 1; yazmak ile i++; yazmak arasında hiç bir fark yoktur.

for (int i = 0; i < 5; i=i+1 ) { // Kodlar }

İstenirse döngü içindeki değerin değişim aralığı böylede belirlenebilir.

127


✓ For Döngüsü Kullanımları o

Değişkenin Değerini Döngü İçinde Değiştirme

Temel kullanımdan farklı olarak For döngüsünün pek çok kullanım şekli vardır. Onlardan biri değişkenin değişim aralığının for döngüsünün ilk tanımlaması sırasında değil kodlar içinde yapabildiğimiz kullanımdır.

for (int i = 0; i < 5; ) { // Kodlar i = i + 2; }

Yapıya dikkatle baktığımızda değişim kısmı for ilk tanımlama kısmında yoktur. Burada dikkat etmemiz gereken şart ifadesinden sonra noktalı virgülün konduğudur. İ değeri içerde 2 artırılarak yeni değerine ulaşmıştır. o

Değişkenin Başlangıç Değerinin Dışarda Tanımlanması

Değişkenimize ilk değeri metot ya da sınıf içinde verebiliriz.

private void Form1_Load(object sender, EventArgs e) { int i = 0; for (; i < 5; ) { // Kodlar i = i + 2; } }

Burada unutmamanız gereken başlangıç değeri girilmiş gibi noktalı virgülü koyuyoruz.

128


o

Sonsuz Döngü Oluşturma

Çok istenilen ve mantıklı bir adım olmamakla birlikte bir sınırı olmayan sonsuz döngülerde kullanılabilmektedir. Böyle bir döngü oluşturup döngünün içinde kontrolü ve durdurma işlemini gerçekleştirmezseniz büyük ihtimal programınız donacaktır.

for (; ;) { }

Böyle bir sonsuz döngüyü if komutu içinde bir break komutuyla sonlandırıp programın çalışamaz hale gelmesini önlememiz gerekir. Bir sonraki derslerimizde bunların üzerinde duracağız. o

Birden Fazla Değişken Birden Fazla Şart

Bir for döngüsünü 2 veya daha fazla değişkenle kontrol edebiliriz.

for (int i = 0, j = 0; i < 5 && j < 10; i++, j = j + 2) { } for (int i = 0, j = 0, n = 0; (i < 5 && j < 10) || n < 15; i++, j = j + 2, n = n + 5) { }

✓ Proje Tanımı Bir listbox içine 1 den 10 a kadar sayıları sırası ile yazdıralım. Bu noktada for döngüsünü bilmiyor olsaydık yapacağımız işlemi görelim.

129


private void button1_Click(object sender, EventArgs e) { listBox1.Items.Add(1); listBox1.Items.Add(2); listBox1.Items.Add(3); listBox1.Items.Add(4); listBox1.Items.Add(5); listBox1.Items.Add(6); listBox1.Items.Add(7); listBox1.Items.Add(8); listBox1.Items.Add(9); listBox1.Items.Add(10); }

Gördüğümüz gibi yazdırdı. Ama ne kadar mantıklı duruyor bu kodlama onu sorguladığımızda çokta mantıklı olmadığı kanısına kolayca varabiliriz.

Böyle bir kodlamanın kusurlarını sıralayacak olursak; Tüm değerler static bu değerlerle dinamik işleri yapmanın imkanı yok. Yani programın her anında ne olacağını net bilmemizi gerektirir. Eğer bunu yapabilirsek tümü static olan değerlerimizle işlem yapabiliriz. Static kelimesinin anlamı sabit değer demektir. Yani programın her yerinde son değeri ile kullanılmasını sağlayacak değerler. Yazdırılacak ifade 10 tane belki 100 tane ise bir noktaya kadar mantıklı olduğunu düşünebiliriz. Ama yazdıracağımız kayıt 1 milyon tane olsa. Olmaz demeyin büyük firmaların kendi yapılarında tuttukları kayıt sayıları için 1 milyon 2 milyon gibi değerler basit değerler. İşte böyle bir durum için iş işin içinden çıkılmaz bir hal alacaktır. Aynı zamanda bu bir kod hamallığıdır. Yazdığınız bir programın kalitesini, değerini ya da işlevselliğini yazmış olduğunuz fazla kod sayısıyla ölçmeniz bir uçağın ağırlığı ile övünmenize benzer ki bu nereden baksanız tutarsız bir davranıştır. For döngüsü yerine böyle kod hamallığı yaparak çok uzun satırlar kodladım demekte aynı tutarsızlığa sahiptir.

130


Şu işlemi nasıl iki satır kodlama ile gerçekleştirebileceğimize bakalım.

private void button1_Click(object sender, EventArgs e) { for (int i = 1; i < 11; i++) { listBox1.Items.Add(i); } }

✓ Kod Açıklaması (Algoritma) i değerinin 1 den başlayacağını ve 11 den küçük olduğu sürece bu döngünün tekrar edeceğini ve i değerinin her döngü sonunda 1 artacağını söyleyerek basitçe döngümüzü oluşturmuş olduk arkadaşlar. Böyle bir kodlamayla değil 1 000 000, 10 000 000 kayıt bile geri dönebilirsiniz. For döngüsü bunu sizin yerinize yapacaktır. Yukarıdaki kodlamayla aynı işlemi yapacak ama bazen kafaları karıştırabilen bir örnek kodlama göstereyim

private void button1_Click(object sender, EventArgs e) { for (int i = 1; i <= 10; i++) { listBox1.Items.Add(i); } }

131


Farkı şudur, şartta kullandığımız <= ifadesi. Eğer gitmek istediğimiz en son değer için <= ya da >= gibi bir ifade ile yazarsam belirtilen son değere eşitlik veririz. Yani burada 10 oldu. Ama bir önceki kodlamada olduğu gibi sadece < ya da > olarak ifade edeceksek gitmek istediğimiz değerin 1 öncesini ya da 1 sonrasını yazmamız gerekecektir. İlk kodlamada 11 yazdığımız gibi. Şimdi belki bunu anlayamayacak ya da bunda dipnot düşülecek ne var gibi bir şey gelebilir aklınıza. İleride i şartının gideceği değeri bir değişkenden aldığınızda o değişkenin değerini direk olarak kodlama anında bilemeyeceğiniz için bir hatırlatıcı olarak bunu yazmak istedim. Bir Caps’i de buraya bırakalım ☺

Bir örnek de i’nin şartını bir değişkene bağlı olarak aldığı bir for döngüsü yazalım. o

TextBox’dan aldığınız bir ifadenin karakterlerini tek tek ListBox’a yazdırınız.

Aynı kodlamanın 3 Halini paylaşacağım. Birincisi açıklama satırlarıyla. İkincisi temiz haliyle. Üçüncüsü de aynı kodlamayı daha kısa nasıl yapabilirdi ki gösterdiğim kodlama olacak.

132


Açıklama Satırlı

private void button1_Click(object sender, EventArgs e) { string Kelime; int Length; Kelime = TextIfade.Text; // Yukarıda gördüğümüz iki satırı şu şekilde tek satır olarakda yazabilirdik. // string Kelime = TextIfade.Text; // Değişkenin global olmadığı yerde İkiside tercih edilebilir. Length = Kelime.Length; // Length bir ifadenin karakter olarak uzunluğunu verir. // Unutmamamız gereken şey C# da sayma işlemi 0 dan başlar. for (int i = 0; i < Length; i++) { ListBoxKarakter.Items.Add(Kelime[i]); } }

Temiz Kod

private void button1_Click(object sender, EventArgs e) { string Kelime; int Length; Kelime = TextIfade.Text; Length = Kelime.Length; for (int i = 0; i < Length; i++) { ListBoxKarakter.Items.Add(Kelime[i]); } }

Daha Kısa Kod

private void button1_Click(object sender, EventArgs e) { string Kelime = TextIfade.Text; int Length = Kelime.Length; for (int i = 0; i < Length; i++) { ListBoxKarakter.Items.Add(Kelime[i]); } }

133


Daha da Kısa Kodlama

private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < TextIfade.Text.Length; i++) { ListBoxKarakter.Items.Add(TextIfade.Text[i]); } }

Son paylaştığım en kısa haliyle de kodlanabilir. Ama bunu şu sebepten tercih etmeyebiliriz. Kodları uzun süre sonra tekrar okumak istediğimizde kod okunurluğu, anlaşılırlığı açısından bazen sorunlar çıkarabilecek bir kısaltma şeklidir. Bir diğer sebebi değişkenlere atama yapılmadığı için değerleri programın farklı yerlerinde kullanma olasılığını ortadan kaldırmaktadır. Bir ekran çıktısını görüp sonrada kısaca kodları açıklayalım.

✓ Kod Açıklaması (Algoritma) Öncelikle Kelime isminde bir değişken tanımladık. Bu değişkene TextBox’a kullanıcı tarafından girilecek değeri atadık. Bilmemiz gereken olaylardan biride her string değer bir char dizisini ifade eder. Length: Bir dizinin eleman sayısını bulmak için kullandığımız bir Property’dir (Özelliktir). Metot değildir. Yukarıda da söylediğim gibi Kelime değişkeni bir string ifade ve bir karakter dizisini oluşturur. Kelime.Length ile kaç karakter barındırdığını bulmuş olduk. Yani dizinin uzunluğunu.

134


Örneğin Kelime’ye gelen değer ABCDE olsaydı. Length özelliği geriye 5 değerini dönecekti. Daha sonra for döngüsü başladı. i değerini 0’dan başlattık. Yani ABCDE gibi bir karakter dizinin ilk elemanını almak istersem bu dizinin 1. elemanı değil 0. elemanını istememle gerçekleşecektir. Kelime[0] bize A değerini geri dönecektir. Kelime[1] B değerini dönecektir. Vs. Şimdi asıl olay şart kısmında. Kullanıcının ne kadar uzunlukta bir değer gireceğini bilmediğimiz için static olarak şu değere kadar dön demek pek mantıklı olmayacaktır. Bir kişi 1 000 000 uzunluğunda bir değer giremez gibi bir öngörüde bulunup şartı i<1 000 000 olarak yapsaydık ne olurdu? Bu durumda yazdığımız kod runtime(çalışma zamanı) hatası verecekti. Neden? Çünkü Kelime dizisinin uzunluğu 5’di ve 6. kaydı istediğimizde, olmadığı için bulamayacak ve index dizin sınırları dışındaydı gibi bir hata alacaktık. İkinci bir sorun ise 5 karakterlik bir set için 1 000 000 kere döngünün dönmesini istemek de pek akıl karı olmayacaktır. Bize ciddi performans kayıplarına neden olacaktır. O yüzden dinamik olarak Kelime dizisinin uzunluğu ne kadarsa, for döngüsünün o kadar dönmesini sağlamak için şartı dinamik bir değişkene bağladık. i<Length ifadesi bunu sağladı. Artık girilen değer 10 karakterse for 10 kere dönecektir. 100 karakterse 100 kere dönecektir.

135


25 While Döngüsü While döngüsü aynen for döngüsünde olduğu gibi birden çok kez tekrar edecek kodlarımızı çalıştırmak için kullandığımız döngü yapılarından bir tanesidir.

o Genel Kullanım while(Şart) { // Kodlar }

Basit bir yapısı vardır aslında. While şartı true olarak sağlandığı sürece While döngüsü çalışmaya devam edecek, blokları arasındaki kodlar tekrar edilecektir.

o Döngü Sonlandırma While döngüsü, for döngüsündeki gibi şart başlangıçta verilmez. Şartı sağlayan değer içerde kontrol edilir. Durumu değiştirilir. Buna göre de her adım sonunda while bu şarta tekrar bakar eğer doğru ise döngü çalışmaya devam eder. Döngü şartının dışına çıktığımız anda döngü sonlanacaktır.

private void button1_Click(object sender, EventArgs e) { int i = 0; while (i<10) { i = i + 1; MessageBox.Show("" + i); } }

136


✓ Kod Açıklaması( Algoritma) Yukarıdaki kodlara adım adım göz atalım. Öncelikle bir değer tanımlaması yapıldı. i=0 olarak. Daha sonra While döngüsüne girildi. i’nin değeri 10 dan küçük mü diye bir kontrol yapıldı. (TRUE) Evet ilk kontrolde doğru. O zaman döngü kodlarını gerçeklemek için bloklar içine girdi. İlk olarak i’nin değerini 1 artırdı. Artık i=1. Daha sonra gelen bu değeri mesaj olarak ekranda gösterdi. Son kodun artından While şartına geri dönüp tekrar kontrol edecektir.

Bu işlem bu şekilde i’nin 10 a eşit olup döngü şartını sağlamadığı ana kadar devam edecektir.

✓ Sonsuz Döngü Oluşturmak Sonsuz döngülerin oluşturulmasını tavsiye etmemekle beraber ama nasıl yapıldığını göstermekte fayda olduğunu düşünüyorum. Bir While döngüsünün sonsuz döngü oluşturmasını istiyorsanız 2 yöntem göstereceğim.

137


o

1. Yöntem

while(true) { //Kodlar }

Aynı burada olduğu gibi While şartının içine true ifadesini yazarsanız içerde döngüyü break etmediğiniz sürece bu döngü sonsuz döngü olacaktır. o

2. Yöntem

int i=0; while(i<10) { //Kodlar }

Bu şekilde i değerini içerde herhangi bir değişikliğe uğratmaz isem bu döngüde bir sonsuz döngü olacaktır. Sizlere burada bir kısa yol söylemek istiyorum. Visual Studio üzerinde kodlama yaparken While yazıp iki kere art arda TAB butonuna basarsanız otomatik olarak Studio size While yapısını oluşturacaktır.

while (true) { }

1 tane örnekle While döngüsünün işleyişini kavramaya çalışacağız.

138


✓ Proje Tanımı Dışarıdan girilen n değerinin faktöriyel hesabını yapan programı While Döngüsü kullanarak yazınız.

✓ Proje Tasarım

139


using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace While_Faktรถriyel_Hesaplama { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void BtnFaktรถriyel_Click(object sender, EventArgs e) { int faktoriyel = 1, n = 0, i = 1; n = Convert.ToInt32(TextDeger.Text); if(n==0 || n==1) { faktoriyel = 1; } else { while (i<=n) { faktoriyel *= i; i++; } } LblSonuc.Text = n + "!="; TextSonuc.Text = faktoriyel.ToString(); } } }

140


✓ Kod Açıklaması( Algoritma) Şimdi öncelikle şunu yapabiliriz. Böyle bir programı yazmaya başlamadan önce kâğıt üzerinde sistemi çizebiliriz. Bu problemin algoritma oluşturma evresidir. Bunu yapmak büyük ölçüde daha kolay ve çabuk yol almamızı sağlayacaktır. Söz uçar yazı kalır burada da geçerlidir. Algoritmalarınızı yazarak oluşturmanız her aşamayı kontrol etme olasılığı da sağlayacaktır.

✓ Düşünme Aşaması Faktöriyel hesabı girilen sayının 1’den kendisine kadar olan kendisi de dahil tüm sayıların çarpımıdır.

N=3 olsa. 3*2*1= 6 olacaktır. Aynı zamdan 2 tanede özel durum var 0! ve 1! in eşiti 1 dir. O zaman bunu ayrıca değerlendirmem gerekecek. Bu şart durumu bir önceki derslerde öğrendiğimiz if else yapısını kullanacağımızın haberini veriyor bize. N değerini tutacak bir değişken olmalı. Döngüyü sağlayacak ve her defasında 1 artımıyla çarpıma girecek i gibi bir değişkene ihtiyacım var.

Çarpıma girecek bir değişkenin ilk değeri çarpımın etkisiz elemanı 1 olmalıdır. Aynı durum toplam için 0 dır.

141


✓ Kod Açıklaması( Algoritma) •

int faktoriyel = 1, n = 0, i = 1;

n dışarıdan gelecek değeri tutacak o yüzden ilk değer verilmese de sorun olmayacaktır. i döngünü hem şartını sağlayacak hem de çarpıma girecek değerdir. faktöriyel : faktöriyel sonucunu tutacaktır. •

n = Convert.ToInt32(TextDeger.Text);

Dışarıdan gelen değeri n değişkenine aldık. Bu işlemi yaparken tür dönüşümünü gerçekleştirdik. •

if(n==0 || n==1) { faktoriyel = 1; }

Bahsettiğimiz şart kısmı eğer n dışarıdan 0 ya da 1 geldi ise herhangi bir döngüye girmesine gerek yok. Faktöriyel değeri 1 olacaktır. Eğer n 0 ya da 1 gelmez ise diğer tüm şartlar else olarak ifade edilebilir. Tabi burada şu özellikte programa bir kontrol mekanizması olarak konulabilir. Negatif değerlerin faktöriyeli hesaplanmak istenmiyorsa n>1 şartı ile else if kodları arasında farklı bir şart yazılabilir. Else kısmı da istemediğimiz aralığı ifade edeceği için sayı aralık dışındaydı gibi bir uyarı verilebilir o kısımda. Bu size kalmış. Biz burada şimdilik bu kontrol mekanizmasına gerek duymadık. •

else { while (i<=n) { faktoriyel *= i; i++; } }

Else içine girdiğinde bizim bugünkü konumuz olan while döngüsüne erişmiş olduk. i=1 n=3’dü. While döngüsüne girdi ve 1<=3 mü diye kontrol etti. Bu durum doğrudur. Geriye True değerini döndürür. Doğru olduğu için while blokları içine girecektir. faktöriyel*=i durumu faktöriyel = faktöriyel * i değeri ile aynı durumu ifade eder. İlk işlem sonunda faktöriyel = 1 * 1 işleminden 1 değerini alacaktır. Bir adım sonra i değeri 1 artırılmış 2 olmuştur.

142


Kod blogu sona erdi. Tekrar şarta bakacaktır. 2<=3 mü bu durumda sağlandı öyleyse bir önceki adımın aynısı tekrarlanacaktır. i=2 olduğu için. 1*2 değerinden yeni faktöriyel değeri 2 olacaktır. i=3 oldu. Tekrar şarta baktı. 3<=3 mü evet buda doğru. Tekrar aynı işlemler. Faktöriyel = 3*2 = 6 olacaktır. i=4 oldu. 4<=3 mü sorusunun cevabı False değerini döneceği için artık while döngüsünü bitirecek ve aşağıya doğru kodları işlemeye devam edecektir. •

LblSonuc.Text = n + “!=”; TextSonuc.Text = faktoriyel.ToString();

143


Bu kısımda sonucun kullanıcıya gösterildiği kısımdır.

144


26 Do While Döngüsü While döngüsü varken niçin birde Do While döngüsüne ihtiyaç duymuş olabilirler? Çünkü bazı durumlarda döngü şartı sağlansa da sağlanmasada döngü bir kere mutlaka çalışsın isteriz. Böyle durumlarda kullanacağımız yöntem Do While döngüsü olacaktır.

o Genel Yapı do { // Kodlar } while(Şart);

o Sistem Nasıl Çalışır Döngü şartına bakmaksızın do while blokları içindeki kodlar çalıştırılır. Sonra şart kontrol edilir. Eğer şart doğru ise döngü tekrar eder. Şartın sağlanmadığı anda döngüde bitmiş olacaktır.

✓ Proje Tanımı 0 dan başlayıp 10 kadar tüm değerleri alt alta ListBox’a yazdırınız.

namespace Do_While_Döngüsü_1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int i = 0; do { listBox1.Items.Add(i); i++; } while (i<=10); } } }

145


Şimdi olayı tam olarak anlamak için şunu yapacağım. Şartı 0 dan büyükse olarak değiştireceğim.

Gördüğünüz gibi sonuç ekranında sadece 0 yazıyor. Buradan da anladığımız üzere do while da ilk işlem şarttan bağımsız gerçekleşmektedir. Visual Studio üzerinde do yazdıktan sonra iki kere TAB tuşuna basarsanız Studio sizin için genel do while yapısını oluşturacaktır.

do { } while (true);

146


25 Struct (Yapılar) ✓ Struct Nedir? Struct Türkçe karşılığı yapıdır. Yapılar C# da bir nesneyi temsil eden veri tipidir. Şimdiye kadar gördüğümüz int, short, byte gibi tüm veri tipleri aslında bir yapıdır. Yapılar object sınıfından türeyen birer nesnedirler. Her nesnenin sahip olduğu özelliklere de sahiptiler. İçerinde field(değişken), metotlar bulunabilir. Böyle bakıldığında sınıf yapısına çok benzer özellik göstermektedir. Ama bazı işlerimizde sınıf yapısını kullanmak programımızı hantallaştırabilir. Bu gibi durumlarda imdadımıza yetişen nesne struct’dır. Daha çok şu sebeple kullanılabilir. Aynı grup verileri bir arada tutma. Metotlarını bir arada tutmak için kullanılır. Bu hem kod okunurluğunu, hem kod yazma hızınızı hem de programınızın performansını artıracaktır.

o Genel Yapı struct YapıAdı { // Yapının Elemanları }

o Yapı Örneği Olayı daha iyi anlayabilmek için bir senaryo düşünelim. Bir insan kaynakları projesi yazıyorsunuz. En nihayetinde programın bir yerinde mutlaka kişilere ait bilgileri almanız gerekecek. 3 tane bilgisini alalım. PersonelNo, Adı, Soyadı. PersonelNo ile herhangi bir matematiksel işlem yapmayacağımız için o değerde string olduğunu varsayalım. Şimdiye kadar bildiğimiz yöntemde bu değişkenleri tanımlayacak ve değer ataması yapacak olsaydım şunu yapardım.

string PersonelNo; string Adi; string Soyadi; PersonelNo="11111"; Adi="Murat"; Soyadi="Bilginer";

Şeklinde olacaktı.

147


Şimdi bunu birde struct kullanarak yapalım. Sonrada faydaları nelerdir avantajları nelerdir bundan bahsedelim.

using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Structs_Yapısı { public partial class Form1 : Form { public Form1() { InitializeComponent(); } struct Personel { public string PersonelNo; public string Adi; public string Soyadi; } private void button1_Click(object sender, EventArgs e) { Personel PersonelBilgi = new Personel(); PersonelBilgi.PersonelNo = "11111"; PersonelBilgi.Adi = "Murat"; PersonelBilgi.Soyadi = "Bilginer"; } } }

148


✓ Kod Açıklaması( Algoritma) Öncelikle bahsettiğim 3 değişkenin nasıl bir grup oluşturduğuna karar verdim. Bu 3 değişken Personel yapısı altında ortak bir yapıda tutulabilir. • •

Yapılar bir sınıf gibi tanımlanırlar. Metotlar içinde struct tanımlaması yapamazsınız.

Bizde aşağıdaki kısımda bunu gerçekleştirdik. •

struct Personel { public string PersonelNo; public string Adi; public string Soyadi; }

struct tanımlama cümlesi sonra karar verdiğimiz yapı ismi(Personel) daha sonrada elemanlarını tanımladık. Burada önemli bir noktada şudur tanımlama geçerlilik aralığını belirleyen public ifadesi. Kural belirtmeden direk tanımlanırsa Default değeri Private’dır. Metotlar içinde bu değişkenlere erişebilmek için public ya da internal tanımlaması yapılmalıdır. •

private void button1_Click(object sender, EventArgs e) { Personel PersonelBilgi = new Personel(); PersonelBilgi.PersonelNo = “11111”; PersonelBilgi.Adi = “Murat”; PersonelBilgi.Soyadi = “Bilginer”; }

Personel yapısını kullanabilmek için ileriki derslerde göreceğimiz sınıflardaki gibi öncelikle o yapıdan bir nesne türetilir. Bu türetilen nesneye istediğiniz adı verebilirsiniz. Nesne ismi ile içindeki değişkenlere ulaşıp değer ataması yapabilirsiniz. Sadece değer ataması değil atanmış değerleri de çağırabilirsiniz.

✓ Yapıların Özellikleri • • • •

Yapılar diğer nesneler gibi object sınıfından türerler. Kalıtımı desteklemez ( Bu konu ileride detaylı işlenecektir) Değerlerini kullanabilmek için new anahtar sözcüğü ile yapının bir nesnesi örneği oluşturulabilir. Ancak sınıflardan ayıran bir özelliği de budur new anahtar sözcüğü kullanmadan da yapılar tanımlanabilir.

Bunu hemen örneklemek gerekirse ilk başta bahsettiğim gibi yapılarda int, Byte gibi bir veri tipidir. int a; // Böyle bir tanımlama yapılabildiği gibi Personel PersonelBilgisi; // Şeklinde struct yapısından bir değişken türetilebilir.

149


• • • •

Yapılar değer tiplidirler. Bu yüzden RAM’de Stack bölgesinde bulunurlar. Erişim ve kullanımları hızlıdır. Kullanımları bittiği anda bellekten silinirler.

Sınıf yapısı ile hemen hemen aynıdır. Ama basit değişken işlemlerimizde struct kullanmak avantajlıdır. Çünkü sınıflar referans tipli değişkenlerdir. Ve RAM’de Heap alanında saklanırlar. Bu değerlere ulaşmak Stack alanındaki bir değere ulaşmaktan daha yavaştır. Bu sebeple structlar basit değişken tanımlama işlerinde sınıf yapılarının önüne geçmektedir.

150


27 Enum Yapısı o Enum Nedir? Enum –> Enumaration Enum yapısına temel bir tanım getirmek gerekirse kullanılacak sabit değerlere sayısal değerler atayarak kolay kullanımını sağlayan yapıya diyebiliriz.

o Neden Enum Kullanırız? Enum kullanımının 2 sebebi olduğunu söyleyebiliriz. • •

Kod okunurluğunu artırmak Erişim kolaylığı ve düzen ile olası hataların büyük oranda önüne geçilmesini sağladığı için kullanılır.

o Genel Yapı public enum Enumİsmi { // Elemanlar }

Bunları öğrendiğimize göre biraz gerçek hayattan örnekler bulalım ve anlamaya çalışalım.

✓ Proje Tanımı Bir firmada IT biriminde çalıştığımızı varsayalım. Bu firmanın IT birimine tüm bölümlerden yazılımsal Help Desk istekleri geliyor. Programda istek gönderildiği anda istek gönderildi 1 olarak tutuluyor olsun. İşlemi gören Yönetici bu isteği onayladığında onaylandı ifadesi 2 olarak tutulsun. HelpDesk’i IT departmanında bir çalışana atamasını yaptığında işlemde olarak gözüksün. İşlemde 3 ile tutulsun. Çalışan işi bitirdiğinde tamamlandı olarak işaretlensin ve bu tamamlandı değeri de 4 olarak tutulsun. Bunu Enum kullanarak gerçekleştirelim.

151


public enum HelpDesk { İstekGönderildi = 1, Onaylandı = 2, İşlemde = 3, Tamamlandı = 4 }

Bir Enum tanımlaması temel anlamda bu şekildedir. Yukarıda yazdığım soruyu tam olarak projelendirmeden önce Enum ile ilgili bir kaç bilgi daha vermeliyim. Enum sabitleri içindeki değerlere ulaşmak istediğimizde kullanabileceğimiz yöntemlerden biri GetNames() metodudur. Bir Enum sabiti bu metodun kullanımı ile bir string dizisi haline dönüştürülüp değerleri o şekilde de kullanılabilir.

✓ Enum’u String Diziye Dönüştürme (GetNames() Metodu)

string[] HelpDeskDizi = Enum.GetNames(typeof(HelpDesk)); label1.Text = HelpDeskDizi[0].ToString();

Yukarıdaki Enum sabitini bir diziye atalım. Örnek kodlamada olduğu gibi alabiliriz. Diziye attığımız bu değerlere dizi kurallarına göre ulaşabiliriz sadece. HelpDeskDizi[0] bu değer bize geriye İstek Gönderildi değerini dönecektir. ✓

ToString() Kullanımı

Enum sabitleri ile ToString metodunun parametrelerini kullanarak istediğimiz değerleri alabilme ihtimalimiz var. Parametre Görevi G veya g Değeri genel formatta yazar. D veya d Değerin sayısal karşılığını yazar. X veya x Değerin Hexadecimal karşılığını yazar.

Bilmemiz gereken çoğu şeyi öğrendiğimize göre şimdi sorumuza dönelim. Projenin tam haline bakalım.

152


namespace EnumTipi { public partial class Form1 : Form { public enum HelpDesk { İstekGönderildi = 1, Onaylandı = 2, İşlemde = 3, Tamamlandı = 4 } public Form1() { InitializeComponent(); } Random r = new Random(); private void button1_Click(object sender, EventArgs e) { int x = r.Next(1, 5); HelpDesk HD = new HelpDesk(); switch (x) { case 1: HD = HelpDesk.İstekGönderildi; break; case 2: HD = HelpDesk.Onaylandı; break; case 3: HD = HelpDesk.İşlemde; break; case 4: HD = HelpDesk.Tamamlandı; break; } label2.Text = x.ToString(); label1.Text = HD.ToString("G"); } } }

153


✓ Kod Açıklaması( Algoritma) Soruda da belirtildiği gibi değerlerimizi öncelikle bir enum tanımlaması şeklinde yazdık. •

public enum HelpDesk { İstekGönderildi = 1, Onaylandı = 2, İşlemde = 3, Tamamlandı = 4 }

Enum tanımının sınıf içinde yapıldığına dikkat ediniz. Metotlar içinde Enum tanımlamaları gerçekleştiremezsiniz. Programda sadece göstermek amaçlı rastgele değer türeten metodumuzu yazdık ve istediğimiz sayısal değeri türettik. •

Random r = new Random(); int x = r.Next(1, 5);

Random sınıfından bir sonraki dersimizde detaylı bahsedeceğiz. •

HelpDesk HD = new HelpDesk();

Enum tanımımızdan bir nesne türettik içindeki değerlere ulaşmak için. Bir önceki yazımda bahsettiğim struct konusuna bu anlamda benzerdir. •

switch (x) { case 1: HD = HelpDesk.İstekGönderildi; break; case 2: HD = HelpDesk.Onaylandı; break; case 3: HD = HelpDesk.İşlemde; break; case 4: HD = HelpDesk.Tamamlandı; break; }

Switch case yapısı ile gerekli kontrolü yaptırıp HD nesnemize gelen değeri atadık. •

label2.Text = x.ToString(); label1.Text = HD.ToString(“G”);

En son işlemde yazdırma işlemidir. Kullanıcıya durumu gösterdik. HD.ToString(“G”) ile gelen değerin tam enum’daki string karşılığını aldık. G yerine D yazsaydık sayısal değerini alırdık.

154


155


28 Switch Case Yapısı Daha önce karar yapılarından bahsederken bu işleri çözmek için If Else yapısının kullanıldığını söylemiştim. Switch – Case yapısıda karar yapıları için kullanılabilen bir diğer yöntemdir. If Else ile yapılabilen pek çok durumu Switch – Case ile yapabiliriz.

o Neden Switch Case? Çünkü if else gibi dallanarak kod kalabalığı oluşturmaz. Kod kalabalığını ve dallanmayı ortadan kaldırdığı içinde kod okunurluğunu artırır. Bu sebeplerden dolayı Switch – Case yapısı kullanımı tercih edilebilir.

o Genel Yapı

switch(Değişken İsmi) { case değer1: Kodlar; break; case değer2: Kodlar; break; . . . case değern: Kodlar; break; default: Kodlar; break; }

switch case genel yapısı bu şekildedir.

156


Bir programcı alışkanlığı olarak daha kolay okunurluk için aşağıdaki şekliyle kullanmayı tavsiye ediyorum.

switch(Değişken İsmi) { case değer1: { Kodlar; break; } . . . case değern: { Kodlar; break; } default: { Kodlar; break; } }

Bu kullanımı zaten Case ifadesi içinde işleyeceğiniz break hariç 1 den fazla kod varsa bu scooplar arasına almanız gerekir tüm Kodları işleyebilmesi için.

✓ Yapının Açıklaması Öncelikle bir değişken switch tanımı içine verilir. switch blogu bu değeri alır ve işler. Aşağıdaki case’ler programcı tarafından öngörülen tüm durumların ifadesidir. Değişkenden gelebilecek tüm değerlerin sonuçları case’lere yazılır. Gelen değer hangi case’in durumu ile eşleşirse o case’in kodları gerçeklenir. Break komutu tüm switch case yapısının sonlanmasını sağlar. Kullanılması zorunludur. Kullanmadığınızda hata alırsınız.

157


Bu şu demektir. Örneğin 10 adımdan oluşan bir case yapımız var. Gelen değer ilk case de gerçeklendiyse diğer 9 durum kontrol edilmez. Zaten onlara eşit olma ihtimali yoktur. Default kısmı bizim öngöremediğimiz herhangi bir değer girilirse Default Kodları çalışır. Sadece öngöremediğimiz demek doğru olmaz genellikle öngördüğümüz ama hata dönmemesi için kontrol blogu olarak kullandığımız yerdir. Mesela 12 ayın ismini girilen sayı değerine göre kullanıcıya gösteriyoruz. Sayı aralığımız belli. 1 – 12. Bu aralık dışında girilecek her değer için Default koduna gitmesini ve orada gerekli mesajı verdirmeyi sağlayabiliriz. Değişkenin veri tipine göre case’in yanına yazılacak değerin yazım şekli farklılaşır. Örneğin bir string değer geliyorsa case “değer”: şeklinde yazılırken. int değer geliyorsa case 1: şeklinde yazılır. char tipli bir değer geliyorsa. case ‘d’ Olarak yazılacaktır. Bunlara dikkat etmemiz gerekir.

158


29 Özel Atama İşlemleri x=5 dediğimizde bu bir eşitlik değil atama işlemiydi. C# da bazı matematiksel işlerimizi kolaylaştırmak için bir dizi özel atama işlemi tanımlamışlardır. x bir int değişken olduğunu varsayarak anlatımıma devam ediyorum.

✓ x++ Yukarıdaki gibi bir ifade gördüğümüzde bu x’in değerini 1 artırıp tekrar x’e atadı demektir. Yani x=x+1 işlemi ile x++ işlemi aynı görevi görmektedir. Bir değişkenin değeri eğer bir artırılacaksa değişken_ismi++ yapmanız yeterli olacaktır. Böyle bir değişkeni işleme soksaydık ne olurdu?

int x,y; y = 0; x = 5; y = x++;

Şöyle bir işlem yaptığımızda y öncelikle x in ilk değeri olan 5 i alacaktır. Ama x kendi değerini 1 artırıp kendisine atayacaktır. Son durumda x=6 y=5 olarak devam edecektir.

✓ ++x Bu operatörde aynı şekilde x’in önceki değerini 1 artırır ve x’ e atar. Peki, bir önceki kullanımdan farkı nedir?

Yukarıda yaptığımız işlemi bir de böyle deneyelim.

int x,y; y = 0; x = 5; y = ++x;

159


Bu işlemde ilk önce x değeri 1 artar. 6 olan değeri y’ye atanır. Ayrıca x’in değeri de 6’dır.

✓ x-Bu atama operatörü de x’in değerini 1 azaltır ve x’ e atar. x=x-1 ifadesi ile aynı anlama gelir.

int x,y; y = 0; x = 5; y = x--;

Bu durumda yeni değerler artık aşinasınız. y=5 olarak kalacaktır. x ise 1 azalıp 4 olacaktır.

✓ --x Bu operatörde aynı şekilde x den 1 azaltır x’e atar.

int x,y; y = 0; x = 5; y = --x

Bu işlemin sonunda son durum y=4 x=4 olacaktır. Bu 4 atama şekli kullanarak bu kullanımlar çokça türetilebilir. Ama temel mantık anlattığım şekliyle ilerler.

✓ x+=y Burada y’nin de bir int değer olduğunu varsayalım. Ama sadece int türü için geçerli bir işlem değildir. Diğer veri tipleri de aynı işleme tabi tutulabilir. Bu ifade şunu söyler. x in değerine y’nin değerini ekle ve tekrar x’e ata.

int x,y; y = 5; x = 5; x+=y;

160


Bu işlemin sonunda x=10 olmuştur. y’nin değerinde ise herhangi bir değişim söz konusu değildir. Bu ifadeyi bir de string bir türle kullanalım.

string x,y; x = "Murat"; y = "Bilginer"; x+=y;

Bu ifade sonunda x’in yeni eşiti MuratBilginer şeklinde olacaktır. Böyle bir birleştirme işleminde şunu yaparak biraz daha düzenli hale getirebiliriz.

string x,y; x = "Murat"; y = "Bilginer"; x+=” ”+y;

Bu işlemin sonunda x’in değeri Murat Bilginer olacaktır.

✓ x-=y Bu atama işlemi de x’in değerinde y değerini çıkarıp x’e atamasını yapar. Toplama işlemi hariç diğer operatör işlemlerinde sayısal türler hariç işlem yapamazsınız. Yani iki string tür için x-=y gibi bir ifade hata dönecektir.

✓ x*=y x’in değeri ile y’nin değerini çarpar ve tekrar x e atar.

✓ x/=y x’in değerini y’ye böler ve tekrar x e atar.

✓ x%=y x’i y’ye böler ve kalanı x’e atar.

161


30 Break & Continue Şimdiye kadar karar yapılarını ve döngüleri gördük. Bu iki yapı içinde döngü sonlandırıcı ve istediğimiz adımı atlayıp devam etmemizi sağlayacak iki deyim var break ve continue.

✓ Break Deyimi Break deyimi switch case yapısında, for, while, do while ve foreach döngüleri içinde istediğimiz şart sağlandığı anda döngüyü sonlandırmaya yardımcı olur. Yazacağımız bir proje ile hemen bunun nasıl gerçekleştiğini görelim.

✓ Proje Tanımı 1 den 100 e kadar tüm sayıları for döngüsü kullanarak ListBox’a yazdıracak bir program yazınız. Kural: Ancak sayaç 20 olduğunda döngüyü kırıp döngünün sonlanmasını sağlayınız.

✓ Proje Tasarımı

162


using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Break_And_Continue { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { for (int i = 1; i <= 100; i++) { if (i>=20) { label1.Text = i + " de Durdu"; break; } listBox1.Items.Add(i); } } } }

163


✓ Kod Açıklaması( Algoritma) Şimdi kodlarımıza bir göz atalım. Soruda bahsedildiği gibi 1 den başlayıp 100 e kadar giden bir for döngüsü yaptık. Değeri ListBox’a yazdırmadan önce if ile verilen kuralın şartını kontrol ettik. Eğer şart sağlanırsa break; komutu ile döngüyü sonlandırdık. Ekran görüntüsünden de anlaşılacağı gibi 1 den 19 a kadar yazmıştır. Sonra durmuştur.

Bir döngü içinde break kullandığınızda noktalı virgülü koyduğunuz anda o break deyiminin hangi döngüyü sonlandırdığını aşağıdaki şekilde işaretleyerek size göstermektedir. Buda olası yapılabilecek yanlışların önüne geçmektedir. Bir nevi Poke Yoke yapmaktadırlar. (Hata Önleme)

✓ Continue Deyimi Continue deyimi ise bir döngü içinde gerçekleşmesini istemediğimiz belli şartların içine koyularak o adımdan sonrasının devam etmesini sağlar. Az önceki proje sorumuz üzerinden devam edelim.

164


✓ Proje Tanımı 1 den 10 a kadar tüm sayıları for döngüsü kullanarak ListBox’a yazdıracak bir program yazınız. Kural: Ancak 5 değerini yazdırmayınız. Bunu gerçekleştirmek için Continue deyimini kullanınız.

Proje Tasarımı

namespace Break_And_Continue { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { for (int i = 1; i <= 10; i++) { if (i==5) { label1.Text = i + " Değerini Atladı"; continue; } listBox1.Items.Add(i); } } } }

165


✓ Kod Açıklaması( Algoritma) Bir öncekinden çok farklı bir işlem yapmadık aslında. Sadece atlaması gereken değer için bir şart ifadesi yazdık. Ve o şart içerisine continue deyimini yazarak o adımı atlayıp devam etmesini sağladık. Ekran görüntüsünde de gördüğümüz gibi 4 den sonra 5 değerini atladı ve 6 ile yoluna devam etmiş döngüyü tamamlamıştır. Aklımıza şöyle bir soru gelse. Continue deyiminin hemen üstünde break kullansak program nasıl davranır. Böyle bir kullanım için kodlama anında continue değiminin altını çizer, programın çalışmasına engel olarak bir hata değil uyarı verecektir. Continue deyimi için ulaşılamayan kod tespit edildi uyarısını verecektir.

Yani buradan şunu anlayabiliriz. Break, continue deyimini yener.

✓ Break deyimini switch case yapısı içinde bir bitirme işlemi olarak kullanabilirsiniz. Ancak continue deyimini switch case içinde kullanamazsınız. 166


➢ 31 Diziler 1 Diziler yani matrisler günlük hayatta da pek çok işimizi çözmede yardımcı olduğu gibi programlamada da çok özel bir yeri vardır.111fdsfsdff

o Neden Diziler? Şimdiye kadar öğrendiğimiz programlama bilgilerinde pek çok veri tipinden bahsettik. Değişken tanımlamaları yaptık. Örnek projelerimizde bu değişkenlere değer atamayı gördük. Şöyle bir senaryo düşünelim. 100 kişilik bir sınıf olsun. Bu sınıftaki tüm öğrencilerin isimlerinin program tarafından tutulup istenildiğinde de isimlerinin gösterilmesini isteyelim. Şimdiye kadarki olan bilgilerimizden yola çıkarsak bu işlem için şöyle bir şey yapmamız gerekebilirdi.

string öğr1; string öğr2; string öğr3; . . . string öğr100

Sadece basit bir değişken tanımlaması için 100 satır aynı kodu yazdık. Mantıklı bir hareket mi diye düşündüğümüzde kolayca bunun çokta mantıklı bir iş olmadığı kanısına varabiliriz. İşte tamda bu seri halindeki aynı türden değişkenlerimizi kolayca tutabilelim sonrada ulaşabilelim diye diziler kavramı ortaya atılmış.

o Dizi Tanımlama Pek çok dizi tanımlaması mevcuttur

VeriTipi[] Değişkenİsmi = new VeriTipi[Boyut];

167


. string[] Adlar = new string[100]; int[] Sayılar = new int[100]; char[] Harfler = new char[75];

o

İlk Değer Ataması

string[] Adlar = new string[] { "Murat", "Bilginer", "Industryolog" };

Yukarıdaki örnekte olduğu gibi ilk değer atamaları da yapılabilir. Burada dizinin boyut değeri girilmeyip istenildiği kadar değer yazılabileceği gibi. Dizinin boyutu da verilerek işlem yapılabilir.

string[] Adlar = new string[3] { "Murat", "Bilginer", "Industryolog" };

Eğer dizinin boyutunu verip içeriğine daha fazla eleman girersek bu durumda hata alırız.

168


Eğer deklere ettiğiniz değer daha yüksek olsa yine hata alacaktınız. Yani 4 değer olduğunu söyleyip 3 değer girseydiniz aynı hatayı alacaktınız. Böyle bir kullanımda deklere ettiğiniz kadar değeri diziye gireceğinizi garanti etmiş olursunuz.

İlk değer ataması yapılırken boyutsuz bir şekilde de yapılabilir.

string[] Adlar = {"Murat","Bilginer"}; Böyle bir dizi tanımlaması sonucu girilen değer dizinin uzunluğunu da belirlemiş olur. o

Boyutsuz Tanımlama

Dizinin tanımlamasını yapıp new anahtar kelimesi ile türetmeden de kullanabilirsiniz.

string[] Adlar;

Bu dizi istediğiniz kadar değer alabilecektir. Değer ataması yaparken new anahtarıyla türetmenize ihtiyaçta duymayacaktır.

✓ Diziye Değer Atama Bir dizi tanımlaması yaptınız bu diziye değer atayacaksınız bunu yapabilmenin de birden fazla yolu var. Normal değişkene değer ataması yapar gibi bunu yapabilirsiniz. Ancak burada farklı bir durum var dizinin hangi indisine değer atanacak bunu belirlemelisiniz.

169


string[] Adlar = new string[100]; Adlar[0]="Murat"; Adlar[1]="Bilginer";

Şeklinde değer atamalarını gerçekleştirebiliriz.

Burada dikkat etmemiz gereken önemli bir husus veri tiplerine göre değer atama şekillerinin değiştiğidir. Yani normal veri tiplerinde atamaları nasıl gerçekleştiriyorsak burada da aynı kural geçerli. int[] Sayılar = new int[100]; Sayılar[0]=1; char[] Harfler = new char[100]; Harfler[0]='a';

Şeklinde olacaktır.

Bir diziyi tanımladığınızda eğer bu sayısal içerikli ise ve ilk değer ataması yapılmamışsa tüm indislerini 0 olarak set edecektir. Eğer string bir dizi oluşturduysanız değerleri boş karakter olarak atacaktır. Bu yüzden dizinin istediğimiz indisine değer ataması yapabiliriz. Yani atamaların sıralı olmasına gerek yoktur.

170


o Dizi Değerlerine Ulaşma İstediğimiz zaman bir dizinin değerine yine istediğimiz indise işaret ederek alabiliriz.

using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Arrays_1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string[] Adlar = new string[100]; private void button1_Click(object sender, EventArgs e) { Adlar[0] = "Murat"; Adlar[1] = "Bilginer"; label1.Text = Adlar[0]; } } }

171


Gördüğümüz gibi label1.Text = Adlar[0]; kod yardımı ile Adlar dizisinin 0. elemanın ne olduğunu göstermiş oldum. Tür dönüşümleri diziler içinde geçerlidir. label1.Text = Adlar[0].ToString(); şeklinde string türe dönüştürülebilir. Sayı=Convert.ToInt32(Adlar[0]); eğer yapısı uygunsa dizi içindeki değer bu şekilde int türüne de dönüştürülebilir.

172


32 Dizilerde Array Metotları 1 (Resize Metodu) Bir dizinin ilk tanımlama anında boyutunun belirlenebileceğini de söylemiştim. Ama bazen programlama esnasında dizi boyutunun değişmesine ihtiyaç duyabiliriz. Tamda burada dizilerde kullanacağımız metotlar devreye giriyor. Bugünkü yazımızda Array sınıfının Resize metodunu göreceğiz.

o Genel Kullanım Array.Resize(ref dizi_ismi, boyut_değeri);

string[] Takımlar = new string[15];

Bu dizi tanımlamasının yapıldığını varsayalım. Bu takımlar dizisinin boyutunu yeniden boyutlandırarak 18 yapalım.

Array.Resize(ref Takımlar, 18); Bir proje ile biraz daha pekiştirelim.

✓ Proje Tanımı Dışarıdan girilen bir ifadeyi bir char dizide tutunuz. Dizinin boyutunu gelen ifadenin uzunluğuna göre yeniden boyutlandırıp tüm elemanlarını bir ListBox’a yazdırınız.

✓ Proje Tasarımı

173


using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace Diziler { public partial class Form1 : Form { public Form1() { InitializeComponent(); } char[] Karakter = new char[1]; // Temsili bir deÄ&#x;er verdik. private void button1_Click(object sender, EventArgs e) { string Kelime = textBox1.Text; int Length = Kelime.Length;

Array.Resize(ref Karakter, Length); for (int i = 0; i &lt; Length; i++) { Karakter[i] = Kelime[i]; } for (int i = 0; i &lt; Karakter.Length; i++) { listBox1.Items.Add(Karakter[i]); } } } }

174


✓ Kod Açıklaması( Algoritma) •

char[] Karakter = new char[1];

Karakter tipli bir dizi tanımladık ve sonradan değiştireceğimiz için temsili bir boyut belirledik. •

string Kelime = textBox1.Text; int Length = Kelime.Length;

Dışarıdan değerimizi aldık ve uzunluğunu bulduk. Length isimli değişkende tuttuk. Dizimizin yeniden boyutunu belirleyecek olan değişken.

175


Array.Resize(ref Karakter, Length);

Dizimizi yeniden boyutlandırdık. •

for (int i = 0; i < Length; i++) { Karakter[i] = Kelime[i]; } for (int i = 0; i < Karakter.Length; i++) { listBox1.Items.Add(Karakter[i]); }

176


33 Dizilerde Array Metotları 2 Genel olarak tüm anlatımda kullanacağımız bir dizi tanımlıyoruz. int[] Sayılar = {2,5,1,8,11,3,4};

Bu anlatımımız boyunca kullanacağımız form tasarımı.

✓ Sort Metodu Dizi elemanlarını küçükten büyüğe sıralamayı sağlayan metottur.

Array.Sort(Dizi_İsmi);

namespace Array_Metodları { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int[] Sayılar = { 2, 5, 1, 8, 11, 3, 4 }; private void button1_Click(object sender, EventArgs e) { Array.Sort(Sayılar); for (int i = 0; i < Sayılar.Length; i++) { listBox1.Items.Add(Sayılar[i]); } } } }

177


Küçükten büyüğe sıraladığını görebiliyoruz.

✓ Reverse Metodu Reverse metodu bir diziyi tersine çevirmek için kullanılır.

Array.Reverse(Dizi_İsmi);

namespace Array_Metodları { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int[] Sayılar = { 2, 5, 1, 8, 11, 3, 4 }; private void button1_Click(object sender, EventArgs e) { Array.Reverse(Sayılar); for (int i = 0; i < Sayılar.Length; i++) { listBox1.Items.Add(Sayılar[i]); } } } }

178


İlk dizimizin terse döndürüldüğünü görüyoruz. Aklımıza şöyle bir soru gelecektir. Dizileri küçükten büyüğe sıralatma fonksiyonu var peki büyükten küçüğe nasıl sıralatabiliriz? Bunun için özel bir metodumuz yok ancak bunu kendimiz kolayca aşabilmekteyiz. Sort ve Reverse metotlarını kullanarak isteğimizi kolayca yerine getirebiliriz. Öncelikle bir diziyi sort metodu ile küçükten büyüğe sıralatıyoruz. Sonrada Reverse metodu ile diziyi terse çeviriyoruz. Böylece büyükten küçüğe sıralanmış bir dizi elde etmiş oluyoruz.

namespace Array_Metodları { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int[] Sayılar = { 2, 5, 1, 8, 11, 3, 4 }; private void button1_Click(object sender, EventArgs e) { Array.Sort(Sayılar); Array.Reverse(Sayılar); for (int i = 0; i < Sayılar.Length; i++) { listBox1.Items.Add(Sayılar[i]); } } } }

179


Büyükten küçüğe böylece sıralatmayı başardık.

✓ CreateInstance Metodu Bu metot bir diziyi değişken tipini, eleman sayısını ve boyutunu belirleyerek oluşturmak için kullanılan metottur.

Array.CreateInstance(Değişken_türü, Eleman_Sayısı, Dizinin_Boyutu); Array okul=Array.CreateInstance(typeof(string),10);

Dizi bir boyutlu ise boyut belirtilmez.

Array Takımlar = Array.CreateInstance(typeof(string), 5); string[] Takım = (string[])Takımlar;

✓ Instance Nedir? Bir sınıftan türeyen nesnelere instance deriz. CreateInstance metodu ile yapılan işlem Array sınıfından bir dizi oluşturulur. Bu oluşturduğumuz sınıftan istediğimiz kadar Instance oluşturup kullanabiliriz. CreateInstance metodu ile oluşturulmuş bir dizi referans alınıp nesnesi oluşturulmadan olduğu gibi kullanılmaz. Bir değer ataması yapılamaz. Yazdığımız kodlara bir göz atarsak. Array Takımlar = Array.CreateInstance(typeof(string), 5);

180


Takımlar isminde bir Array oluşturdum. Tipinin string olduğunu 1 boyutlu olduğunu ve uzunluğunun da 5 olduğunu anlayabiliyorum. string[] Takım = (string[])Takımlar; Oluşturduğum Array’den bir dizi tanımlaması yapıp referans aldım. Burada şu dikkatimizi çekebilir. (string[]) ifadesi. Oluşturmuş olduğum takım Array’i referans tiplidir. Unboxing yapmadan bu dizinin tipini öğrenemez ve istediğim diziyi oluşturamazdım. Burada bu ifadenin yaptığı işlem string[] tipli bir dizi istiyorum şeklinde ifade edebileceğimiz bir tür dönüşümü işlemiydi.

✓ IsArray Metodu Bu metodumuz ise bir değişkenin dizi değişkenimi yoksa farklı bir değişken mi onu öğrenmemize yardımcı olur. Geriye true ya da false şeklinde 2 değer döndürür.

string[] Takımlar = { "Galatasaray", "Beşiktaş" }; Type Tip; Tip = Takımlar.GetType(); label1.Text = Tip.IsArray.ToString();

✓ SetValue Metodu Dizilere değer ataması yapmayı ilk konumuzda görmüştük. Ama bir diziye değer ataması yapmanın tek yöntemi anlattığımız o yöntem değildir. SetValue metodu da bir diziye istediğimiz indisine bir değer ataması yapabilir.

Dizi_adı.SetValue(“Atanacak_Değer”,index_numarası);

string[] Takımlar = { "Galatasaray", "Beşiktaş" }; Takımlar.SetValue("Fenerbahçe", 2);

Dizinin 2.indisine Fenerbahçe elemanının atamasını yaptı. Burada aklımıza gelebilecek sorulardan bir tanesi şudur. Var olan bir değer üzerine atama yaparsam ne olur.

181


Örneğin;

string[] Takımlarx = new string[5]; Takımlarx.SetValue("Galatasaray", 6); label1.Text = Takımlarx[6];

Olsaydı. 1. indiste bulunan Beşiktaş değerinin üzerine Fenerbahçe yazılmış olacaktı. Bir diğer soruda şu olabilirdi. Uzunluğu belirlenmiş bir dizi içine sınırın dışına çıkan bir atama yapabilir miyiz? Böyle bir durumda her dizi işleminde olduğu gibi sınır aşımlarında kodlama anında hata almayız. Ama Runtime da aşağıda gördüğümüz hatayı alırız.

✓ GetValue Metodu Bir dizinin istediğimiz elemanına ulaşmayı bir önceki yazılarımızda göstermiştik. Ancak aynı SetValue de olduğu gibi bir dizinin elemanlarına erişmek için tek yöntem o değildir. GetValue metodu bir dizinin istediğimiz indisindeki değere ulaşmak için kullanabileceğimiz bir metottur. Zaten İngilizcesine odaklansak bile ne olduğunu kolayca anlayabiliriz. Değer Getir.

Dizi_adı.GetValue(index değeri);

string[] Takımlarx = new string[5]; Takımlarx.SetValue("Galatasaray", 0); label1.Text = Takımlarx.GetValue(0).ToString();

182


✓ Join Metodu Bu metot, dizi içindeki tüm elemanları bir değişkene, aralarına istediğimiz birleştirme deyimini koyarak aktarabilmemize yardımcı olur.

a=String.Join(BirleştirmeDeyimi,Dizi_İsmi);

Buradaki birleştirme deyimi string’dir.

string[] sayılar={"1","2","3"}; string a; a=String.Join("*",sayılar);

Gördüğünüz gibi her dizi elemanın arasına * işaretini koyup birleştirip değişkene aktardı. Arasına tek karakter değil istediğimiz uzunlukta bir ifade yazabilirdik.

183


using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Array_Metodları_2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string[] sayılar = { "1", "2", "3" }; string a; a = String.Join("Industryolog", sayılar); label1.Text = a; } } }

184


✓ Copy Metodu Bir dizinin içeriğini başka bir diziye kopyalamak amacı ile kullanılan metottur. Array.Copy(Kaynak_Dizi_Adı,Hedef_Dizi_Adı,Eleman_Sayısı);

using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Array_Metodları_2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string[] Sayılarx = { "1", "2", "3" }; string[] Sayılary = new string[3]; Array.Copy(Sayılarx, Sayılary, 3); for (int i = 0; i < Sayılary.Length; i++) { listBox1.Items.Add(Sayılary[i]); } } } }

185


Burada dikkat etmemiz gereken bazı durumlar vardır. o

Daha önceden hiç değer ataması yapılmamış ama uzunluğu belirtilmiş bir diziye copy metodu ile değer atadığımızda ve daha eğer dizi gelen elemanlarla tam olarak dolmadı ise dizinin dolmayan elemanlarına ulaşmak istediğimizde hata mesajı alırız.

o

Diziye değer ataması daha önceden yapılmış ise copy metodu ile bir miktar eleman diziye taşındıysa bu taşıma işlemi o. indisten başlar bunu da unutmamak gerek.

186


using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Array_Metodları_2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string[] Sayılarx = { "1", "2", "3" }; string[] Sayılary = new string[3]; Sayılary[0] = "4"; Sayılary[1] = "5"; Sayılary[2] = "6"; Array.Copy(Sayılarx, Sayılary, 2); for (int i = 0; i < Sayılary.Length; i++) { listBox1.Items.Add(Sayılary[i]); } } } }

187


Gördüğünüz gibi 3 ve 4 ün yerini 1 ve 2 aldı 6 aynen kaldı. Çünkü diğer diziden sadece 2 elemanın geçmesini istedik.

✓ Length Özelliği Length dizilerde sıklıkla kullandığımız bir özelliktir. Length bir metot değildir. Property’dir. Burada kısaca değinmek istiyorum. Bir dizinin uzunluğunu int türünden bize geri döner.

Dizi_İsmi.Length

✓ Clear Metodu Bu metot diziler içinde silme işlemini gerçekleştirir.

Array.Clear(Dizi_İsmi,BaşlangıçIndexi,Silinecek_Eleman_Sayısı);

Öncelikle hangi dizide silme işlemi yapacağımızı dizinin ismini yazarak belirtiyoruz. Daha sonra kaçıncı indisten itibaren silme işlemi gerçekleşecek bunu belirtiyoruz. Son olarak kaç eleman silineceğini söylüyoruz.

int[] dizi = {1, 2,3,4,5}; Array.Clear(dizi, 1,2);

Bu işlemin sonunda dizinin 1. indisinde bulunana eleman yani (2) den itibaren 2 eleman siler. 2 ve 3 bu işlem sonunda silinecektir. Peki, silme işleminden sonra dizi sola ötelenir mi?

private void button1_Click(object sender, EventArgs e) { int[] Sayılar = { 1,2,3,4,5}; Array.Clear(Sayılar, 1, 2); for (int i = 0; i < Sayılar.Length; i++) { listBox1.Items.Add(Sayılar[i]); } }

188


Gördüğümüz gibi bir öteleme işlemi gerçekleşmedi sadece değerler 0 a eşitlendi. Bu bir string dizi olsaydı boşluk karakterine eşitlenecekti.

✓ Dizideki Tüm Elemanları Silme Array.Clear(Dizi, 0, Dizi.Length);

Bu işlem sayesinde dizideki tüm elemanlar silinebilir.

✓ Indexof Metodu Bu metod dizi içindeki bir elemanın index numarasını geri döner. Array.IndexOf(Dizi_İsmi,Aranacak_Değer)

int[] Sayılar = { 1,2,3,4,5}; Array.IndexOf(Sayılar,5)

Yani bu ifadenin söylediği, 5 sayısı Sayılar dizisi içinde kaçıncı sıradadır. Index değeri geri döner. Eğer sorduğumuz değer dizi içinde yoksa o zaman geriye -1 değerini dönecektir.

189


➢ 34 2 Boyutlu Diziler Çok boyutlu dizilere matris dizilerde diyebiliriz. Programcılık dâhil pek çok yerde matrisler kullanılır. En basit aklınıza gelecek yer veri tabanlarıdır. Bir matris dizi mantığı ile yönetilirler. C#’da da pek çok tek boyutlu dizi tanımlamak yerine işlerimizi kolayca çok boyutlu diziler tanımlayarak yapabiliriz. C# da tek boyutlu diziler tanımlanırken yaptığımız işlem şuydu; string[] Kelimeler = new string[10];

o 2 Boyutlu Dizi Tanımlama string[,] Kelimeler = new string[3,2];

2 Boyutlu olduğunu string[,] ifadesindeki virgül ile bildirdik. Daha sonra string[3,2] yazdığımız bu ifade iki boyutlu bu dizinin kaç satır kaç sütundan oluştuğunu ifade etmektedir. İlk değer satırı, ikinci değer sütunu ifade eder.

Yukarıda gördüğümüz 2 boyutlu dizinin görünümüdür. Daha öncede söylediğimiz gibi diziler saymaya 0 dan başlar. Burada da geçerlidir. Satır * Sütun bize dizinin kaç elemanlı olduğunu verecektir.

190


o Değer Ataması •

Tanımlama Anında

int[,] Sayılar = new int[,]{ { 1, 1 }, { 1, 2 } };

Buradaki değer atama şunu ifade eder. Her süslü parantez içindeki değerler bir satırın elemanlarını ifade eder. Yani {1,1} değerini inceleyecek olursak. İlk 1 0. satırın 0. sütununa ait olan değerdir. İkinci 1 değeri 0. Satırın 1. Sütununa ait değeridir. Eğer Satır Sütun sayısı farklı olsaydı onu görelim.

int[,] Sayılar = new int[2,3]{ { 1, 1 ,2}, { 1, 2,3 } };

2 Satır 3 Sütundan oluşan bu dizi için iki tane özel süslü parantezler için sütun sayısı olan 3 tane eleman girmemiz gerekiyordu ve bunu yaptık. o

Çalışma Anında

int[,] Sayılar = new int[2,2]; Sayılar[0, Sayılar[0, Sayılar[1, Sayılar[1,

0] 1] 0] 1]

= = = =

1; 2; 3; 4;

Yukarıda gördüğünüz gibi satır sütun ifadesi ile dizinin o kolonuna işaret edip değer ataması yapabilir. Eğer dizi boyutunun verildiği değerden daha büyük bir indise değer atamaya çalışırsak program Runtime Exepcition verecektir.

191


o Diziden Değer Okuma Çok boyutlu bir dizide istediğim kolondaki değeri okumak istersem yapmam gereken işlem şu olacaktır.

int[,] Sayılar = new int[2,2]; Sayılar[0, Sayılar[0, Sayılar[1, Sayılar[1,

0] 1] 0] 1]

= = = =

1; 2; 3; 4;

label1.Text=Sayılar[0,0].ToString();

Bu şekilde istediğimiz dizi elemanına ulaşabiliriz.

o Dizi Elemanlarına Döngü İle Ulaşma Tek boyutlu bir dizinin elemanları içinde tek bir for döngüsü ile gezebiliriz. Dizi boyutu arttıkça kullacağımız for döngüsü adedi de buna doğru orantılı artacaktır. Yani 2 boyutlu bir dizinin tüm elemanlarını gezebilmek için 2 tane iç içe for döngüsü kullanmamız gerekecektir.

✓ Proje Tanımı 3*3 lük 2 boyutlu bir diziye girilen değerleri for döngüsü yardımı ile bir ListBox’a listeleyiniz.

✓ Proje Tasarımı

192


namespace Çok_Boyutlu_Diziler { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int[,] Sayılar = new int[3, 3] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; for (int i = 0; i < Sayılar.GetLength(0); i++) { for (int j = 0; j < Sayılar.GetLength(1); j++) { listBox1.Items.Add(Sayılar[i, j]); } } } } }

193


✓ Kod Açıklaması( Algoritma) •

int[,] Sayılar = new int[3, 3] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

Öncelikle bizden istenen 3*3 uzunluğunda 2. boyutlu integer tanımlamamızı gerçekleştirdik ve birde bu dizimizin değerlerini atadık. •

for (int i = 0; i < Sayılar.GetLength(0); i++) { for (int j = 0; j < Sayılar.GetLength(1); j++) { listBox1.Items.Add(Sayılar[i, j]); } }

Kullandığımız iç içe for döngüsünün mantığı şudur. Dizinin satırları üzerinde sütun sayısı kadar dönerek tüm elemanlarına ulaşma mantığı üzerine kurulmuş bir sistemdir. Burada cümleden de çıkarabildiğimiz bir anlam var. O zaman ilk for döngüsü dizinin satır sayısına göre dönmeli içindeki for döngüsü de sütun sayısı kadar dönmeli. GetLength metodu dizilerde satır sütun uzunluklarını bulmak için kullandığımız bir metottur. Aynı dizilerdeki sayma mantığından yola çıkarsak 0 Satır uzunluğunu verirken 1 değeri sütun uzunluğunu vermektedir. Buradaki kullanım mantığı da bunun üzerine oturtulmuştur. Kısaca orada yapılan işi sözel olarak ifade etmek gerekirse. i=0 ile başladı Sayılar.GetLength(0) değeri geriye satır sayısı olun 3 değerini dönecektir. 0<3 şartı sağlandığına göre içerdeki kodlar çalışır. Orada da bizi bir for döngüsü karşılıyor. j=0 ve Sayılar.GetLength(1) bize sütun sayısı olan 3 ü dönecektir. 0<3 olduğu için içindeki kodlar çalışır. (0,0) değeri yazdırılır. J değeri 1 artırılır. 1<3 olduğundan (0,1) değeri yazdırılır. Bu işlem böylece tüm dizi elemanlarına ulaşana kadar tekrar edilir.

194


✓ Length Metodu Daha önce Length özelliğini görmüştük. Length özelliği tek başına bir dizideki eleman sayısını bize geri döner. Çok boyutlu bir dizinin toplamda kaç elemanı olduğunu öğrenmek istersek bunu kullanmamız gerekir. // Bir önceki dizi tanımlamasına göre yapılmıştır.

int a=Sayılar.Length; listBox1.Items.Add(a);

195


35 N Boyutlu Diziler o 3 Boyutlu Dizi Tanımlama

int[, ,] Sayılar = new int[1,2,3];

C# da dizilerde her boyut bir eksiği virgül ile belirtilir. int[, , ] buradaki 2 virgülün anlamı dizinin 3 boyutlu olduğunu söyler. Eğer 4 boyutlu bir dizi oluşturmak isteseydik 3 virgül koymamız gerekecekti. Devamında kullandığımız int[1,2,3] burada 1 satır sayısını 2 sütun sayısını 3 de derinliğini ifade eder.

o Diziye Değer Atama int[, ,] Sayılarx = new int[1, 2, 3] { { { 1, 2, 3 }, { 3, 4, 5 } } };

o Çalışma Anında Atama int[,,] Sayılarx = new int[1, 2, 3] { { { 1, 2, 3 }, { 3, 4, 5 } } }; Sayılarx[0, 0, 0] = 1; Sayılarx[0, 0, 1] = 2; Sayılarx[0, 0, 2] = 3; Sayılarx[0, 1, 0] = 3; Sayılarx[0, 1, 1] = 4; Sayılarx[0, 1, 2] = 5;

İlk tanımlamanın açılmış halini de böylece görmüş olduk. Böyle bir dizinin eleman sayısı Satır* Sütun* Derinlik olarak bulunabilir. Yani 1*2*3 =6 elemanlı olacağını buradan çıkarabiliriz.

196


o Dizi Elemanlarına Ulaşma N boyutlu bir dizinin elemanlarına iç içe kurulacak N tane for döngüsü ile ulaşılabilir

using using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;

namespace Çok_Boyutlu_Diziler { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int[,,] Sayılarx = new int[1, 2, 3] { { { 1, 2, 3 }, { 3, 4, 5 } } }; Sayılarx[0, 0, 0] = 1; Sayılarx[0, 0, 1] = 2; Sayılarx[0, 0, 2] = 3; Sayılarx[0, 1, 0] = 3; Sayılarx[0, 1, 1] = 4; Sayılarx[0, 1, 2] = 5; for (int i = 0; i < Sayılarx.GetLength(0); i++) { for (int j = 0; j < Sayılarx.GetLength(1); j++) { for (int k = 0; k < Sayılarx.GetLength(2); k++) { listBox1.Items.Add(Sayılarx[i, j, k]); } } } } } }

197


GetLength özelliğini bir önceki yazımda anlatmıştım. 3. gelen boyut GetLength(2) ifadesiyle erişilebilir olmuştur. Bize uzunluğunu dönecektir.

Çok boyutlu dizilerde bu şekildeydi. Bunu böyle 4, 5, 6, … ,n boyuta uyarlamak sizin elinizdedir. Ancak boyut arttıkça olayı anlama ve erişimi sağlamada doğal olarak zorlaşacaktır. Dikkatli olmanızda fayda görüyorum.

198


36 Jagged Diziler o Jagged Dizi Nedir? Şimdiye kadar matris yani düzenli dizilere göz attık. Ama bazı durumlarda her satırın eşit sütunlara sahip olmadığı dizileri de kullanmamız gerekebilir. Jagged diziler, her satırının uzunluğu farklı olan (Aynıda olabilir) dizilerdir diyebiliriz.

o Neden Jagged Dizileri Kullanmalıyız? Az öncede bahsettiğimiz gibi bazen dizi satır uzunlukları aynı olmayan veriler olabilir elimizde. Bu verileri Matris bir dizide tutmak, yazma ve erişim anında farklı kontrolleri de yazmamızı gerektirecektir. Birincisi böylesi bir kod karmaşıklığından kurtulmak için. İkincisi ise RAM’den tasarruf etmemizi sağlar. Bu ikinci özelliği örneğimizle beraber anlatacağım.

VeriTipi[][] Dizi_İsmi = new VeriTipi[SatırSayısıDeğeri][];

int[][] Sayılar = new int[4][];

Burada tanımlamada dikkat etmemiz gereken olay dizinin boyutu verilirken sadece satırının boyutunun verildiğidir. Çünkü Sütun değerleri her satır için değişecektir.

o Jagged Mantığı Şimdi bir örnek ile olayın mantığını anlamaya çalışalım. Bir okulda 3 tane sınıf olsun ve bu sınıftaki öğrencilerin isimleri bir dizide tutulacak olsun. 1. sınıf 3 kişi 2. sınıf 5 kişi 3. sınıf 2 kişi olsun. Matris bir dizi oluştursaydık şunu yapardık. En uzun sütun hangisi ise ona göre 3*5’lik bir matris dizi tanımlardık.

199


Elemanlar bu diziye yerleştiğinde 1. sınıftan 2 kişilik yer boş kaldı 3. Sınıftan da 3 kişilik yer boş kaldı. Ama bu ram de bir yer kapladı. Boşu boşuna bellek harcamış olduk. İşte bu işi Jagged bir dizi ile yapsaydık şöyle olacaktı.

Her satırda ne kadar sütuna ihtiyacımız var ise o kadar alan açacaktık ve değerleri de bu alanlara girecektik. Yalın üretimin olmazsa olmazı israfı önle. Bellek israfının böylece önüne geçmiş olduk. Şimdi bir örnek proje ile bu bilgilerimizi pekiştirelim.

✓ Proje Tanımı Dışarıdan 3 kelime alınız. Her gelen kelimenin karakterlerini diziye alınız. Bu her kelimenin 3. karakterini ekranda gösteriniz.

✓ Proje Tasarımı

200


namespace Jagged_Diziler { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } string[][] İsimler = new string[3][]; int i = -1; string isim; private void button2_Click(object sender, EventArgs e) { i++; if (i<4) { isim = textBox1.Text; switch (i) { case 0: label2.Text = isim; break; case 1: label3.Text = isim; break; case 2: label4.Text = isim; break; default: break; } İsimler[i] = new string[isim.Length]; for (int j = 0; j < isim.Length; j++) { İsimler[i][j] = isim[j].ToString(); } } textBox1.Clear(); } private void { label5.Text label6.Text label7.Text

button1_Click(object sender, EventArgs e) = İsimler[0][2]; = İsimler[1][2]; = İsimler[2][2];

} } }

201


202


✓ Kod Açıklaması( Algoritma) •

string[][] İsimler = new string[3][];

Boyutu belirli olan 3 satırdan oluşacağını bildiğim Jagged dizimi tanımladım. Bunu global olarak tanımladım. •

int i = -1; string isim;

Döngü şartı ve textden gelen değeri tutacak isim değişkeni. •

i++;

Öncelik i değerimizi artırıyoruz. İlk değer olarak 0 a ulaşmasıyla işlem başlıyor. •

if (i<4)

Dizi sadece 3 tane değer alabileceği için i nin 4 den küçük olma durumunda bu işlem gerçekleşsin diyoruz. Böylece sadece 3 tane isim değeri işleme girebilecek. •

isim = textBox1.Text;

İsim değerini aldık. •

switch (i) { case 0: label2.Text = isim; break; case 1: label3.Text = isim; break; case 2: label4.Text = isim; break; default: break; }

Switch case kısmı biraz programı kullanışlı hale getirmek için yazdığımız kodlar. •

İsimler[i] = new string[isim.Length];

Burada isimler dizisinin belirlenen satırının gelen isim değişkeninin uzunluğuna göre boyutunu belirliyoruz. •

for (int j = 0; j < isim.Length; j++) { İsimler[i][j] = isim[j].ToString(); }

Bu kısımda değerleri dizinin ilgili alanlarına yazdırıyoruz. •

textBox1.Clear();

Burada textbox ın içini boşaltıyoruz. •

label5.Text = İsimler[0][2]; label6.Text = İsimler[1][2]; label7.Text = İsimler[2][2];

203


Her satırın 3. elemanını istediğimiz labellara yazdırıyoruz ve böylece amacımıza ulaşıyoruz. Son olarak sizlere çok boyutlu bir Jagged dizisini nasıl oluşturabileceğinizi göstereceğim.

o Çok Boyutlu Jagged Dizi Tanımlama

Hemen bir örnekle olayı anlamaya çalışalım. Az önceki örneğimizi biraz geliştirelim. Her sınıftaki öğrencilerin iki adette sınav notları bu dizide tutulacak olsun. Bu şekilde öncelikle değer tanımları gerçekleştirilip sonrada atamaları yapılabilir.

204


o Değer Ataması

int[][,] Öğrenci = new int[3][,]; Öğrenci[0][3,2]; // 1. sınıfta 3 öğrenci varmış ve 2 tanede notu varmış girilecek. Öğrenci[1][5,2]; Öğrenci[2][6,2];

Bir tanesini örnek olarak göstereceğim. 1.

Sınıf’ın ilk öğrencisinin 2 notunu girmek istersem.

Öğrenci[0][0,0]= 56; Öğrenci[0][0,1] = 100;

Şeklinde gerçekleştirilecektir.

205


37 Foreach Döngüsü Foreach; genelde diziler, koleksiyon tipli veriler içinde dolaşıp içerideki verilere tek tek ulaşmak için kullanılan bir yöntemdir.

foreach(Veri_Tipi Değişken_İsimi in Koleksiyon_İsmi) { // Kodlar }

o Çalışma Mantığı Foreach döngüsü kendi içinde bir iteratör ile hareket eder ve son kaldığı elemanı hafızada tutar. Böylece her yeni adımda yeni elemana ulaşır.

int[] Sayılar = new int[] { 1, 2, 3, 4, 5, 6, 7 }; foreach (int sayı in Sayılar) { listBox1.Items.Add(sayı); }

Burada bilmemiz gereken en önemli şey koleksiyonun tipidir. Çünkü koleksiyonun tipi ne ise değişkenimizi ona göre belirlememiz gerekecek. Tabi var tipli bir değişken ile de herhangi bir koleksiyonun içinde dönebiliriz.

✓ Kod Açıklaması( Algoritma) Öncelikle int tipinde Sayılar isimli bir koleksiyon oluşturduk. Değer atamalarını gerçekleştirdik. Daha sonra bu dizinin elemanlarına ulaşmak istediğim için foreach döngüsünü kullanıyoruz. •

foreach (int sayı in Sayılar)

Sayılar dizisinin tipi int olduğu için içinden dönecek değerlerin int olacağı öngörüsü ile veri tipini int olarak belirledim. Dizi içindeki her değer bir değişken üzerinde tutulacak ve biz bu değişken yardımıyla o andaki değere ulaşabileceğiz. sayı isimli değişkeni tanımladık bu sebeple. in ifadesi syntax yapısında özel bir isim. Aslında İngilizce’de ki anlamıyla birazdan yazacağımız dizi yada koleksiyon içinde anlamını ortaya çıkarır.

206


En sona da içinde arama yapacağımız dizi yada koleksiyon ismi yazılır.

foreach (var item in collection) { }

Foreach döngüsü dışarıdan bir sayaç ile kontrol yapan bir döngü olmadığı için diğer döngülerden biraz farklılaşır.

Visual Studio kod editörü üzerinde foreach yazar iki kere Tab butonuna basarsanız. Kullanacağınız yapıyı sizin için oluşturacaktır

Bir string değişkenin başlı başına bir karakter dizisini ifade ettiğini söylemiştik daha önce. Eğer bir string değişken üzerinde bir foreach döndüreceksek veri tipi char olarak belirtilmelidir.

o Doğrusu

207


➢ 38 1. Cilt Sonu Kitap boyunca sizlerle bir şekilde diyalog kurmaya çalıştım. C#’ da pek çok kodlamanın mantığını öğrenmeniz için çabaladım. Umarım bunda başarılı olmuşumdur.

Yazılımcıların Yaşadığı Hazları Yazılım İşini Yapmayanlar Hiçbir Zaman Yaşayamayacak. Bu Muhteşem Hazzın Peşinden Koşun. Sizin yola çıkmanıza, yazılıma heyecan duymanıza yardımcı olabildiysem ne mutlu. Kitap ile ilgili sorularınızı görüşlerinizi bana mail adresimden bildirirseniz çok sevinirim. 2. Ciltte Görüşmek Üzere… Selametle.

208


1

Sıfırdan C# Eğitimleri 1. Cilt  

Sıfırdan C# Eğitimleri kitabında temel programlama bilgilerine şimdiye kadar görmediğiniz bir yaklaşım getirmeye çalıştım. Detaylı konu anl...

Sıfırdan C# Eğitimleri 1. Cilt  

Sıfırdan C# Eğitimleri kitabında temel programlama bilgilerine şimdiye kadar görmediğiniz bir yaklaşım getirmeye çalıştım. Detaylı konu anl...

Advertisement