C# 3.0 ile Programlama Temelleri

Transkript

C# 3.0 ile Programlama Temelleri
YAZILIM VE VERİTABANI
C# 3.0 ile Programlama
Temelleri
Emre Ayrılmaz
Editör Hakan Kilyusufoğlu
14-5
C# 3.0 ile Programlama Temelleri
Emre Ayrılmaz
Editör: Hakan Kilyusufoğlu
Kapak Tasarımı: Melih Sancar
Grafik Tasarım: Tuna Erkan
Grafik Uygulama: Soner Işık
Yayın Yönetmeni: Selçuk Tüzel
Genel Yayın Yönetmeni: Mehmet Çömlekçi
1. Basım: Ocak 2008
Bilge Adam Yayınları: 15
Eğitim Yayınları Dizisi: 15
ISBN: 978-605-5987-14-5
Yayıncı Sertifika No: 1107-34-009150
Copyright © 2007, Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.
Eserin tüm yayın hakları Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.’ye aittir. Yayınevinden yazılı izin
alınmadan kısmen ya da tamamen alıntı yapılamaz, hiçbir şekilde kopya edilemez, çoğaltılamaz ve tekrar yayımlanamaz.
Bilge Adam’ın öğrencilerine ücretsiz armağanıdır, para ile satılamaz.
Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.
19 Mayıs Mahallesi, 19 Mayıs Caddesi, UBM Plaza, No: 59-61, Kat: 4-7; Şişli, İstanbul
Telefon (212) 272 76 00 – (212) 217 05 55 Faks: (212) 272 76 01
www.bilgeadam.com - [email protected]
Tanıtım nüshasıdır, para ile satılamaz.
İçindekiler
Bölüm 1: Programlamaya Giriş ve .NET Platformu������������������������������������������������������������������1
Yazılım Nedir?��������������������������������������������������������������������������������������������������������������������������1
Yazılımcı Kimdir?���������������������������������������������������������������������������������������������������������������������2
Programlama Dilleri������������������������������������������������������������������������������������������������������������������2
Bölüm 2: Microsoft Visual Studio Arayüzü�������������������������������������������������������������������������������9
Visual Studio Kurulumu������������������������������������������������������������������������������������������������������������9
Visual Studio Ortamı��������������������������������������������������������������������������������������������������������������12
Yardımı Kullanmak�����������������������������������������������������������������������������������������������������������������19
LAB 2.1 Dinamik Yardım��������������������������������������������������������������������������������������������������������20
Lab 2.2 Contents��������������������������������������������������������������������������������������������������������������������20
Lab 2.3 Arama������������������������������������������������������������������������������������������������������������������������20
Lab 2.4 İndeks������������������������������������������������������������������������������������������������������������������������21
Lab 2.5 Pencereler ile Çalışmak��������������������������������������������������������������������������������������������21
Bölüm 3: Visual C# .NET ile Windows Tabanlı Programlama�����������������������������������������������25
İlk Uygulama���������������������������������������������������������������������������������������������������������������������������25
Visual C# .NET Kontrolleri������������������������������������������������������������������������������������������������������25
Özellikler, Metotlar ve Olaylar������������������������������������������������������������������������������������������������30
Lab 3.1 Button Yakalama�������������������������������������������������������������������������������������������������������34
Lab 3.2 Dokunma!������������������������������������������������������������������������������������������������������������������36
Lab 3.3 Dijital Saat�����������������������������������������������������������������������������������������������������������������39
Ödevler�����������������������������������������������������������������������������������������������������������������������������������40
Bölüm 4: Değişkenler ve Veri tipleri����������������������������������������������������������������������������������������43
Değişkenler����������������������������������������������������������������������������������������������������������������������������43
Veri Tipleri������������������������������������������������������������������������������������������������������������������������������46
Çıkış Dizisi������������������������������������������������������������������������������������������������������������������������������49
Aritmetik Operatörler��������������������������������������������������������������������������������������������������������������52
Lab 4.1 Personel Formu���������������������������������������������������������������������������������������������������������53
Lab 4.2 Global Değişken��������������������������������������������������������������������������������������������������������55
Lab 4.3 Topla Birleştir������������������������������������������������������������������������������������������������������������56
Ödevler�����������������������������������������������������������������������������������������������������������������������������������57
IV
İçindekiler
Bölüm 5: Hatalar ve Hataların Giderilmesi������������������������������������������������������������������������������61
Giriş����������������������������������������������������������������������������������������������������������������������������������������61
Hatalar������������������������������������������������������������������������������������������������������������������������������������62
Lab 5.1 Yaş hesaplama����������������������������������������������������������������������������������������������������������77
Lab 5.2 Dışarıdan uygulama çalıştırma����������������������������������������������������������������������������������79
Lab 5.3 Geçiş Notu Hesaplama���������������������������������������������������������������������������������������������81
Ödevler�����������������������������������������������������������������������������������������������������������������������������������84
Bölüm 6: Algoritma�������������������������������������������������������������������������������������������������������������������89
Algoritma Nedir?���������������������������������������������������������������������������������������������������������������������89
Akış Diyagramı�����������������������������������������������������������������������������������������������������������������������90
Algoritma Uygulamaları����������������������������������������������������������������������������������������������������������91
Lab 6.1 Stok Takip Yazılımı���������������������������������������������������������������������������������������������������94
Ödev���������������������������������������������������������������������������������������������������������������������������������������94
Bölüm 7: Operatörler ve Karar Yapıları�����������������������������������������������������������������������������������97
Operatörler�����������������������������������������������������������������������������������������������������������������������������97
if Deyimi��������������������������������������������������������������������������������������������������������������������������������101
switch Deyimi�����������������������������������������������������������������������������������������������������������������������103
Lab 7.1 Sayı Tahmin Oyunu�������������������������������������������������������������������������������������������������105
Lab 7.2 Uygulama Yükleyici�������������������������������������������������������������������������������������������������106
Lab 7.3 Şans Oyunu�������������������������������������������������������������������������������������������������������������109
Ödevler���������������������������������������������������������������������������������������������������������������������������������111
Bölüm 8: Döngüler������������������������������������������������������������������������������������������������������������������115
for döngüsü��������������������������������������������������������������������������������������������������������������������������115
while döngüsü����������������������������������������������������������������������������������������������������������������������118
do while döngüsü�����������������������������������������������������������������������������������������������������������������119
foreach döngüsü�������������������������������������������������������������������������������������������������������������������120
Lab 8.1 Tarih Doğrulama������������������������������������������������������������������������������������������������������120
Lab 8.2 Gazeteler�����������������������������������������������������������������������������������������������������������������122
Lab 8.3 Kelime Arama����������������������������������������������������������������������������������������������������������123
Ödevler���������������������������������������������������������������������������������������������������������������������������������124
Bölüm 9: Diziler�����������������������������������������������������������������������������������������������������������������������127
Bazı Dizi Özellikleri ve Metotları�������������������������������������������������������������������������������������������129
Lab 9.1 Sayısal Loto�������������������������������������������������������������������������������������������������������������130
İçindekiler
Ödevler���������������������������������������������������������������������������������������������������������������������������������132
Bölüm 10: Metotlar������������������������������������������������������������������������������������������������������������������135
Metot Nedir?�������������������������������������������������������������������������������������������������������������������������135
Metotları Kullanmak��������������������������������������������������������������������������������������������������������������135
Parametreler�������������������������������������������������������������������������������������������������������������������������136
Kendi Metodumuzu Yazmak������������������������������������������������������������������������������������������������137
Metot Overload���������������������������������������������������������������������������������������������������������������������138
Lab 10.1 Hesap Makinesi�����������������������������������������������������������������������������������������������������140
Lab 10.2 Hepsini Temizle�����������������������������������������������������������������������������������������������������142
Lab 10.3 IsNumeric��������������������������������������������������������������������������������������������������������������143
Ödevler���������������������������������������������������������������������������������������������������������������������������������144
Bölüm 11: String – Math – DateTime Metotları���������������������������������������������������������������������147
String������������������������������������������������������������������������������������������������������������������������������������147
ToCharArray�������������������������������������������������������������������������������������������������������������������������151
Math�������������������������������������������������������������������������������������������������������������������������������������152
DateTime������������������������������������������������������������������������������������������������������������������������������154
IsLeapYear���������������������������������������������������������������������������������������������������������������������������155
Lab 11.1 Kaç Gündür Yaşıyorum�����������������������������������������������������������������������������������������156
Lab 11.2 Kayan Yazı������������������������������������������������������������������������������������������������������������158
Lab 11.3 Kelimeyi Ters Çevir�����������������������������������������������������������������������������������������������159
Lab 11.4 İlk Harf Büyük��������������������������������������������������������������������������������������������������������160
Lab 11.5 Metot Çalışma Zamanı������������������������������������������������������������������������������������������162
Ödevler���������������������������������������������������������������������������������������������������������������������������������164
Ek A: .NET Framework – MSIL – CLR Kavramları����������������������������������������������������������������167
.NET Framework Nedir ?������������������������������������������������������������������������������������������������������167
C# Compiler Kullanarak Uygulama Derlemek����������������������������������������������������������������������168
Wizard (Sihirbaz) Yardımıyla Setup Hazırlamak������������������������������������������������������������������169
Online MSDN Üzerinden Arama������������������������������������������������������������������������������������������173
ToString Metodu – Numerik Biçimlendirme��������������������������������������������������������������������������174
Sunuş
1989…
Bilgisayarla ilk tanıştığım ve Basic dili ile uygulama geliştirdiğim yıllardan itibaren bilgisayar ve
yazılım konusundaki gelişmeleri çok zor takip ettiğimi hatırlıyorum. İnternet yerine BBS’lerin (Bulletin Board System) kullanıldığı o yıllarda belirli konular üzerinde bilgi paylaşımı yapmak ve henüz
yazılımla ilgili kitapların ilk çıktığı bu dönemlerde yazılımı öğrenmek oldukça zordu. Ancak günümüzde internetin hızlı gelişimi, Microsoft’un yazılım hamleleri ve bu konudaki yayınların artışı ile
birlikte bilgi paylaşımı kolaylaştı.
Bu kitap, o yıllarda okumak istediğim kitaptır.
Yusuf Emre Ayrılmaz
1
Programlamaya
Giriş ve .NET
Platformu
1
Programlamaya Giriş ve
.NET Platformu
•
Yazılım Nedir?
•
Yazılımcı Kimdir?
•
Programlama Dilleri
Programlamaya Giriş ve .NET Platformu
Bu bölümde, bir yazılımcının bilmesi gereken temel programlama kavramlarına giriş yapılacaktır.
Bir yazılımı oluşturan öğeler ve yazılım çalışma süreci tamamlanana kadar geçen aşamalar ayrı
ayrı işlenecektir. Bu kavramlar yazılımcının ve programlama dillerinin tanımlanmasına yardımcı
olacaktır.
Bu bölümün sonunda:

Bir yazılımın çalışma prensibini açıklayabilecek,

Yazılımcı kavramını tanımlayabilecek,

Değişik programlama dillerinin gelişimini açıklayabilecek,

Microsoft .NET platformu hakkında genel bilgi sahibi olabileceksiniz.
Yazılım Nedir?
Günümüzde bilgisayarların kullanım alanları büyük ölçüde artmıştır. Dolayısıyla işlerimizi daha
hızlı ve düzenli bir şekilde yapmamız, bilgisayarları ne kadar iyi kullandığımıza bağlıdır. Bunun
için, çeşitli amaçlara göre yazılan uygulamaları kullanırız.
Yazılım, bilgisayarın belli bir işi yapması için tasarlanan komutların tümüdür. Kullanım amaçları ve
yerlerine göre birçok değişik yazılım türü vardır. Örneğin kelime işlemleri için MS Word, formülsel
işlemler için MS Excel, tasarım işlemleri için Adobe Photoshop ve yazılım geliştirme işlemleri için
Visual Studio .NET gibi uygulamalar kullanılır.
Yazılımlar genel olarak üç bölümde incelenebilir,
Sistem Yazılımları: Bilgisayar donanımlarını yöneten, kontrol eden ve uygulamaların çalışabilmesi için gerekli altyapıyı sağlayan yazılımlardır. Sistem yazılımları sayesinde uygulama geliştirici; bellek, işlemci ve diğer donanım özellikleriyle uğraşmadan kendi projesine odaklanır. İşletim
sistemleri bu yazılım türüne örnektir.
Uygulama Geliştirme Yazılımları: Yazılım geliştiricilerin, son kullanıcıların ihtiyaçlarını karşılamak üzere, uygulamaları geliştirmek, derlemek, hata ayıklamak, test etmek ve yayınlamak için
kullandıkları yazılımlardır. Bu yazılımlara örnek olarak, Microsoft Visual Studio .NET, J Developer
ve Eclipse yazılımları verilebilir.
Uygulamalar: Son kullanıcıların belli görevleri yerine getirmek amacıyla kullandıkları yazımlardır.
Bu yazılımlara örnek olarak, endüstriyel otomasyon, müşteri ilişkileri yönetimi, kurumsal kaynak
planlama, tedarikçi zinciri yönetimi uygulamaları verilebilir.
Uygulamalar da kendi aralarında kullanılan teknolojiye göre üç bölümde incelenebilir.
Windows Uygulamaları: Windows uygulamaları, işletim sistemi üzerine kurulan, arayüz ve içerik
bakımından daha zengin uygulamalardır. Windows uygulamaları durum yönetimi, olaya dayalı
programlama, yerel bilgisayar kaynaklarını kullanma gibi özelliklerde web uygulamalarına göre
daha avantajlıdırlar. Bu avantajlarının yanı sıra Windows uygulamalarının tüm istemci bilgisayarlarda tek tek kurulma gereksinimi ve versiyonlama güçlükleri bu uygulamaların kullanımını büyük
ölçüde kısıtlamış, yazılım geliştiricilerin daha çok web uygulamalarına yönelmelerini sağlamıştır.
Windows uygulamalarına örnek olarak, Microsoft Word, Microsoft Excel, Microsoft Live Messenger ve Logo gibi muhasebe uygulamaları verilebilir.
Web Uygulamaları: Bir sunucu tarafından yayınlanan bir web uygulamasını görüntülemek için
istemci tarafında sadece bir tarayıcı uygulaması çalıştırmak yeterlidir, dolayısıyla kurulum ve versiyonlama güçlükleri web uygulamalarında yaşanmaz. Durum yönetimi, olaya dayalı programlama, yerel bilgisayar kaynaklarının kullanımı açısından Windows uygulamalarına göre daha de-
Bölüm 1
zavantajlıdırlar. Web uygulamalarına örnek olarak, banka web siteleri, arama motorları, e-ticaret
siteleri verilebilir.
Kurumsal Uygulamalar: Günümüz uygulamaları, ölçeklenebilirlik, iş yükü ve güvenlik gibi kritik
ihtiyaçlara sahiptirler. Tüm bu kritik ihtiyaçların şüphesiz tek bir uygulama üzerinde giderilmeye
çalışılması hem uygulamanın geliştirilmesi sürecini zorlaştıracak, hem de uygulamanın performansını olumsuz yönde etkileyecektir. Bu sebeple birden fazla sunucu üzerinde çalışan ve farklı
teknolojilerin bütünleşik bir şekilde çalıştığı kurumsal uygulamalar geliştirilmektedir. Bu tür uygulamalara örnek olarak, bankacılık uygulamaları ve kurumsal şirket uygulamaları verilebilir.
Yukarıda sözü geçen tüm bu uygulama türleri ile beraber veya tek başına çalışmak üzere mobil
uygulama çözümleri de geliştirilmektedir.
Yazılımların Çalışma Modeli
Yazılımların kullanılmasındaki amaç, girilen bilgilerin işlenip istenilen şekilde sonuçların üretilmesidir.
Veri girişi: Yazılım, kullanıcıların veri girmesi ile başlar. Girilen veriler daha sonra işlenmek üzere
hafızada saklanır.
İşlem: Veriler, geliştirilen yazılımın çalışma sürecine göre bir dizi işlemden geçirilir.
Sonuç: İşlenen veriler kullanıcıya aktarılır.
Uygulamalar, belli kurallar çerçevesinde yazılır. Bu yazım kuralları sayesinde bilgisayar, programın işleyişini anlar ve gerekli sonuçları çıkartır. Uygulamalar, belirtilen yazım kuralları kontrol
edilerek derlenir. Bu derleme işlemi sonunda, yazılan kaynak kodlar bilgisayarın anlayacağı tek
dil olan makine diline çevrilir.
Yazılımcı Kimdir?
Yazılımcı, belirli işlevlere sahip uygulamalar geliştirebilen uzmandır. Bir yazılımcının, üzerinde
çalıştığı platformu, kullandığı teknolojileri iyi tanıması ve bilgisayarın anlayacağı mantıksal dilde
düşünebilmesi gerekir. Yazılımcılar bir proje takımında veya çalıştıkları şirketlerde üstlendikleri
görevlere göre çeşitli unvanlar alırlar. Bu unvanları aşağıdaki gibi listeleyebiliriz,

Uygulama Geliştirici / Application Developer

Yazılım Mimarı / Software Architect

Yazılım Uzmanı / Software Expert

Veritabanı Uzmanı / Database Expert

Proje Müdürü / Project Manager

Proje Lideri / Project Leader

Analist Programcı / Analyst Programmer

Yazılım Geliştirici / Software Developer

Uygulama Analisti / Application Analyst
Programlama Dilleri
Dünyada konuşulan her dilin amacı iletişim sağlamaktır. Farklı kültürlerden insanların anlaşabilmesi için ortak konuştukları bir dil gerekir. Programlama dillerinin amacı da bilgisayar ile yazılımcının haberleşmesidir. Yazılımcı, bilgisayara hangi komutların çalıştırılması gerektiğini bilgisayarın anlayacağı dilden konuşarak söyler.
Programlamaya Giriş ve .NET Platformu
Uygulamalar, makine diline çevrildikten sonra çalışırlar. Numerik makine kodları ve o bilgisayara
ait işlemci mimarisi komutlarından oluşan bu makine dili, en alt seviye dildir. Dolayısıyla yazılımların bu dilde yazılması oldukça zordur, bu yüzden konuşma diline daha yakın, kolay anlaşılabilecek diller kullanılır. Bu dillere yüksek seviye programlama dilleri denir. Programlama dillerinin
seviyeleri makine diline yakın olup olmaması ile ölçülür.
Bir programlama dili şu unsurlardan oluşur,
Söz dizimi (Syntax): Bir dil, kendine ait kelimeler ile konuşulur. Programlama dillerinin de benzer
bir yapısı vardır. Programlama dillerindeki bu kelimeler, programlama dilinin anahtar kelimelerini
– komutlarını oluştururlar.
Gramer (Dilbilgisi): Programlama dillerini kullanmak için sadece kelimeleri bilmek yeterli değildir. Eğer anlamlı bir şekilde bir araya getirilemiyorsa, bu kelimeler hiçbir anlam ifade etmez.
Semantik (Anlamsal): Bir dili, kelimeleri doğru bir gramer kullanımı ile bir araya getirerek kullanabiliriz. Ancak konuşulan kelimelerin ne için kullanıldığı da önemlidir. Bir programlama dilinin
özelliklerinin nasıl ve ne için kullanıldığı da, bu dilin semantiğidir.
Şu ana kadar 2500’den fazla programlama dili yazılmıştır. Bunlardan bazıları Pascal, Basic, C,
C++, Java, Javascript, Cobol, Perl, Python, Ada, Fortran, Visual Basic .NET ve Visual C# programlama dilleridir.
Yüksek seviye programlama dillerine Visual Basic .Net, Java ve Visual C#, düşük seviye programlama dillerine ise Fortran ve C örneğini verebiliriz.
Programlama Dillerinin Tarihçesi
Geçmişten günümüze bilgisayarların tarihçesine baktığımız zaman, dört önemli bilgisayar kuşağı
sayabiliriz,
1. Kuşak Bilgisayarlar, 1943 yılında Pennsylvania üniversitesinde J.P. Erkert tarafından
geliştirilmiştir, 30 ton ağırlığında olan bu bilgisayarda vakumlu tüpler kullanılmıştır. Saniyede 5000 işlem kapasitesine sahiptir. ENIAC
(Electronic Numerical Integrator and Calculator) (Elektronik Sayısal Doğrulayıcı ve Hesaplayıcı) ismine sahip bu bilgisayar, 6000 kablo
kullanılarak geliştirilmiştir ve çalışması için
150.000Watt enerjiye ihtiyaç duymaktadır.
2. Kuşak Bilgisayarlar, 1955 - 1965 yılları Şekil 1.1
arasında Burroughs firması tarafından Amerikan Hava Kuvvetleri için geliştirilmiştir. Vakumlu tüpler
yerine transistörlerin kullanılmasıyla maliyet düşmüş, hız
yükselmiştir. İlk işletim sistemi Fortran ve Assembler dilleri
kullanılarak bu dönemde yazılmıştır.
3. Kuşak Bilgisayarlar, 1965 - 1980 yılları arasında entegre devreler kullanılarak geliştirilmiştir. Yine aynı dönemde, 1973’te C dili ve Bell laboratuvarlarında Thompsonve
Ricthie tarafından Unix işletim sistemi yazılmıştır.
4. Kuşak Bilgisayarlar, 1980 sonrası mikroçipler kullanılarak geliştirilen bilgisayarlardır, IBM 8086 serisi ile başlayan bu kuşak günümüzde kullandığımız bilgisayarları da
içermektedir.
Şekil 1.2
Bölüm 1
Bilgisayarlar, icat edilmeleriyle birlikte belli bir işi yapmak için bir dizi komutlara ihtiyaç duymuşlardır. En başta çok basit işlemler yapan bu komutlar zamanla nesne yönelimli (object oriented) gibi
ileri seviyede özellikler kazanmıştır.
İlk programlama dilleri, bilgisayarların üzerinde bazı araçların yerlerini değiştirerek veya yeni bileşenler eklenerek yapılıyordu. Yazılımın işlemesi için bir devinime ihtiyaç vardı. Eskiden yazılımlar
fiziksel olarak yazılıyordu. Daha sonra fiziksel programlama yerini elektrik sinyaline bıraktı. Kurulan elektronik devrelere düşük ya da yüksek voltajda akım gönderilerek bilgisayarın davranışı
belirlenmeye başlandı. Yüksek voltaj 1, düşük voltaj 0 sayılarını ifade ediyordu. Böylelikle bugün
de kullanılan makine dilinin ortaya çıkması için ilk adımlar atılmış oldu.
Ancak bu şekilde yazılımlar geliştirmek, sistemi oluşturan elektronik devrelerin her yazılım için
baştan kurulmasını gerektiriyordu. Böylelikle yazılımlar bazı kavramlar çerçevesinde yazılmaya
başlandı. Öncelikle bilgisayar donanımı her yazılım için baştan kurulmamalı, bunun yerine basit
bir donanımın üzerine yazılan komutlar kullanılmalıydı. Daha sonra, yazılımlar tek bir komutlar
kümesi yerine, küçük parçalar halinde yazılmaya başlandı. Bu parçaların yazılımın içinde defalarca kullanılabilmesi yordam (subroutine veya metot) kavramını ortaya çıkarmıştır. Bu modelin
kullanılması ise mantıksal karşılaştırmaları, döngülerin kullanılmasını ve yazılan kodların tekrar
kullanılabildiği kütüphane (library) mantığını ortaya çıkarmıştır.
1957 yılında IBM, düşük seviye (makine diline yakın) bir programlama dili olan FORTRAN dilini
ortaya çıkardı. FORTRAN ile beraber basit mantıksal karşılaştırmalar, döngüler, mantıksal ifadeler (true-false) ve sayısal değişkenler (integer, double) kullanılmaya başlandı.
1959 yılında, bu programlama dilinin özelliklerini alıp, giriş-çıkış (Input – Output IO) gibi yeni işlevler sağlayan COBOL dili ortaya çıktı. Daha sonra 1968 yılında, COBOL ve FORTRAN dillerinin en
iyi özelliklerini alarak Pascal dili ortaya çıktı. Ayrıca Pascal dili, hafızadaki adresler üzerinde işlem
yapmaya olanak veren işaretçi (pointer) kavramını da beraberinde getirdi.
1972 yılında C, Pascal dilindeki birçok hatayı gidererek ortaya çıktı. C dili ilk defa Unix işletim
sistemini yazmak için kullanılmaya başlanmıştır. C, düşük seviye bir dil olması özelliği ile işletim
sistemlerinin yazılmasında tercih edilmiştir.
Bütün programlama dilleri birçok özelliğe sahip olmasına rağmen, modüler programlamanın birçok eksiğini gidermek amacıyla, yeni bir programlama modeli olan nesneye yönelik programlama
- OOP (object oriented programming) ortaya çıkarıldı. C dilinin ve OOP modelinin tüm özellikleriyle C++ dili oluşturuldu.
C++ dilini, Sun Microsystems tarafından çıkartılan Java takip etti. Java dilinin kullanım alanları,
nesneye yönelik bir programlama dili olması ve beraberinde getirdiği GC (garbage collection) gibi
performans arttırıcı özellikleri ile büyük ölçüde genişledi.
Microsoft 1975 yılında Bill Gates ve Paul Allen tarafından kurulduğunda vizyonu “A pc for every
desk” (Her masaya bir pc) idi, bugün ise “Every desk is a pc” (Her masa bir pc) oldu. Donanım ve
yazılım alanlarındaki gelişmelerin hızı ve birbirlerini sürekli tetiklemesinin sonucunda bilgisayar
kullanıcı sayısı hızla arttı. Artan kullanıcı sayısı beraberinde yeni gereksinim ve talepleri ortaya
çıkardı. Bu taleplerin doğal sonucu olarak da farklı platformlar ve farklı servis sağlayıcıları ortaya
çıktı. İletişim, finansal hizmetler, ticaret, eğlence kullanıcıların (özellikle internetin yaygınlaşmasıyla birlikte) en yoğun talep gösterdiği hizmetler halini aldı. Günümüze baktığımızda Microsoft’un
çıkış noktasındaki hedefine büyük oranda ulaştığını görebiliyoruz. Ancak geldiğimiz noktada hızla
artan bilgisayar ve internet kullanıcı sayısı, beraberinde güvenlik, iletişim, entegrasyon v.b. alanlarda çeşitli engellerin ortaya çıkmasına neden oldu.
İhtiyaç duyduğumuz tüm bu altyapı işlemleri için hazır, kullanımı kolay ve esnek bir platforma
ihtiyaç vardı, Microsoft, 2000 yılında .NET platformunu sunarak, otuzdan fazla programlama dilini
aynı çatı altında topladı. VisualBasic. NET ve C#, .NET platformunu kullanan günümüzdeki en
Programlamaya Giriş ve .NET Platformu
güçlü yüksek seviyeli programlama dilleri arasında yer almışlardır. Bugün, .NET platformuyla
40’ın üzerinde programlama dili kullanılabilir.
.NET Vizyonunun Oluşumu
Microsoft, vizyonu doğrultusunda attığı adımların yazılım geliştiricilere yansıyan sonuçlarını sürekli izliyordu ve yazılım geliştiricilerin sorunlarını şu başlıklar altında ele alıyordu.

Uygulamaların yani yazılımların, sistemlerin, kurumlardaki birimlerin ve farklı kurumların arasındaki iletişim sorunu.

Çalışanların ihtiyaç duydukları verilere, ihtiyaç duydukları an, kesintisiz, hatasız, güvenli ve
istedikleri platformdan erişebilme ihtiyacı.

Uygulama geliştirme sürecinde, geliştiricilerin altyapı kodları ile uğraşmasından dolayı uygulama geliştirme ve test süresinin uzaması.

Bir uygulamanın farklı platformlarda çalıştırılabilmesi için aynı işlemleri gerçekleştirecek kodların tekrar tekrar yazılması ihtiyacı.
Microsoft 1990 yılında, yaşanacak 10 yılı da öngörerek bu ve benzeri sorunlara çözüm sunacak, uygulama geliştiricilerin ve son kullanıcıların işlerini kolaylaştıracak bir platform geliştirmeye
başladı. Microsoft bu platforma öylesine inanıyordu ki kaynaklarının %80’inden daha fazlasını,
bu platforma taşıdı. Çok geniş bir analiz ve geliştirme ekibinin çalışmalarının sonucunda .NET
platformu ortaya çıkmıştır.
Microsoft .NET platformu her türlü yazılım geliştirme ihtiyacına yönelik hazır bir altyapı sunarak
uygulama geliştiricilerin Windows, web ve mobil platformlarına yönelik uygulamaları, çok daha
hızlı, kolay ve güçlü bir şekilde geliştirebilmelerine olanak tanıdı.
2
Microsoft
Visual Studio
Arayüzü
2 Microsoft Visual Studio
Arayüzü
•
Visual Studio Kurulumu
•
Visual Studio Ortamı
•
Yardımı Kullanmak
•
Lab 2.1 Dinamik Yardım
•
Lab 2.2 Contents
•
Lab 2.3 Arama
•
Lab 2.4 İndeks
•
Lab 2.5 Pencereler ile Çalışmak
Microsoft Visual Studio Arayüzü
Bu bölüm, Microsoft Visual Studio arayüzünü tanımayı ve etkili bir biçimde kullanmayı anlatır.
Nasıl ki, ev ve iş yerindeki çalışma ortamını düzenlemek daha verimli çalışmayı sağlarsa yazılım
geliştirirken de çalışılan ortamı tanımak ve kişiselleştirmek rahat çalışılması açısından önemlidir.
Bu bölümü tamamladıktan sonra:

Microsoft Visual Studio kurulumunu öğrenecek,

Microsoft Visual Studio çalışma ortamını tanıyacak,

Menülerin işlevlerini açıklayabilecek,

Başlangıç sayfasının özelliklerini kullanabilecek,

Solution Explorer, Toolbox, Properties pencerelerini tanıyacak,

Microsoft Visual Studio Yardımı etkili bir şekilde kullanabileceksiniz.
Visual Studio Kurulumu
Bu bölümde, Visual Studio 2008’in kurulumunu ekran görüntüleri üzerinden adım adım gerçekleştireceğiz.
İlk olarak Visual Studio 2008’in kurulum DVD’sine ihtiyaç duymaktayız. Bu ihtiyacı karşıladıktan
sonra yapılacak tek şey DVD’yi DVD sürücüsüne yerleştirmek ve karşımıza çıkan yönergeleri takip etmek olacaktır. DVD’yi DVD sürücüsüne yerleştirdiğimizde karşımıza Şekil 2.1’deki Autorun
(Otomatik Başlat) ekranı çıkmaktadır.
Şekil 2.1
Install Visual Studio 2008 seçeneğine tıklayarak kurulum işlemine başlıyoruz.
10
Bölüm 2
Şekil 2.2
Bir sonraki ekranda Next düğmesine tıklayarak kuruluma devam ediyoruz.
Şekil 2.3
“I have read and accept the license terms” seçeneğini seçtikten sonra Next düğmesine tıklayarak
kuruluma devam ediyoruz.
Microsoft Visual Studio Arayüzü
Şekil 2.4
Default seçeneğini seçip ilgili boyutlandırma seçeneklerini inceledikten sonra Install düğmesine
tıklayarak kurulumu başlatıyoruz.
Şekil 2.5
11
12
Bölüm 2
Kurulum tamamlanana kadar bekliyoruz...
Şekil 2.6
Kurulum başarılı bir şekilde tamamlandığında şekilde ki ekran üzerinde bulunan Finish düğmesine tıklayarak kurulumu sonlandırabiliriz. Opsiyonel olarak bilgisayarın yeniden başlatılmasının
istenildiği durumlarda bilgisayar kesinlikle yeniden başlatılmalıdır.
Visual Studio Ortamı
Visual Studio, çok gelişmiş özelliklere ve yardımcı araçlara sahip bir editördür. .NET platformu
üzerinde geliştirilen proje dosyaları dışında metin dosyaları, resim dosyaları gibi dosyalar da düzenlenebilir. Visual Studio ortamını oluşturan ve kullanımını kolaylaştıran dört ana bileşen vardır.
Bunlar, Çalışma Sayfaları, Araç Çubukları, Menüler ve Pencerelerdir.
Çalışma Sayfaları
Visual Studio ortamında dosyalar, birer çalışma sayfası (Tab Pages) olarak açılır. Bu dosyalar
sekmeler halinde sıralanır. Sayfalar arasında CTRL-TAB kısayolu ile geçiş yapılabilir.
Varsayılan olarak bu çalışma modelinde, eş zamanlı olarak sadece bir sayfa üzerinde çalışma
yapılır. Ancak Visual Studio bize, çalışma ortamını parçalara bölme imkânı da verir.
Örnek:
1. Visual Studio çalışma ortamını açın. Başlangıç sayfası (Start Page) karşınıza çıkar. (Eğer
başlangıç sayfası çıkmıyorsa View menüsünden, Other Windows alt menüsüne işaret edin
ve Start Page komutunu seçin.)
2. View menüsünden, Other Windows alt menüsüne işaret edin ve Web Browser komutunu seçin. Visual Studio açmak istediğimiz internet tarayıcısı için yeni bir sayfa oluşturur.
3. CTRL tuşuna basılı tutarak TAB tuşuna basın. Karşınıza çıkan menüden, açık olan herhangi
bir sayfayı seçin.
4. Başlangıç sayfasının sekmesine sağ tıklayın ve çıkan menüden New Vertical Tab Group
komutunu seçin. Visual Studio birden fazla sayfa üzerinde çalışma imkânını, sayfaları sekme
gruplarına ayırarak sağlar.
Microsoft Visual Studio Arayüzü
5. Başlangıç sayfasını, sayfa başlığına basılı tutarak, internet tarayıcısının bulunduğu sekme
grubuna taşıyın.
Başlangıç Sayfası
Visual Studio çalışma ortamını açtığımız zaman karşımıza ilk gelen
başlangıç sayfasıdır. Bu sayfa, o Şekil 2.7
ana kadar çalıştığınız projeleri ve
Visual Studio ortamını
.NET platformuna yönelik güncel haberleri gösterir. Bu menüden üzebir web tarayıcısı olarak
kullanabilirsiniz.
rinde çalıştığınız son projelerinizi (Recent Projects) açabilirsiniz. Son
projelerde gözükmeyen bir projeyi açmak için Open
Başlangıç sayfasını kapattıktan sonra, View menüProject veya yeni bir proje oluşturmak için Create
sünden Other Windows alt seçeneğini işaretleyip
Start Page seçeneğine tıklayarak açabilirsiniz.
Project seçeneğini seçebilirsiniz.
Şekil 2.8
Araç Çubukları
Visual Studio, menü komutları için görsel kısayolları araç çubukları (Toolbars) ile sunar. Benzer
işlemler için kullanılan komutlar bir araç çubuğunda gruplanır. Örneğin standart araç çubuğu, yeni
dosya oluşturmak, bir dosyayı açmak - kaydetmek gibi genel dosya işlemleri için kullanılır.
Araç çubukları, varsayılan olarak menülerin altında bulunur. Ancak, araç çubukları taşınarak yerleri değiştirilebilir veya kayan duruma (float) getirilebilir. Ayrıca istenen çubuklar gizlenebilir veya
gösterilebilir. Araç çubuklarının listesini görmek için View menüsünden Toolbars alt menüsünü
seçin.
Visual Studio bize kendi araç çubuklarımızı oluşturma imkânı da verir. Farklı işlevlere sahip komutlar gruplanıp, kişisel araç çubuğu oluşturulabilir.
13
14
Bölüm 2
Örnek:
1. Başlangıç sayfasının üst kısmında bulunan bir araç çubuğuna sağ tıklayın. Çıkan menü, var
olan tüm araç çubuklarını listeler. İşaretli olan çubuklar eklenmiş çubuklardır. Bu listeden
Formatting araç çubuğunu seçin.
2. Web araç çubuğu üzerinde Formatting araç çubuğunu forma doğru sürükleyip bırakın. Bu
işlem çubuğu floating (kayan menü) duruma getirir. Başlığına çift tıklandığında, çubuk Dockable (sabit duruma) gelir.
3. Araç çubuğuna sağ tıklayın. Listenin en altındaki Customize (özelleştir) komutunu seçin.
4. Toolbars sekmesinde New (Yeni) komutuna tıklayın. Çıkan pencerede çubuğa “Genel İşlemlerim” yazın. OK düğmesine basın. Visual Studio verilen isimde bir araç çubuğu oluşturur ve
kayan durumda görüntüler.
5. Commands (Komutlar) sekmesinde, Categories (Kategoriler) listesinden Help kategorisini
seçin. Bu listenin yan tarafında bulunan Commands listesinden Index komutunu bulun. Bu
komutu taşıyıp, oluşturduğumuz Genel İşlemlerim araç çubuğuna bırakın.
Şekil 2.9
6. Bu şekilde şu komutları da ekleyin.
Categories
Commands
Tools
Options
File
Exit
View
Web Browser
Window
Close All Documents
7. Araç çubuğunu, çalışma ortamının altına taşıyarak sabitleyin.
8. Araç çubuğuna sağ tıklayın ve listeden Genel İşlemlerim (General Operations) çubuğunu
seçerek çalışma ortamından kaldırın.
Menüler
Visual Studio menüleri birçok uygulamanın menülerine benzer niteliktedir. Menü isimlerinde, belirli bir harfinin altı çizilmiştir. Belirtilen harfler ALT tuşu ile birlikte basıldığında, o menülere kısayolla ulaşılır. Menü komutlarının bazılarında ise, sadece o komuta özel bir kısayol tanımlıdır. Bu
kısayollar CTRL veya SHIFT gibi birkaç tuş kombinasyonu ile gerçekleşir.
Microsoft Visual Studio Arayüzü
File Menüsü
Tüm dosya işlemleri bu menü altındadır. Standart araç çubuğu ile bu menüdeki bazı komutlara
ulaşılır. File menüsündeki komutlar ile:

Yeni bir proje, bir dosya veya boş bir solution (çözüm) oluşturmak,

Oluşturulmuş bir projeyi veya var olan bir dosyayı açmak,

Web üzerinde paylaştırılmış dosya veya projeler açmak,

Açık olan dosya veya projeleri kapatmak,

Recent Files ile en son kullanılan dosyaları açmak,

Recent Projects ile en son kullanılan projeleri açmak,

Dosyaları kaydetmek, yazdırmak mümkündür.
Edit Menüsü
Tüm yazı düzenleme işlemleri için, bu menüdeki komutlar kullanılır. Text Editor araç çubuğu da
bu menünün kısayoludur. Edit menüsündeki komutlar ile:

Copy, Cut, Paste, Delete, Select All gibi temel işlemler,

Find And Replace, Go, Bookmark gibi navigasyon işlemleri,

Outlining ile metinleri gruplama işlemleri,

Satırları yorum satırı yapma, yorum satırlarını kaldırma, büyük küçük harf çevrimi gibi ileri
seviye işlemler gerçekleştirilir.
View Menüsü
Visual Studio çalışma ortamındaki tüm pencereler bu menü komutlarıyla gösterilir. Ayrıca Navigate Backward ve Navigate Forward komutlarıyla en son çalışılan satıra geri dönülür.
Diğer Menüler
Refactor (Yeniden Düzenleme); Kod üzerinde çeşitli değişiklikleri kolayca yapabilmemizi sağlayan seçenekler bu menü altındadır.
Project (Proje): Projeye dosya eklemek, çıkarmak, proje özelliklerini göstermek ve referans eklemek için bu menü kullanılır.
Build (Derleme): Projelerin çalışmak üzere derlenmesi için gereken komutlar, bu menü altındadır.
Debug (Hata Ayıklama): Projede hata ayıklarken gereken komutlar Debug menüsü altındadır.
Projeyi debug durumunda başlatmak, BreakPoint eklemek (hata ayıklarken durulması gerek satırları ayarlamak) gibi işlemler yapılır.
Tools (Araçlar): Visual Studio ile beraber yüklenen yardımcı araçların listelendiği menüdür. Araç
çubuklarını özelleştirmek için kullanılan Customize seçeneği gibi Options seçeneği de en sık
kullanılan özelliklerden biridir. Visual Studio çalışma ortamının tüm ayarları Options menüsünden
yapılır. Environment ve Text Editor en sık kullanılan seçeneklerdir.
Environment (Ortam): Sayfa düzeni ve görünüm ayarları, yazı tipi (font) ve renk ayarları, komutlar için kısayol ayarları, internet tarayıcısı ayarları, yardım ve dinamik yardım ayarları yapılır.
Text Editor (Metin Düzenleyicisi): Farklı programlama dillerine özgü yazı düzeni yapılır.
Örnek:
1. Tools menüsünden Options komutunu seçin.
2. Sol pencerede bulunan Environment menüsünden Fonts and Colors (Yazı Tipi ve Renkler)
sekmesine gelin.
15
16
Bölüm 2
3. Sağ pencerede bulunan Display items (Öğeleri Listele) menüsünden Numbers (Numaralar)
alanını seçin ve Item foreground (Öğe ön planı) özelliğini Purple (Mor) olarak belirleyin. Tüm
sayı değerlerinin rengi mor olacaktır.
Şekil 2.10
4. Sol penceredeki Environment menüsünden Web Browser sekmesine gelin. Home Page metin kutusuna www.bilgeadam.com yazın.
5. Sol penceredeki Text Editor menüsünden C# alt menüsünü seçin. Burada C# diline özel
metin düzenleme seçenekleri bulunur. Sağ pencerede, Display sekmesinin altında Line Numbers (Satır Numaraları) seçeneğini işaretleyin. Bu seçenek, C# projelerinde çalışırken satır
numaralarını gösterir.
Window (Pencere): Sayfaların ve pencerelerin görünümlerini ve özelliklerini değiştirmek için kullanılan komutlar bu menü altında bulunur. Tüm açık çalışma sayfaları bu menü altında görüldüğü
gibi, istenen sayfa seçilerek ön plana getirilir. Ayrıca, Close All Documents (Tüm Sayfaları Kapat)
komutu ile açık olan bütün sayfalar kapatılır. Auto Hide All (Tümünü Otomatik Gizle) komutu ile
sabit hale getirilmiş tüm pencereler gizlenir.
Community (Topluluk): Yazılımcıların birbirlerine soru sorup, cevap alabilecekleri ve yazılımcıları örnek kodlar, üçüncü parti kontroller bulabileceği sitelere yönlendiren seçenekler bu menüde
bulunur.
Help (Yardım): Visual Studio çalışma ortamında çok sık kullanılan yardım pencerelerinin görünümü bu menü ile sağlanır. Bu menü ile ayrıca, kullanılan Visual Studio çalışma ortamının sürümü
hakkında bilgi alınır, son güncellemeler kontrol edilir, teknik destek için gereken iletişim bilgilerine
ulaşılır.
Pencereler
Pencereler, Visual Studio içinde uygulama geliştirirken kullanılabilecek birçok elemanı belli gruplar halinde tutan alanlardır. Çalışma ortamında birçok pencere bulunmasıyla beraber en sık kullandıklarımız, Solution Explorer, Toolbox, Object Browser, Properties, Watch, Output, Search Result, Task List pencereleridir.
Görmek istediğiniz pencerelerin çoğunu View menüsünden seçebilirsiniz.
Pencereler, Visual Studio ortamı içerisinde istenilen yere taşınabilir
veya sabitlenebilir. Pencerelerin birkaç genel özelliği vardır:
Auto Hide (Otomatik Gizle): Pencerelerin, fare üzerindeyken gözükmesi ve fare çekildikten sonra gizlenmesidir.
Dockable (Sabitlenebilir): Pencerelerin, Visual Studio ortamı içerisinde bir yerde sabitlenebilme
özelliğidir.
Microsoft Visual Studio Arayüzü
Floating (Kayan): Kayan pencereler herhangi bir yere sabitlenemez, her sayfanın üstünde durur
ve böylece sürekli görünür.
Pencerelerin bu özelliklerine Window menüsünden erişilebilir.
Örnek:
1. View menüsünden Other Windows alt menüsünü işaret edin ve Macro Explorer penceresini
seçin. Pencerenin başlığında, biri Auto Hide diğeri Close olan iki düğme görülür. (Pencerenin
çıktığı yere göre sadece Close düğmesi de gözükebilir. Diğer seçeneklerin çıkması için pencerenin başlığına çift tıklayıp, pencereyi Dockable durumuna getirin.)
2. Auto Hide düğmesine (Raptiye ikonlu düğme) basarak pencereyi gizleyin.
3. Pencereyi tekrar seçin, Window menüsünden Auto Hide özelliğini seçin. Daha sonra aynı
menüden Floating özelliğini seçin. Pencerenin taşınabildiğini ancak sabitlenemediği görülür.
4. Tabbed Document seçeneğini seçin. Pencerenin sekme olarak forma yerleştiği görülür.
5. Pencere seçili iken, Window menüsünden Dockable özelliğini seçin. Bu sefer pencerenin,
taşındığı zaman çalışma ortamının herhangi bir yerine sabitlenebildiği görülür.
6. Pencere seçili iken, Window menüsünden Hide komutunu seçin. Pencereyi tekrar açmak için
bu etapları tekrarlayın.
Solution Explorer Penceresi
Visual Studio çalışma ortamında projeler bir solution (çözüm) altında açılır. Bir solution içine farklı
dilde ve tipte projeler dâhil edilebilir. Visual Studio ile bir solution açıldığında, Solution Explorer
penceresi solution içinde bulunan tüm projeleri, ilgili dosya ve klasörleri görüntüler. Pencerede
koyu yazı tipinde görünen proje, solution içindeki başlangıç projesidir.
Bu pencereden, öğeler üzerinde silme, kopyalama, taşıma, ismini değiştirme işlemleri yapılabilir. Ayrıca pencerenin üst kısmında, seçilen
öğe üzerinde basit işlemler gerçekleştirmek için bir araç çubuğu bulunur.
Refresh (Yenile): Proje dosyaları üzerindeki değişikliklerin görünmesini sağlar.
Show All Files (Tüm Dosyaları Göster): Seçilen projenin bulunduğu
klasördeki tüm dosyaları ve alt klasörleri gösterir. Pencerede görünen
beyaz öğeler proje içine dâhil edilmemiş öğelerdir. Proje kapsamında
kullanılmak istenen öğeler (örneğin arka plan resmi), üzerine sağ tıklanıp Include In Project komutu ile projeye dâhil edilmelidir.
Şekil 2.11
Properties (Özellikler): Penceredeki tüm öğelerin özellikleri, Properties komutu ile görülebilir. Bu komut seçildiğinde, öğenin özellikleri
Properties penceresi ile görüntülenir. (Properties penceresi bu bölümde detaylı olarak ele alınacaktır.)
Solution Explorer penceresi, View menüsünden görülebildiği gibi, varsayılan klavye seçeneklerinde CTRL-ALT-L kısayolu ile de görülebilir.
Solution Explorer penceresinde Solution bölümünü göremiyorsanız, Tools (Araçlar) menüsünden Options (Seçenekler) komutunu seçin. Açılan pencerede Projects and Solutions (Projeler ve Solution’lar) altında bulunan
Always Show Solution (Her Zaman Solution’ı Göster) kutusunu işaretleyin ve OK komutu ile çıkın.
17
18
Bölüm 2
Toolbox Penceresi
Toolbox (Araç Kutusu) penceresi, projelerde kullanılan çeşitli kontrollerin listelendiği penceredir. Buradaki öğeler, sekmeler içinde gruplanmıştır. Her sekme, ortak platformlarda çalışan veya benzer işlevleri
olan kontrollere sahiptir. Örneğin, Data sekmesinde veri tabanı işlemlerinde kullanılan kontroller vardır. Printing kontrolleri Windows platformunda çalışan projelerdeki çıktı işlemlerinde kullanılır.
Şekil 2.12
Toolbox penceresinde kontroller, isimlerine göre sıralanmaktadır.
Örneğin Common Controls sekmesinde en üstte Button, CheckBox,
CheckedListBox ve ComboBox kontrolleri bulunur. Kontroller, yerleri
ve sıraları taşınarak değiştirilebilir, ayrıca başka bir sekmeye de taşınılabilir.
Visual Studio çalışma ortamı, Toolbox penceresindeki kontrollere yeni
isim verme, kontrolleri silme veya pencereye yeni sekmeler ve kontroller ekleme imkanlarını da
sağlar.
Örnek:
1. Common Controls sekmesinde TextBox kontrolüne sağ tıklayın. Çıkan menüden Rename
Item (Öğenin İsmini Değiştir) komutunu seçin ve Metin Kutusu yazın.
2. Ortaya çıkan Metin Kutusu kontrolünü taşıyarak sekmenin en üstüne getirin.
3. Pencereye sağ tıklayın ve Sort Items Alphabetically (Nesneleri Alfabetik Olarak Sırala) komutunu seçin. Metin Kutusu kontrolünün, alfabetik sırada yerini aldığı görülür.
4. Metin Kutusu kontrolünün adını TextBox olarak değiştirin.
5. Pencereye sağ tıklayın ve Add Tab komutunu seçin. Sekmeye Medya ismini verin.
6. Sekmeye sağ tıklayın ve Choose Items (Öğeleri Seç) komutunu seçin. Choose Toolbox Items
diyalog kutusu çıkar. Burada Toolbox penceresine eklenebilecek tüm kontroller listelenir.
Com Components sekmesine gelin ve listeden Windows Media Player kontrolünü işaretleyin.
OK düğmesine basarak, diyalog kutusunu kapatın. Windows Media Player kontrolünün, oluşturulan Medya sekmesine eklendiği görülecektir.
Toolbox penceresine varsayılan klavye seçeneklerinde CTRLALT-X kısayolu ile ulaşılır.
Properties Penceresi
Properties (Özellikler) penceresi, seçilen bir nesnenin özelliklerini görüntüler. Penceredeki görünüm, Özellik Adı - Değeri şeklindedir. Silik olarak görünen özellikler salt okunurdur ve değiştirilemez. Pencerenin üzerindeki açılır liste, çalışma sayfasındaki
kontrolleri listeler. Buradan istenilen kontrol seçilerek özellikleri
görüntülenir.
Penceredeki özellikler kategorilere göre gruplanmıştır, ancak alfabetik olarak da dizilir. Pencerenin üstünde bulunan araç kutusundan Categorized (Kategorileştirilmiş) veya Alphabetical (Alfabetik) seçilerek özelliklerin görünümleri değiştirilir.
Şekil 2.13
Bir kontrolün üzerindeyken
F4 tuşuna basınca, Properties penceresi görüntülenir.
Pencerenin en altında bulunan menüde, her özelliğin açıklaması
bulunur.
Microsoft Visual Studio Arayüzü
Yardımı Kullanmak
Yazılım geliştirirken en çok kullanacağımız kaynaklar
yardım dosyaları olacaktır. Bir programlama dilinin çok
çeşitli özellikleri, kullanım farklılıkları olabilir. İyi bir yazılımcı bütün bu özellikleri ezbere bilen değil, bu özellikleri
en kısa sürede bulan, öğrenen ve kullanandır. Yardım
dosyalarının kullanımını bilmek, yazılımcılığın temelini
oluşturan önemli unsurlardan biridir.
Visual Studio Yardımı yazılımcıya, gelişmiş özelliklere
sahip pencereler ve yardım dosyaları ile geniş bir kullanım kolaylığı sağlar.
Visual Studio Yardım dosyalarının yapısı başlık, içerik
ve ilişkili konulardan (See Also) oluşmuştur. Ayrıca her
yardım dosyasının altında bulunan Send Comments
bağlantısı ile konu hakkında yorum gönderilebilir.
Visual Studio yardım pencereleri Dynamic Help, Search, Index ve Contents olarak dörde ayrılır. Bu pencereler, Help menüsünden ulaşılabilir.
Şekil 2.14
Visual Studio Yardımını kullanmak için, MSDN
(Microsoft Developer Network) yardım kütüphanelerinin yüklenmiş olması gerekir.
Dynamic Help
Dynamic Help (Dinamik Yardım) penceresi, içeriği otomatik olarak değişen bir araçtır. Kod yazarken, pencerelerde veya sayfalarda nesneler seçildiğinde, kullanıcının başka bir işlem yapmasına
gerek kalmadan, o nesne hakkında yardım konularını listeler. F1 tuşuna bastığımız zaman ise
seçilen nesneye ait, Dynamic Help penceresinde ilk sırada bulunan yardım konusu yeni bir sayfada görüntülenir.
Penceredeki yardım konuları Help (Yardım), Samples (Örnekler) ve Getting Started (Başlangıç)
olarak üç bölüme ayrılmıştır. Help bölümü, seçilen nesne ve bu nesneyle ilişkili olan kavramların
listelendiği bölümdür. Samples, konuyla ilgili kod örnekleri bulunan yardım dosyalarını gösterir.
Getting Started çalışılan sayfalara göre değişen, temel işlemleri içeren başlangıç yazılarını gösterir.
Search
MSDN kütüphanelerinde arama yapılan penceredir. Look for metin kutusuna, aranacak anahtar
kelimeler girilir. Filtreleme (Filtered by) ile arama sonuçları belli konulara göre sınırlanır ve istenmeyen seçeneklerin gösterilmesi engellenir.
Search penceresinde, Search in titles only, Match related words, Search in previous results,
Highlight search hits arama seçenekleri bulunur:
Search in titles only: Sadece konu başlıklarında arama yapar, içerik kısmına bakmaz.
Match related words: Kelimeleri yazıldığı gibi arar, benzer yazımlı kelimeleri aramaz.
Search in previous results: İlk aramadan sonra aktif olan bu seçenek ile kelimeler, bir önceki
aramada bulunan sonuçlar arasına bakılır.
Highlight search hits: Bulunan yardım sayfalarında, aranan kelimelerin seçili olmasını sağlar.
Bulunan sonuçlar Search Results (Arama Sonuçları) penceresinde gösterilir. Bu pencerede;
Title: Konunun başlığını,
Location: MSDN kütüphanelerinde hangi başlık altında bulunduğunu,
Rank: Konunun, aranılan kelimeye olan yakınlık derecesini ifade eder.
19
20
Bölüm 2
Index
Yardım dosyalarındaki bütün konuları alfabetik sırada dizer. Filtreleme işlevi, arama penceresinde olduğu gibidir. Bu pencerenin özelliği, aranacak kelime yazılırken, bu kelime ile başlayan
tüm konuların alfabetik sırada gösterilmesidir. Bu şekilde, aranan konulara çok hızlı bir şekilde
ulaşılabilir.
Eğer bir konu ile ilgili birden fazla yardım dosyası varsa, Index Results (Dizin Sonuçları) penceresinde bu seçenekler gösterilir.
Contents
Contents (İçerik) penceresinde, tüm MSDN içeriği konulara göre hiyerarşik yapıda, kategorilere
ayrılmış olarak gösterilir. Bu pencerede de aynı şekilde filtreleme yapılarak istenmeyen içerikler
çıkartılabilir.
Bir yardım dosyası açıkken, Help menüsünden Sync Contents (İçerik Senkronizasyonu) komutu
seçilerek o yardım dosyasının Contents penceresindeki yeri bulunabilir.
Lab 2.1 Dinamik Yardım
Bu lab’ı tamamlamak için,
MSDN yardım kütüphaneleri
yüklenmiş olmalıdır.
1. Help menüsünden Dynamic Help komutunu seçerek Dynamic
Help penceresini açın. Pencerede gösterilen ilk konunun ismi
nedir?
2. CTRL-ALT-X tuşlarına basıp Toolbox penceresini açın. Dynamic
Help menüsünde ne değişti?
3. Toolbox penceresinde, Windows Forms tabında Button kontrolünü seçin. Dynamic Help penceresindeki ilk konunun ismi ne olarak değişti?
4. Button seçiliyken F1 tuşuna basın. Açılan sayfanın ismi nedir?
Lab 2.2 Contents
Sayfayı yazdırmak için bilgisayarınıza bağlı bir yazıcı
bulunması gerekir.
Yardım dosyalarını yazdırmak,
özellikle uzun metinlerde, kolay çalışma imkânı sağlar.
1. Help menüsünden Sync Contents komutuna tıklayın. Button Members konulu yardım dosyası hangi konuların altında bulunuyor?
2. Contents penceresinin ilk başlığı olan Visual Studio .NET altında,
Gettings Assitance altında, Using Help in Visual Studio .NET altında, Tips for Using the Help Keyword Index konulu yardımı açın.
File menüsünden Print komutunu seçin ve sayfayı yazdırın.
3. Contents penceresini kapatın.
Lab 2.3 Arama
1. Help menüsünden Search komutunu seçin. Look for metin kutusuna Visual Studio .NET yazın. Search in titles only, Match related words seçeneklerini işaretleyin. Search düğmesine
basın.
Kaç tane konu bulundu? En üst dereceli konu nedir?
2. Search in previous results seçeneğini işaretleyin. MSDN kelimesini aratın. Kaç konu bulundu?
3. Search in previous results seçeneğini kaldırın. MSDN kelimesini tekrar arattığınız zaman kaç
konu bulunur? Search in titles only seçeneğini kaldırınca kaç konu bulunur?
4. Search Results ve Search pencerelerini kapatın.
Microsoft Visual Studio Arayüzü
Lab 2.4 İndeks
1. Help menüsünden Index komutuna tıklayın. Look for metin kutusuna file types yazın. İlk çıkan
konu nedir?
2. Filtre olarak Visual C# seçin. İlk hangi konu gösteriliyor?
3. File Types konusu üzerine tıklayın. Açılan sayfada Solution Files (.sln and .suo) adlı bölümü
inceleyin.
4. Project Files başlığında, Visual Basic and Visual C# alt başlığı altında, File Types and File
Extentions in Visual Basic and Visual C# konusuna tıklayın.
5. Açılan yardım dosyasını inceledikten sonra, sayfanın See Also başlığı altında What’s New in
Projects konusuna sağ tıklayın. Açılan menüden Open Link in New Window komutunu seçin.
Window menüsünden New Vertical Tab Group komutunu seçin.
6. Bir önceki yardım dosyasıyla arasındaki benzerlikleri inceleyin.
7. Window menüsünden Close All Documents seçeneği ile bütün sayfaları kapatın ve Visual
Studio ortamından çıkın.
Lab 2.5 Pencereler ile Çalışmak
1. Toolbox penceresini Auto Hide düğmesine basarak sürekli görünür hale getirin.
2. Pencerenin başlığına sol tıklayıp sağ tarafta bulunan Solution Penceresine doğru taşıyın. Bu
aşamada ekranda mavi kılavuz düğmeleri görünecektir. Kılavuz düğmelerinden ortadakinin
üzerine gelip bırakın.
3. Şimdi aynı tarafta bulunan Class View Penceresini alt taraftaki sekme yardımı ile sağ tarafa
taşıyın.
4. Tools menüsünden Import and Export Settings komutunu verin. Reset All Settings seçeneğini
işaretleyip Next düğmesine basın. Karşınıza çıkan sihirbazın yönergelerini takip edin. Tüm
pencere ayarlarınız ilk halini alacaktır.
21
3
Visual C# .NET
ile Windows
Tabanlı
Programlama
3 Visual C# .NET
ile Windows Tabanlı
Programlama
•
İlk Uygulama
•
Visual C# .NET Kontrolleri
•
Özellikler, Metotlar ve Olaylar
•
Lab 3.1 Button Yakalama
•
Lab 3.2 Dokunma!
•
Lab 3.3 Dijital Saat
•
Ödevler
Visual C# .NET ile Windows Tabanlı
Programlama
Windows tabanlı uygulamalar, Windows işletim sistemi üzerinde çalışan uygulamalardır. Windows uygulamaları Windows formları ve kontrollerinden oluşur. Visual Studio bu formların ve
üzerindeki kontrollerin tasarımını, kodların yazılımını büyük ölçüde kolaylaştırarak uygulama geliştirme sürecini daha hızlı ve kolay hale getirir.
Bu bölümü tamamladıktan sonra:

Windows tabanlı programlamada kullanılan kontrolleri tanıyacak,

Kontrollerin özellik, metot ve olay kavramlarını öğreneceksiniz.
İlk Uygulama
Visual C#.NET ile yazacağımız Windows uygulaması ekrana, Merhaba Dünya mesajını çıkartır.

Visual Studio çalışma ortamını açın.

File menüsünden, New alt menüsüne işaret edin ve Project komutunu seçin. New Project
diyalog kutusu, yazılacağı dile, çalışacağı ortama göre değişen proje tiplerini listeler.

Proje tiplerinden Visual C# Project ve Windows Application tipinin seçili olduğunu kontrol
edin.

Name özelliğine HelloWorld yazın ve OK düğmesine basın. Bir windows formu tasarım görünümünde açılır.

Toolbox penceresinden Button kontrolünü formun üzerine sürükleyip bırakın. Properties penceresini açarak Button kontrolünün Text özelliğine Hello World! yazın.

Eklenen Button kontrolüne çift tıklayarak kod sayfasına geçin. Button kontrolüne basıldığında
çalıştırılacak kodu yazın:
MessageBox.Show(“Merhaba Dünya”);
Düzgün bir yazılımda
koddan çok yorum
olmalıdır.
Yazdığınız kodun ne anlama geldiğini belirtmek için yorum satırları kullanmak, kodları okumayı
kolaylaştırır. Zaman geçtikçe yazılımcı kendi yazdığı kod ile ilgili bazı bölümleri unutabileceği
için yorum satırları çok önemlidir. Yorum satırları // ile başlayarak yazılmalıdır.

MessageBox.Show metodunun yazıldığı kodun üstüne, yapılmak istenileni belirten bir yorum satırı yazın.
// MessageBox’ın Show metodunu kullanarak ekrana “Merhaba Dünya”
yazdırıyoruz.

F5 tuşuna basarak projeyi çalıştırın.
Çalışma sayfalarının isimlerinin yanında yıldız işaretinin görünmesi,
o sayfada değişiklik yapıldığını ancak daha kaydedilmediğini belirtir.
Proje dosyalarınızı CTRL-S tuşlarına basarak sıkça kaydedin.
Visual C# .NET Kontrolleri
Windows tabanlı uygulamalar geliştirirken sıkça kullanacağımız bir grup kontrol vardır. Form kontrolü hariç diğer bütün kontroller Toolbox penceresinden seçilir. Bu kontroller sürüklenip form
üzerinde istenilen pozisyona bırakılır.
26
Bölüm 3
Kontroller, ToolBox penceresinde üzerine çift tıklayarak da eklenebilir.
Kontroller, ToolBox penceresinde seçilip, form üzerinde büyüklüğü çizilerek de
eklenebilir.
Kontrollerin büyüklükleri ve yerleri, tasarım anında Size (Boyut) ve Location (Konum) özellikleri ile değiştirilebileceği gibi,
fare ile de istenilen şekilde ayarlanabilir.
Şekil 3.1
Form
Windows uygulamaları, Windows kontrollerinin tutulduğu pencereler olan formlardan oluşur. Bir Windows
projesi açıldığı zaman form kontrolü otomatik olarak
eklenir. İkinci bir form eklemek için Project menüsünden Add Windows Form komutu seçilir. Proje çalıştığı
zaman başlangıç formu görüntülenir. Başlangıç formu
Soluton Explorer’da görülen Program.cs dosyası üzerinden değiştirilir.
Application.Run(new frmStart());
Şekil 3.2
Visual Studio ortamında formlar, tasarım sayfası ve kod sayfası olmak üzere iki farklı sayfada
görüntülenir. Tasarım sayfası, formun ve üzerindeki kontrollerin görünümlerini kolay bir şekilde
değiştirmeyi sağlar. Visual Studio bu sayfada yapılan değişiklikleri kod sayfasında eş zamanlı
olarak günceller. Örneğin bir Button kontrolünün genişliğini fare ile değiştirdiğimiz zaman, kod
sayfasında bu kontrolün Width (Genişlik) özelliği yapılan değişikliğe göre güncellenecektir. Aynı
değişiklikler properties penceresinde de görülebilir.
Formların, diğer kontrollerin özelliklerinden farklı bazı özellikleri vardır.
ControlBox
Formun ControlBox özelliği false iken uygulama, Debug menüsünden Stop Debugging komutu seçilerek kapatılabilir.
Form üzerindeki simge durumuna küçültme, ekranı kaplama ve formu kapama kutularının görünümünü ve erişilebilirliğini kontrol eder.
StartPosition
Form açıldığı zaman nerede görüneceğini belirler. CenterScreen seçeneği formu ekranın ortasında gösterir.
Load Event
Formlar açıldığı zaman Load olayı gerçekleşir. Eğer form, başlangıç formu olarak seçilmişse,
proje başladığı zaman çalıştırılmak istenen kodlar bu olayın metoduna yazılır.
private void Form1_Load(object sender, System.EventArgs e)
{
label1.Text = “Uygulama başladı.. Başlangıç zamanı: “
+ DateTime.Now;
}
Visual C# .NET ile Windows Tabanlı Programlama
Button
Bir Windows düğmesini temsil eder. Button kontrolüne basıldığında Click olayı tetiklenir. Bu olay
gerçekleştiği zaman yapılacak işlemler, varsayılan olarak ButtonIsmi_Click metodunda yazılır.
private
EventArgs e)
btnChangeColor_Click(object
sender,
System.
{
void
btnChangeColor.ForeColor = Color.Gray;
}
TextBox
Bir Windows metin kutusunu temsil eder. Kullanıcıların değer girerek yazılım ile haberleşmesini
sağlamak amacıyla kullanılır. TextBox kontrolündeki yazı değiştiği zaman TextChanged olayı
gerçekleşir.
private
EventArgs e)
textBox1_TextChanged(object
sender,
System.
{
void
MessageBox.Show(“Yazı değişti: “ + textBox1.Text);
}
Label
Bir Windows etiketini temsil eder. Kullanıcıya, form üzerinde bir yazıyı göstermek amaçlı kullanılır. Bu yazının görünümü, Label kontrolünün bazı özellikleri ile değiştirilir.
TextAlign
Yazının Label kontrolü üzerinde nerede duracağını belirler.
Font
Font (Yazı Tipi) özelliği birçok alt özellik taşır. Bunlardan bazıları
en sık kullanılan özelliklerdir.
Name
Yazı tipinin ismini belirler. Varsayılan Microsoft Sans Serif seçilidir.
Şekil 3.3
Size
Karakterlerin boyutunu belirler. Varsayılan büyüklük 8,5 değerini alır.
Bold
Yazının kalın (Bold) tipte olmasını belirler.
Italic
Yazının italik (Italic) tipte olmasını belirler.
UnderLine
Yazının altı çizgili (UnderLine) olmasını belirler.
Label kontrolünün Text özelliğini boş bırakırsanız, tasarım zamanı Form üzerinde
göremezsiniz. Böyle bir durumda kontrolü tekrar seçmek için Properties penceresinin en üstünde bulunan ComboBox’tan kontrolü seçmeniz yeterli olacaktır.
27
28
Bölüm 3
Şekil 3.4
ComboBox
Bir Windows açılan kutusunu temsil eder. ComboBox kontrolü, kullanıcıların bazı değerleri açılan
bir listeden seçmesini sağlar. Listeye tasarım anında veya çalışma anında öğe eklenebilir. Listeye
öğe eklemek için kontrolün Items özelliğinden faydalanılır.
Tasarım anında öğe eklemek için Properties penceresinden Items özelliği seçilir. String Collection Editor penceresinde, her öğenin değeri tek bir satırda yazılır.
Şekil 3.5
Çalışma anında öğe eklemek için kod sayfasında, kontrolün Items özelliğinin Add metodu kullanılır.
private void Form1_Load(object sender, System.EventArgs e)
{
comboBox1.Items.Add(“Beşiktaş”);
comboBox1.Items.Add(“Galatasaray”);
comboBox1.Items.Add(“Fenerbahçe”);
comboBox1.Items.Add(“Trabzon”);
}
Visual C# .NET ile Windows Tabanlı Programlama
Şekil 3.6
ListBox
Bir Windows liste kutusunu temsil eder. Kontroldeki öğeler sabit bir liste olarak görüntülenir. ListBox kontrolüne öğe ekleme işlemi, ComboBox kontrolündeki işlemler ile aynıdır. ComboBox kontrolünden farkı, birden fazla öğenin seçilebilir olmasıdır.
private void btnEmptyClasses_Click(object sender, System.
EventArgs e)
{
listBox1.Items.Add(“YYU3124”);
listBox1.Items.Add(“YYU3226”);
listBox1.Items.Add(“YYU3314”);
listBox1.Items.Add(“YYU3408”);
}
Şekil 3.7
Timer
Bir Windows sayacını temsil eder. Timer çalışmaya başladığı zaman, belirli zaman aralıklarında
Tick olayı gerçekleşir. Timer kontrolünün Interval değeri, Tick olayının kaç milisaniyede bir gerçekleşeceğini belirler. Örneğin Interval değeri 2000 olan bir sayaç, Tick olayında yazılan kodları
2 saniyede bir çalıştıracaktır.
Sayacı başlatmak için kontrolün Start metodu, durdurmak için ise Stop metodu kullanılır. Enabled
özelliği, sayacın aktif olup olmadığını belirler.
private void Form1_Load(object sender, EventArgs e)
{
//Her saniye kod güncellenecek
29
30
Bölüm 3
timer1.Interval = 1000;
//timer başlatılıyor
timer1.Start();
//bir saniye gecikmeyi önlemek için kod bir kere çağrılıyor.
label1.Text = DateTime.Now.ToLongTimeString();
}
private void timer1_Tick(object sender, EventArgs e)
{
//O anki saat label1 kontrolünün Text özelliğine atanıyor.
label1.Text = DateTime.Now.ToLongTimeString();
}
MessageBox
MessageBox, kullanıcıya bilgi göstermek için açılan mesaj kutusudur. Bu mesaj kutusu dört öğeden oluşur.

Text (Metin): Mesaj kutusunda verilmek istenen bilgiyi tutan yazıdır.

Caption (Başlık): Mesaj kutusunun başlığıdır.

Buttons (Düğmeler): Mesaj kutusunda hangi düğmelerin gösterileceğini belirler.

Icon (Simge): Mesaj kutusunda gösterilecek olan simgeyi ve açıldığı zaman çıkartılacak sesi
belirler.
MessageBox.Show(“Devam
etmek
istiyor
musun?”,
MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
“Uyarı”,
Şekil 3.8
Mesaj kutusu, kapanırken hangi düğmenin basıldığını DialogResult nesnesi ile programcıya bildirir.
if(MessageBox.Show(“Değişiklikler
kaydedilsin
mi?”,
MessageBoxButtons.YesNoCancel) == DialogResult.Cancel)
“Kayıt”,
{
//Eğer
Cancel
çalışacak...
(İptal)
düğmesine
tıklanırsa
bu
kod
bloğu
}
Özellikler, Metotlar ve Olaylar
.NET Kontrolleri, görsel bir uygulama geliştirmek için gerekli programlanabilir altyapı elamanlarını
oluştururlar. Yukarıda basitçe değinilen bu kontrollerle, özellikleri, metotları ve olayları kullanarak
etkileşim sağlarız. Özellik, metot ve olay kavramlarını daha net açıklayabilmek için fiziksel olarak
bir çalar saati, bir de .NET kontrolü olan Button nesnesini ele alalım.
Visual C# .NET ile Windows Tabanlı Programlama
Özellikler
Özellikler (Properties), kontrollerin görünüm, yerleşim veya davranış gibi çeşitli karakteristiklerini
belirlerler.
Nasıl ki bir çalar saatin renk, genişlik, yükseklik gibi karakteristik, onu diğer çalar saatlerden ayırt
etmemizi sağlayacak özellikleri varsa, bir Button kontrolünün de rengini, genişliğini ve yüksekliğini
belirleyecek karakteristik özellikleri vardır. Örneğin Button kontrolünün, Text özelliği, Button’un
üzerinde yazan metni belirlememizi sağlar.
Kontrollerin özelliklerine, tasarım anında Properties penceresinden ulaşılabileceği gibi, bu özellikler kod tarafından da okunup değiştirilebilir.
Kontrollerin birçok özelliği hem okunabilir hem de değiştirilebilirdir. Ancak bazı özellikler salt okunur (ReadOnly) olabilir. Bu tip özellikler Properties penceresinde görünmezler.
Kontrollerin birçok ortak özellikleri vardır. Bunlar;
Text
Kontrollerin Text özelliği, üzerinde görüntülenen yazıdır. Bu özellik çalışma anında sıkça okunup
değiştirilerek, kullanıcıyla iletişim sağlanır.
TextBox kontrolüne girilen bir değerin okunup Label kontrolüne yazılması için, kontrollerin Text
özellikleri kullanılır.
private void button1_Click(object sender, System.EventArgs e)
{
//TextBox kontrolünün Text özelliğinin değeri Label
kontrolünün Text özelliğine atanıyor.
label1.Text = textBox1.Text;
}
Şekil 3.9
Name
Name özelliği kontrollere ulaşmak için kullanılan özelliktir. Birçok kontrolün Text özelliği aynı olabilir. Ancak her biri ayrı birer kontrol oldukları için, Name özelliklerin benzersiz olması gerekir.
textBox2.Text = textBox1.Text;
İki TextBox kontrolünün yazıları aynı, fakat isimleri farklıdır.
Formda çalışılan nesnelere mantıklı isimler verilirse, kod yazımında
çok büyük kolaylık elde edilir. Örneğin isim girilen bir TextBox’a txtAd, saatin gösterileceği bir Label’a lblZaman gibi...
31
32
Bölüm 3
Size
Size kontrollerin büyüklük özelliğidir. Height (Yükseklik) ve Width (Genişlik) özelliklerinden oluşur.
Genellikle tasarım anında belirlenen bu özellik, çalışma anında da değiştirilebilir.
label1.Height = 10;
label1.Width = 20;
BackColor
Kontrollerin arka plan renginin ayarlandığı özelliktir. Bu özelliğin değeri, Color yapısında tanımlı
değerler ile belirlenir.
ForeColor
Kontrollerin üzerindeki yazıların rengini belirler.
private void button1_Click(object sender, System.EventArgs e)
{
button1.BackColor = Color.Black;
button1.ForeColor = Color.White;
}
Şekil 3.10
Visible
Kontrollerin ekranda görünüp görünmediklerini belirleyen özelliktir. true ve false olmak üzere iki
değer alabilir
private void button1_Click(object sender, System.EventArgs e)
{
// Label1 kontrolü görünmez
label1.Visible = false;
// Label2 kontrolü görünür
label2.Visible = true;
}
Top, Left
Kontrollerin, formun veya içine eklendiği başka bir kontrolün üzerindeki koordinatlarını belirleyen
özelliklerdir. Top, üstten uzaklığı belirtirken, Left soldan uzaklığı belirtir. Uzaklıklar piksel cinsindendir.
Sayısal görüntülerin (Image) en küçük parçası olan
noktalara Piksel denir.
Visual C# .NET ile Windows Tabanlı Programlama
private void button1_Click(object sender, System.EventArgs e)
{
// Label1 kontrolünün Formun üstünden uzaklığı
label1.Top = 200;
// Label1 kontrolünün Formun solundan uzaklığı
label1.Left = 150;
}
Metotlar
Metotlar (Methods) kontrollerin yapabileceği işlemlerdir. Yine bu bölümün başında verdiğimiz çalar saat ve Button örneğini kullanacak olursak, SaatiAyarla(), AlarmiKur(), çalar saate ait metotları
oluştururken, Select() metodu Button kontrolünün seçili hale gelmesini sağlar.
Metotlar parametreyle veya parametresiz çağrılabilir. Parametreyle çağırmak, metodun girilen
değere göre işlem yapacağını belirtir. Örneğin Focus (Odaklan) metodu, parametre beklemeden
çalışır ve kontrolün seçilmesini sağlar.
private void button1_Click(object sender, System.EventArgs e)
{
// textBox1 kontrolünün Text’ ini temizle
textBox1.Clear();
// textBox1 kontrolüne odaklan
textBox1.Focus();
}
Kontrollerin bazı ortak metotları vardır. Bunlar,
BringToFront
Üst üste duran kontroller arasından en öne getirir.
SendToBack
Üst üste duran kontrollerin en arkasına gönderir.
Hide
Kontrolün görünmesini engeller.
Show
Kontrolün görünmesini sağlar.
Olaylar
Olaylar (Events), kontrollerin cevap verebileceği eylemlerdir. Örneğin alarmı kurulmuş bir çalar
saat, Alarm olayına ses çıkartarak cevap verirken, bir Button kontrolü Click olayına, bir TextBox’taki
yazının değişmesi ile karşılık verebilir. Bir olay gerçekleştiği zaman yapılacak işlem, ilgili olayın
metoduna yazılır. Örneğin, Button1 isimli kontrolün üzerine tıklandığı zaman gerçekleştirmek istenen eylemler Button1_Click metoduna yazılır.
Visual Studio, olayların metot isimlerini Kontrolİsmi_Olayİsmi olarak biçiminde yazar.
Tasarım zamanı herhangi bir
kontrole çift tıkladığınızda, kontrolün varsayılan olayı için Vi-
Hatalı veya bilerek herhangi bir kontrol için atadığınız olayı iptal etmek için kod
tarafından ilgili metodu silmeyin. Onun yerine, Properties penceresinden kontrolün ilgili olayını bulun. Olayın üzerine sağ tıklayıp Reset komutunu verin.
33
34
Bölüm 3
sual Studio sizin için bir metot oluşturur. Örneğin; Button için Click, Textbox için TextChanged.
Varsayılanların dışında diğer olaylara ulaşmak isterseniz;
1. Kontrolün özelliklerini açın. (Kontrole bir kez tıklayıp F4 tuşuna basın ya da sağ tıklayıp Propeties komutu verin)
2. Açılan Properties penceresinde üzerinde sarı şimşek simgesi olan tuşa basın. Artık Properties penceresi seçilen kontrolün olaylarını listeleyecektir. Tekrar özellikleri görüntülemek için
aynı tuşun yanındaki üzerinde tablo resmi olan tuşa basmanız yeterli olacaktır.
3. Listeden istediğiniz olayı çift tıklayarak o olay için kod yazabilirsiniz. Alternatif olarak olayın
karşına isimlendirme kurallarına uymak kaydı ile istediğiniz metot adını yazıp Enter tuşuna
da basabilirsiniz.
Click
Kontrol üzerine tıklandığı zaman tetiklenen olaydır. Windows tabanlı programlamada en sık kullanılan olaylardan biridir.
MouseDown
Fare, kontrolün üzerindeyken herhangi bir tuşuna basıldığı zaman gerçekleşen olaydır. Bu olay,
Click olayından önce çalışır.
MouseUp
Fare, kontrolün üzerindeyken basılan tuş bırakıldığı zaman çalışır.
Enter
Kontrol seçildiği veya üzerine odaklanıldığı zaman gerçekleşen olaydır.
Leave
Başka bir kontrol seçilmek üzere çıkıldığında, bu kontrolün Leave olayı tetiklenir.
Olayların çalışma sıralarını test etmek için tüm olay yordamlarına, mesaj kutusu
çıkaran MessageBox.Show kodunu yazın. Daha sonra projeyi çalıştırıp kontroller üzerinde yapılan değişikliklere göre olayların çalışma sıralarına bakın.
Lab 3.1 Button Yakalama
Bu örneğimizde Button kontrolünün MouseEnter olayına ve rastgele sayı üretmeye değineceğiz.
1. File | New | Project komutu ile yeni bir Windows projesi açın. Project Type (Proje Tipi) Visual
C#, Templates (Şablonlar) olarak Windows Form Application seçin ve ismini (Name) “Button_Yakalama“ olarak değiştirin.
Visual C# .NET ile Windows Tabanlı Programlama
Şekil 3.11
2. Formun boyutunu Size özelliğini kullanarak şekil 3.12‘deki gibi değiştirin.
Şekil 3.12
3. Forma bir adet Button kontrolü ekleyin. Name özelliğini “btnYakala”, Text özelliğini ise “Beni
Yakala” olarak değiştirin.
35
36
Bölüm 3
4. btnYakala isimli Button’un MouseEnter olayına çift tıklayın.
Şekil 3.13
MouseEnter olayına çift tıkladıktan sonra kod kısmında btnYakala_MouseEnter metodu oluşacaktır. MouseEnter herhangi bir kontrol için fare üzerine geldiğinde gerçekleşecek olayı
belirtir.
5. MouseEnter olayı için oluşan metodun içine düğmeyi hareket ettirecek kodları yazın:
private void btnYakala_MouseEnter(object sender, EventArgs e)
{
//Rastgele bir tamsayı üretebilmek için kullanacağımız Random
sınıfının bir örneğini oluşturuyoruz.
Random r = new Random();
//0-500 arası üretilen
özelliklerine atanıyor.
konumu değişmiş oluyor.
bir fazlası yazılır. Bu
tamsayılar button kontrolünün Left ve Top
Böylece Button kontrolünün Form üzerindeki
Next metodunda istenilen en büyük sayının
yüzden 500 değil 501 yazıldı.
btnYakala.Left = r.Next(0,501);
btnYakala.Top = r.Next(0,501);
}
6. Uygulamayı F5 tuşu ile çalıştırıp gözlemleyin.
Lab 3.2 Dokunma!
Bu örneğimizde Button kontrolünü kullanarak basit bir oyun tasarlayacağız. Formumuzun görüntüsü Şekil 3.14’teki gibi olacak.
Visual C# .NET ile Windows Tabanlı Programlama
Şekil 3.14
Amacımız şeklin açık ucundan başlayarak fareyi kırmızı ve yeşil düğmelere değdirmeden mavi
düğmenin üzerine getirebilmektir. Kırmızı ve yeşil düğmelere değdiğimizde oyunu kaybedecek,
siyah düğmeden başlayarak mavi düğmeye değmeye çalışırsak ekranda “hile” mesajı ekranda
görünecektir.
1. Yeni bir Windows projesi açın ve ismini “Dokunma“ olarak değiştirin.
2. Forma Tablo 3.1’deki kontrolleri ekleyin. Tüm kontrollerin Text özelliklerini boş bırakın.
Tablo 3.1
Name
BackColor
Button
btnYesilUzun
Green
Button
btnYesilKisa
Green
Button
btnKirmiziUzun
Red
Button
btnKirmiziKisa
Red
Button
btnBitis
Blue
Button
btnEngel
Black
3. btnYesilUzun isimli Button’un MouseHover olayına çift tıklayın. Kod kısmında btnYesilUzun_
MouseHover adlı metot oluşacaktır. Buraya “Yandınız” mesajını gösterecek kodu yazın:
private void btnYesilUzun_MouseHover(object sender, EventArgs e)
{
MessageBox.Show(“Yandınız”);
}
4. Uygulamada bulunan btnYesilKisa, btnKirmiziKisa, BtnKirmiziUzun Button’ları btnYesilUzun
Button’u ile aynı olayı kullanacağı için bu üç Button’a btnYesilUzun_MouseHover isimli metot atanacaktır. Bu işlemi yapabilmek için her üç Button’nun da MouseHover olayına Şekil
3.15’teki gibi açılan menüden btnYesilUzun_MouseHover metodunu atayın.
37
38
Bölüm 3
Şekil 3.15
5. btnBitis ve btnEngel isimli Button’ların MouseHover olayına çift tıklayın. Oluşan metotlara
“Yandınız” ve “Tebrikler, Kazandınız” mesajlarını gösterecek kodları yazın:
private void btnYesilUzun_MouseHover(object sender,
EventArgs e)
{
//Fare btnYesilUzun,btnYesilKisa, BtnKirmiziUzun ve BtnKirmiziKisa
adlı düğmelere değdiğinde “Yandınız” mesajını görünecek.
MessageBox.Show(“Yandınız”);
}
private void btnBitis_MouseHover(object sender, EventArgs e)
{
//Fare kırmızı ve yeşil düğmelere değmeden mavi düğmeye ulaşırsa
“Kazandınız” mesajı görünecek.
MessageBox.Show(“Tebrikler, Kazandınız”);
}
private void btnEngel_MouseHover(object sender, EventArgs e)
{
//Fare siyah düğmeden başlayarak mavi düğmeye ulaşmaya çalışırsa
“Hile Yapmayın” mesajı verecek.
MessageBox.Show(“Hile Yapmayın”);
}
Uygulamayı F5 tuşu ile çalıştırıp gözlemleyin.
Visual C# .NET ile Windows Tabanlı Programlama
Lab 3.3 Dijital Saat
Bu örneğimizde Timer nesnesini kullanarak ekranın ortasında açılan bir dijital saat örneği hazırlayacağız.
Formunuzun görüntüsü Şekil 3.16’daki gibi olacak.
1. Yeni bir Windows projesi oluşturun ve ismini “DijitalSaat” olarak değiştirin. Formunuza Tablo 3.2’deki kontrolleri ekleyiniz.
Şekil 3.16
Tablo 3.2
Name
Text
Label
lblSaat
[--]
Button
btnKapat
[X]
Timer
tmrSaat
tmrSaat’in Interval özelliğini 1000 ve Enabled özelliğini true olarak değiştirin.
Form1’in BackColor özelliğini ControlDark, FormBorderStyle özelliğini None ve StartPosition
özelliğini CenterScreen yapın.
lblsaat’in Backcolor özelliğini ButtonFace ve TextAlign özelliğini MiddleCenter olarak değiştirin.
2. tmrSaat kontrolüne çift tıklayarak kod penceresine geçin. Her geçen saniye içinde o anki saati
lblSaat kontrolünün Text özelliğinde gösteren kodu yazın:
private void tmrSaat_Tick(object sender, EventArgs e)
{
lblSaat.Text = DateTime.Now.ToLongTimeString();
}
3. Son olarak btnKapat’a çift tıklayarak kod penceresine geçin, Form1’i kapatacak btnKapat’ın
Click olayına gerekli kodları yazın.
private void btnKapat_Click(object sender, EventArgs e)
{
//Formu kapatın.
this.Close();
}
4. F5 ile uygulamayı çalıştırdığınızda görüntüsü Şekil 3.17’deki gibi olmalıdır.
Şekil 3.17
39
40
Bölüm 3
Ödevler
1.Treeview ve Progressbar kontrollerini inceleyin. Her bir kontrolün herhangi 3 metodunu, 3 olayını ve 3 özelliğini araştırın.
2.Şekil 3.18’de görülen formu tasarlayın.
Şekil 3.18
4
Değişkenler
ve Veri Tipleri
4 Değişkenler ve Veri Tipleri
•
Değişkenler
•
Veri Tipleri
•
Çıkış Dizisi
•
Aritmetik Operatörler
•
Lab 4.1 Personel Formu
•
Lab 4.2 Global Değişken
•
Lab 4.3 Topla Birleştir
•
Ödevler
Değişkenler ve Veri Tipleri
Bu bölümde değişkenler, veri tipleri, tip dönüşümleri ve aritmetik operatörler hakkında bilgi verilmektedir. Değişken tanımlamanın ve kullanmanın, değişkenlerin veri tiplerini, veri tipi seçmenin
önemini kavrayacaksınız.
Bu bölüm tamamlandıktan sonra:

Değişken tanımlayabilecek ve kullanabilecek,

Veri tiplerinin neler olduğunu öğrenecek,

Operatörler yardımı ile aritmetik işlem yapabileceksiniz.
Değişkenler
Uygulama geliştirirken, bazı verilerin daha sonra kullanılmak üzere bir yerde tutulması gerekebilir.
Örneğin bir hesaplama yapılırken, önceden hesaplanmış veriler kullanılmak istenirse, bu verileri
tekrar hesaplamak yerine hafızada tutmak performansı artıracaktır. Veya veritabanından alınan
bir kullanıcı isminin hafızada tutulması, bu değer her istendiğinde veritabanına bağlanıp alınmasına tercih edilmelidir. Verilerin bu şekilde hafızada tutulması değişkenler ile sağlanır.
C# dilinde bir değişkenin tanımlanması şu şekildedir :
tip değişkenadı;
Burada tip verinin içerdiği bilgiye en uygun veri tipini, değişkenadı ise daha sonra veri atamak ve
okumak için kullanacağımız temsil ismini belirtir.
Değişkenler farklı türde verileri tuttukları için, farklı tiplere sahip olabilirler. Bir negatif veya pozitif
sayıyı tutan değişken ile yazı tutan bir değişken farklı tiplere sahiptirler.
Örneğin bir kişinin ismini tutmak için :
string isim;
Bir kişinin yaş bilgisini tutmak için :
byte yas;
Bir kişinin maaş bilgisini tutmak için :
double maas;
Değişken isimlerini belirlerken bazı noktalara dikkat etmek gerekir.

Boşluk, nokta, soru işareti, noktalı virgül, çift tırnak, tek tırnak, aritmetik operatörler, karşılaştırma ve atama operatörleri, parantezler kullanılamaz.

Sayı ile başlayamaz.

Visual C#.NET dilinde tanımlı anahtar kelimeler kullanılamaz. Örneğin for,if,while,case,try,st
ruct,do,switch,true,false.
Uygulama geliştirirken hatalı değişken tanımı yapılması kodun derlenmemesine yol açacaktır. Hatalı bazı değişken tanımları:
Değişken isimlerinde Türkçe karakter kullanılırsa, farklı dil seçenekli işletim sistemlerinde çalışma anında hata üretecektir.
44
Bölüm 4
int int;
short (sayi);
int 333sayisi;
string “kelime”;
string <isim>;
Aynı tipteki değişkenler tek bir satır içinde tanımlanabilir.
int numara1, numara2;
Değişkenlere Değer Atamak
Değişkenlere değer atamak = operatörü ile yapılır. Eşitliğin sağ tarafındaki değer, sol tarafında
bulunan değişkene atanır. Dolayısıyla sağ taraftaki ifadenin değeri değişmez.
numara1 = 10;
numara2 = sayi1;
Değişkenler tanımlandıkları sırada başlangıç değeri alabilirler.
string isim = “Yusuf Emre AYRILMAZ”;
Tanımlama işlemi yapıldıktan sonra kod gidişatı içerisinde değişkenin değeri tekrar değiştirilebilir.
isim = “Engin ÖREN”;
Değişkenlerin Kapsamı ve Yaşam Süreleri
Kaba bir ifade ile değişkenler içinde bulundukları scope (alan) ve alt alanlarda geçerlidir. Şimdi bu
ifadeyi açıklayabilmek için scope kavramı üzerinde duralım.
Bir programı oluşturan kodlar bir bütün değildir. Kodlar görevlerine göre bölümlere ayrılmıştır ve
programın gidişatına göre bu bölümler bir kere veya daha fazla çalıştırılabilir veya hiç çalıştırılmayabilir.
Şekil 4.1
Şekil 4.1’deki duruma bakacak olursak; sınıftaki öğrenci sınıf içindeki, Bilgeadam içindeki ve sokaktaki tüm çöp kovalarını kullanabildiğini görürsünüz. Bilgeadam içindeki bir misafir ise Bilgeadam içindeki ve sokaktaki çöp kovalarını kullanabilir. Sokaktaki herhangi biri ise sadece sokakta
bulunan çöp kovalarını kullanabilir. Erişebilirlik iç scope’lardan dışa doğru olmaktadır. Durumu,
Tablo 4.1’den gözlemleyebilirsiniz.
Değişkenler ve Veri tipleri
Tablo 4.1
Öğrenci
Misafir
Vatandaş
Sokak
evet
evet
evet
Bilgeadam
evet
evet
Sınıf
evet
C#’ta scope’lar
süslü parantezler
ile ifade edilir.
Scope’ları film takılmış camlara benzetebiliriz. Dışarıdan içerisi görünmezken içerden dışarısı görünür.
Şekil 4.2
Şekil 4.2’deki örnekte görüldüğü gibi kod gelişi güzel yazılmamış, belli bloklar satır girişleri bırakılan boşluklarla scope’lara ayrılmıştır. Ancak bu boşluklar insan gözünün rahat okuyabilmesi
için yapılmıştır. Yazılımsal hiçbir değeri yoktur. Bilgisayar bir scope’un nerede başlayıp nerede
bittiğini { ve } karakterleri sayesinde anlayabilir.
Örnekte görüldüğü üzere önce enBuyukSayi adlı değişken tanımlanmış. Bu değişken tanımlandığı scope ve alt scope’larında kullanılabilir. Bu bilgiden yararlanarak örnekteki değişkenler hakkında şunlar söyleyebiliriz:
enBuyukSayi: 12 ile 29 arasındaki tüm bölgede kullanılabilir.
ortancaSayi: 21 ile 28 arasındaki tüm bölgede kullanılabilir.
enKucukSayi: 25 ile 27 arası yani içinde bulunduğu scope’ta kullanılabilir.
Değişkenlerin hafızada tanımlandıklarından bahsetmiştik. Değişkenler kapsam dışına çıktıklarında hafızadan da silinirler böylelikle yaşam döngüsü ( life cycle ) tamamlanmış olur. Örnekte 22
nolu satırda tanımlanan ortancaSayi isimli değişken 28 nolu satırda yaşam döngüsünü tamamlamış olur.
Tablo 4.2, kod bloklarından hangi değişkenlere ulaşabilindiğini gösterir.
Tablo 4.2
enBüyükSayi
ortancaSayi
Scope 1
evet
Scope 2
evet
Evet
Scope 3
evet
Evet
enKucukSayi
evet
Sabit
Sabit, sürekli aynı değeri tutan değişkendir. Uygulamanın çalışması boyunca değişmeyen bir
değer kullanılıyorsa sabit kullanılması, kodun
kolay okunmasını sağlayacaktır.
C# whitespace yani boşluk tuşu (space bar) ve sekme
tuşu (tab) ile oluşan boşluklara karşı duyarlı değildir.
Kod derlendiğinde bunlar otomatik olarak silinir.
45
46
Bölüm 4
Sabitlerin kapsam alanları değişkenler ile
aynıdır. Genelde sabit değerler adlandırılırken tamamı büyük harf ile yazılır.
Sabitler tanımlandıktan sonra değiştirilemeyeceği için, tanımlandıkları anda değerlerinin verilmesi gerekir.
const double PI = 3.14;
Değişken Adlandırma Yöntemleri
Değişkenleri adlandırmak (notasyon), kodların daha okunaklı ve anlaşılır olması açısından çok
önemlidir. Bu sebepten dolayı yazılım dünyasında değişkenleri adlandırmak için belli başlı yöntemler geliştirilmiştir. Bunlar,
Pascal
Değişkeni adlandırırken, değişken ismini oluşturan kelimelerin ilk harfleri büyük devamı küçük
harf olacak şekilde yazılır.
Örnek: KatSayi, TextBox, ToString()
Camel
Pascal notasyonuna benzeyen Camel (Deve) isimlendirme standardında tek fark, ilk kelimenin
tamamen küçük harf, geri kalan tüm kelimelerin ilk harfi büyük olacak şekilde yazılmasıdır.
Örnek: katSayi, adSoyad, tcKimlikNo
Hungarian
Macar (Hungarian) notasyonu olarak bilinen bu standart ile değişken tanımlarken, ilk 2 veya 3
harfte değişken tipinin veya kullanılan kontrolün kısaltması, sonrasında ise anımsatıcı kelime(ler)
yazılır.
Örnek: dblIlkSayi, txtOgrenciAdi, strAciklama
Uppercase
Değişkenler isimlendirilirken tamamı büyük harfler ile yazılır.
Örnek: KATEGORIADI, OGRENCINO
Underscore
Değişkenler isimlendirilirken, değişken adını oluşturan kelimeler altçizgi (undercore) ile ayrılır.
Örnek: KATEGORI_ADI, OGRENCI_NO
Veri Tipleri
Veri tipi, değişkenlerin tuttukları değerlerin türünü ve bellekte tutulacak boyutunu tanımlar. Önceki bölümlerde bahsedildiği gibi yazılımların amacı kullanıcıdan aldığı veriyi işleyip saklamak ve
istenildiğinde kullanıcıya sunmaktır. Kullanıcıdan alınan veriler, bilgisayarın geçici hafızasında
(RAM) kısa süreli olarak saklanır. Verilerin saklandığı bu alanlara değişken (variable) diyoruz.
Gerçek hayattaki verileri incelediğimizde verilerin türlerine göre sınıflandırıldıklarını görürüz. Örneğin bir lig takviminde takımların isimleri ve puanları vardır. Takımların isimleri sözel bir veri içerirken puanları sayısal bir veri içerir ve puan bilgisi üzerinde matematiksel işlemler uygulanabilir.
Veriler üzerinde gerekli, işlemlerin yapılabilmesi için değişkenlerin türlerinin belirtilmesi gerekir.
Örneğin bilgisayarımızda kesirli sayıların kullanılacağı daire alanı hesaplaması gibi bir problem
çözeceksek girdilerin türünü belirtmemiz gerekir. C#’ta kesirli sayılar için double veri tipi bulunmaktadır.
Değişkenler ve Veri tipleri
Değişkenlerin geçici hafızada (RAM) tutulduğundan bahsetmiştik. Dolayısıyla tanımladığımız her
değişken geçici hafızada yer kaplamaktadır. Bu yüzden yazılım geliştiriciler kullanıcının RAM’ini
tasarruflu kullanmak zorundadır. Çünkü yazacağımız uygulamanın çalışacağı bilgisayarda sadece bizim uygulamamız çalışmayacaktır. Uygulamamızın performansı ve kullanıcının refahı için en
uygun veri tipini seçmek son derece önemli bir kıstastır. Örneğin üniversite notu hesaplayan bir
program yazdığımızı düşünelim. Öğrenci notları maksimum 100 olabileceğinden bu veri için 0 ile
255 arası tam sayıları tutabilen byte değişkeni uygun olacaktır. Bu veri tipi, bilgisayarın RAM’inde
8 bitlik bir yer tutacaktır. Aynı işi int veri tipi ile de yapsaydık sonuç doğru çıkacaktı ancak bu sefer
bilgisayarın RAM’inde 32 bitlik yer işgal edecek ve 4 kat fazla yer kaplayacaktık. Bu değerler, küçük ve önemsiz gibi görünebilir ancak yazacağınız uygulamada tanımlayacağınız değişkenlerin
sayısını ve aynı anda bilgisayarda çalışan diğer yazılımların sayısını düşünüp bir hesap yaptığımızda, değişken tanımlarken titiz davranılması gerektiği ortaya çıkar.
Önce C#’ta değişkenlere atayabileceğimiz veri tiplerini tanıyalım;
Tamsayılar
Tamsayılar
Tip
Bit
Değer Aralığı
byte
8
0’dan 255’e
sbyte 8
-128’den 127’ye
short
16
-32,768’den 32,767’ye
ushort 16
0’dan 65,535’e
int
32
-2,147,483,648’den 2,147,483,647’ye
uint
32
0’dan 4,294,967,295’e
long
64
-9,223,372,036,854,775,808’de 9,223,372,036,854,775,807’ye
ulong 64
0’dan 18,446,744,073,709,551,615’e
Gördüğünüz gibi her veri tipinin işaretli ve işaretsiz versiyonları
mevcut. Aralarındaki fark verilerin tutulduğu bitlerde ilk bitin 0
veya 1 alması durumudur.
Int16, Int32, Int64 .NET veri tipleridir. Visual C# dilindeki karşılıkları short, int, long veri tipleridir.
Ondalık Sayılar
Ondalık Sayılar
Tip
Bit
Değer Aralığı
float
32
1.5E-45 ile 3.4E+38
double 64
5E-324 ile 1.7E+308
decimal128
1E-28 ile 7.9E+28
.NET’te ondalık tipli veriler için float ve double kullanılır. Tek duyarlıklı sayılar için float, çift duyarlıklı sayılar için ise double kullanılır.
47
48
Bölüm 4
Bir dairenin alanın hesaplanması gibi ondalık sayılar kullanılacak işlemlerde float ve double veri
tipleri kullanılabilir. Aynı şekilde trigonometrik işlemlerde de ondalık sayı kullanıldığı için bu veri
tipleri kullanılabilir.
Duyarlılığı fazla matematiksel işlemlerde ve parasal işlemlerde ondalık sayılarda yuvarlama işlemleri sonucunda bazı hatalarla karşılaşılır. Bu işlemlerde sonucu en doğru hesaplayabilmek için
geniş ondalık sayıları tutan değişkenlere ihtiyaç vardır. .NET’te bu gibi işlemler için decimal veri
tipi mevcuttur ve 28 ondalık basamaklı bir ifadeyi tutabilir.
Metinsel İfadeler
Metinsel İfadeler
Tip
Bit
char
16
string Değer Aralığı
20+(n/2)*4
char veri tipi sadece tek bir karakter içerebilir. C#, diğer dillerde olduğu gibi 8 bitlik alanlar kullanmaz onun yerine Unicode (Evrensel Kod) dediğimiz karakter tipi kullanılır ve 16 bit değerindedir.
Dolayısıyla 65,535 farklı karakteri temsil edebilir. Bu Çince gibi karışık dillerin dahi desteklenmesini sağlar.
string veri tipi ise birden fazla karakter değeri tutmak için kullanılır. Bir isim, cümle, adres, makale
gibi uzun verileri tutmak için kullanılır. Hafızada tuttuğu yer ise bir formül ile belirlenir:
20+(n/2)*4
n burada string içerisinde tutulan karakter sayısını temsil eder. Örneğin “İstanbul” verisi için hafızada 20 + ( 8 /2 ) * 4 = 36 bitlik alan kullanılır.
String, diğer veri tiplerinden yapı bakımından oldukça farklıdır. İlerleyen derslerimizde öğreneceğiniz referans tipinde bir değişkendir. Bunun anlamı verinin hafızada ayrılan bir yerde değil de onu
temsil eden başka alanlarda tutulduğudur.
İlkokul derslerimizde öğrendiğimiz gibi harfler kelimeleri oluşturur, kelimelerde cümleleri. Aynı şekilde char’lar da string’i oluştururlar. Yine ilerleyen derslerde öğreneceğiniz dizi kavramı ile ifade
etmek gerekirse string bir char dizisidir. Eski programcılar metinsel ifadeleri tutmak için char dizisi
tanımlardı ve bunu her metinsel ifade için gerçekleştirmek tam anlamıyla bir işkence idi.
Mantıksal İfadeler
Mantıksal İfadeler
Tip
Bit
Değer Aralığı
bool
16
true-false
bool veri tipi sadece 2 değer alabilir, true ya da false. bool veri tipi sayesinde değişkenleri mantıksal olarak tanımlayabiliriz. Mantıksal ifadeler daha çok kesin değerler için kullanılır, evet-hayır,
var-yok, açık-kapalı, doğru-yanlış gibi. Örneğin, öğrencinin ödevini yapıp yapmadığını tutacak bir
değişken tanımlayalım adı da odevYapildiMi olsun, eğer ödevini yapmış ise değeri true değilse
false yaparız.
Değişkenler ve Veri tipleri
//değişken ilk tanımladığında değer verilmez ise false değerini
alır.
bool odevYapildiMi;
//daha sonradan değeri değiştirilebilir.
odevYapildiMi = true;
Çıkış Dizisi
C# dilinde metinsel ifadelerden string veri tipini kullanırken, bazı belli başlı karakterleri kullanamayız. Bunun sebebi bu karakterleri C# dilinin de kullanıyor olmasıdır. Örneğin çift tırnak. Bununla
birlikte bazen alt satıra geçmek de isteyebiliriz. İşte bu durumlarda string ifadeler içinde Escape
Squence denen çıkış dizileri kullanmalıyız.
Karakter
Açıklaması
\’
Tek tırnak
\”
Çift Tırnak
\\
Ters bölü
\0
Null
\a
Uyarı (Alert)
\b
Gerisilme (Backspace)
\f
Sayfa İleri (Form Feed)
\n
Satır Sonu (New Line)
\r
Satır Başı (Carrige Return)
\t
Yatay Sekme (Tab)
\v
Dikey Sekme (Verical Tab)
Örnek kullanımlar:
string text = “Bilgeadam \”bilgi\” teknolojileri.”;
Bilgeadam “bilgi” teknolojileri.
string text = “Bilgeadam \nbilgi teknolojileri.”;
Bilgeadam
bilgi teknolojileri.
string text = “Bilgeadam \tbilgi teknolojileri.”;
Bilgeadam
bilgi teknolojileri.
Tip Dönüşümleri
Değişkenlerle çalışırken bir tipteki değeri, farklı bir tipteki değişkene atama ihtiyacı duyabilirsiniz.
Bu işlem çok yaygın olarak kullanılır. .NET Framework iki tür tip dönüşümünü destekler, kapalı
dönüşüm (implicit conversion) ve açık dönüşüm (explicit conversion). Kapalı dönüşümde, tip dönüşümü işlemi tamamen .NET Framework’e bırakılırken, açık dönüşümde net bir şekilde değerin
hangi türe dönüştürüleceği belirtilir.
1
int Toplam;
2
byte adet = 5;
3
Toplam = adet;
49
50
Bölüm 4
Bu örnekte tip dönüşümü 3 nolu satırda gerçekleşiyor. Sağ taraftaki değişkenin değeri sol taraftaki değişkenin tipine yani int tipine çevriliyor ve Toplam adlı değişkene atanıyor. Tipler uyumlu
olduğundan, yani int veri tipi, byte verit tipinin alabileceği değerleri desteklediğinden, sistem çevirme işlemini otomatik yapar. Buna kapalı dönüşüm (implicit conversion) denir.
1
int i;
2
double de = 10.56;
3
i = de;
Burada ise 3 nolu satırda hata oluşacaktır. Çünkü long veri tipi kendisinden daha küçük olan int
veri tipine kapalı olarak çevrilemez. C#’ta tüm tipler birbiri ile uyumlu değildir. Bu tür durumlarda
kapalı tip dönüşümü yapılamaz. Uyumsuz tipler arasında atama işlemi tip ataması (cast) ile yapılır. Buna da açık dönüşüm (explicit conversion) denir. Bu da değeri çevrilecek değişkenin önüne
parantez içerisinde tip yazılarak sağlanır. Örneğin, aşağıdaki örnekte, byte veri tipindeki adet
değişkeninin değerinin, int veri tipine çevrilerek Toplam değişkenine atanacağı belirtilmiştir.
Toplam = (int) adet;
Byte tipindeki bir değişken değişkenin değeri ne olursa olsun, int’e çevirebilir ama tersi bir durum
söz konusu olmadığından, yani int veri tipinin alabileceği tüm değerler byte veri tipine çevrilemeyeceğinden, çevrilecek tip mutlaka belirtilerek tip ataması yapmak gerekir.
1
byte yol;
2
byte zaman = 5;
3
byte hiz = 10;
4
yol = (byte)(zaman * hiz);
Örnekte tanımlanmış tüm değişkenler byte tipindedir ancak 4 nolu satırdaki tip ataması yapılmazsa uygulamamız derleme hatası verecek ve derlenmeyecektir. Hatanın sebebi, byte değişkenlerin
çarpımının, int veri türünde sonuç vermesidir. Veri tiplerinde byte’ın alabildiği maksimum değeri
hatırlayınız. Uygulama iki adet byte değişkenin olası en büyük değeri aldığını düşünüp çarpım
sonucunun yine bir byte değişkende tutamayacağına karar vererek sonucu int tipinde döndürmektedir. Ancak bir çarpma işleminin sonucunun byte’ın sınırlarını geçmediğinden eminseniz ve
ısrarla sonucu byte değişkende tutmak istiyorsanız, yukarıdaki gibi yol değişkenine atama işlemini gerçekleştirirken, tip atamasını da yapabilirsiniz.
Aşağıdaki tip dönüşüm tablosu, kapalı dönüşümü hangi veri tipleri için kullanabileceğinizi gösterir,
Tip
Dönüşebileceği Tip
sbyte
short, int, long, float, 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
float
double
char
ushort, int, uint, long, ulong, float, double, decimal
Değişkenler ve Veri tipleri
Açık ve kapalı tip dönüşümlerinin yanı sıra System.Convert sınıfı kullanılarak da tip dönüşümleri
yapılabilir.
1 double sayi1 = Convert.ToDouble(txtSayi1.Text);
2
double sayi2 = Convert.ToDouble(txtSayi2.Text);
3
double carpim = sayi1 * sayi2;
4
txtSonuc.Text = Convert.ToString(carpim);
Örnekte txtSayi1, txtSayi2 ve txtSonuc üç TextBox’ı temsil etmektedir. TextBox’ın Text özelliği
bilindiği üzere string veri tipinde değer taşır.
Satır 1 ve 2’de txtSayi1 ve txtSayi2 adlı TextBox’lara girilen string değerler matematik işleminden
geçirilmesi için Convert.To yöntemi ile double veri tipine dönüştürülür.
Satır 3’te çarpım işlemi yapılarak, çıkan sonuç carpim adlı double veri tipine sahip bir değişkene
atanır.
Satır 4’te ise carpim değişkenin değeri, txtSonuc TextBox’ının Text özelliğine atanabilmesi için
string tipine dönüştürülür.
Satır 4’te kullanılan Convert.ToString() yerine tüm veri tiplerinin sahip olduğu ToString() metodu
da kullanılabilir.
4
txtSonuc.Text = carpim.ToString();
Burada dikkat edilmesi gereken en önemli nokta, çevrilmek istenilen değerin çevrilecek tipe uyumlu olmasıdır. Aksi halde uygulamanız o noktada hata üretecektir. Örneğin:
double sayi = Convert.ToDouble(“yirmiiki”);
Görüldüğü üzere yirmiiki yazısı bir rakam değeri belirtmez. Türkçe olarak anlamlı gelse de bilgisayar için bir anlam taşımaz. Kod şu şekilde olursa, bir hata alınmaz:
double sayi = Convert.ToDouble(“22”);
Başka bir örnek olarak tarih dönüştürme verilebilir:
DateTime dogumTarih = Convert.ToDateTime(“6.5.1980”);
Hata vermezken,
DateTime dogumTarih = Convert.ToDateTime(“6.15.1980”);
Hata verecektir. “6.15.1980” tarihi geçerli değildir çünkü 15.ay yoktur.
Tarih formatı işletim sisteminin Bölgesel Ayarlarına (Regional and Language Options) göre değişkenlik gösterebilir. Bu örnekte kullanılan bilgisayarın Bölgesel Ayarların’ın Türkiye (Turkish) olduğu varsayılmıştır.
Aşağıdaki tablo, System.Convert sınıfı kullanılarak yapılabilecek tip dönüşümlerini kısaca özetlemektedir,
51
52
Bölüm 4
Tip Dönüşümü
Açıklama
Convert.ToBoolean()
İlgili tipi, bool tipine çevirir.
Convert.ToByte()
İlgili tipi, byte tipine çevirir.
Convert.ToChar()
İlgili tipi, char tipine çevirir.
Convert.ToDateTime()
İlgili tipi, datetime tipine çevirir.
Convert.ToDecimal()
İlgili tipi, decimal tipine çevirir.
Convert.ToInt32()
İlgili tipi, int tipine çevirir.
Convert.ToString()
İlgili tipi, string tipine çevirir.
Tip dönüşümleri ile ilgili hatalarla nasıl başa çıkacağınız
Bölüm 5’te ele alınmıştır.
Aritmetik Operatörler
Aritmetik Operatörler
+
Toplama
-
Çıkarma
*
Çarpma
/
Bölme
%
Bölümden Kalan
++
Arttırma
-- Eksiltme
Toplama ( + ) , Çıkarma ( - ) , Bölme ( / ), Çarpma ( * ) matematiksel ifadelerde nasıl çalışıyorsa
C#’ta da öyle çalışır.
Bölümden Kalan
Bölme ( / ) işlemi kalansız bir sonuç vermektedir. 10/3‘ün sonucu 1 dir. Kalanı bulmak için ise
Bölümden kalan (mod) ( % ) ifadesinden yararlanılır.
int bolunen = 10;
int bolen = 3;
int bolum;
int kalan;
bolum = 10 / 3;
kalan = 10 % 3;
Burada bolum 3, kalan ise 1 değerini alacaktır.
Arttırma ve Eksiltme
Genellikle programlama dillerinde bir değişkenin değerini 1 arttırmak veya 1 eksiltmek için şu yola
başvurulur:
Değişkenler ve Veri tipleri
x = x +1;
y = y -1;
Ancak C#’ta bunun için daha kısa bir yol kullanılmıştır:
x+=1;
x-=1;
veya daha farklı olarak şu yöntem de kullanılabilir:
x++;
y--;
Bu ifade de bir önceki örnektekiyle aynı işi yapar. Ancak bazı durumlarda arttırma veya eksiltme
ifadelerinin değişkenin sol tarafından kullanıldığında görülür:
++x;
--y;
Şimdi bir örnekle iki kullanım arasındaki farkı görelim:
1
int sene = 2000;
2
int gelecekSene;
3
gelecekSene = sene++;
Sonuç
sene = 2001
gelecekSene = 2000
Burada sene değişkeninin değeri 2001’dir. Çünkü üçüncü satırda sene++ ifadesiyle değerinin 1
arttırıldığını görüyoruz. gelecekSene‘nin değeri ise 2000 kalmıştır çünkü arttırma işlemi atama
işleminden sonra gelmiştir.
1
int sene = 2000;
2
int gelecekSene;
3
gelecekSene = ++sene;
Sonuç
sene = 2001
gelecekSene = 2001
Bu örnekte ise 3 nolu satırda bir fark görüyoruz. Arttırma işareti değişkenden evvel yazılmış. Arttırma işareti değer atamalarında değişkenden evvel eklenirse önce arttırma işlemine yapılır sonra
değişkenin değeri atanır.
Lab 4.1 Personel Formu
Bu örneğimizde çeşitli kontrolleri kullanarak basit bir bilgi formu oluşturup kullanıcının girdiği doğum tarihinden yaş hesaplanacaktır.
53
54
Bölüm 4
Formun tasarımı Şekil 4.3’teki gibi olacaktır.
Şekil 4.3
1. Yeni bir Windows projesi açın ve ismini ”personelFormu” olarak değiştirin.
2. Tablo 4.3’teki kontrolleri formunuza ekleyin.
Tablo 4.3
Name
Text
Label
lblAd
Adınız
Label
lblSoyad
Soyadınız
Label
lblCinsiyet
Cinsiyetiniz
Label
lblDogumTarihi
Doğum Tarihiniz
Label
lblAdres
Adresiniz
Label
lblSehir
İliniz
Label
lblYas
TextBox
txtAd
TextBox
txtSoyad
TextBox
txtAdres
RadioButton
rdbErkek
Erkek
RadioButton
rdbBayan
Bayan
DateTimePicker
dtpDogum
ListBox
lboxSehir
Button
btnGonder
lblYas adlı Label kontrolünün Text özelliği boş olduğu
için Form üzerinde görünmemektedir. lblYas kontrolü
dtpDogum adlı kontrolün altında yer almalıdır.
Formu Gönder
Bunlara ek olarak, txtAdres adlı textbox’ın MultiLine özelliğini true yapınız. lboxSehir adlı ListBox
kontrolünün Items özelliğine “Istanbul” ,”Ankara”
ve “Izmir” i ekleyin.
Değişkenler ve Veri tipleri
3. Formu dolduran kişi DateTimePicker kontrolünden doğum tarihini seçtiği anda lblYas adlı
Label kontrolünün Text özelliğine kişinin yaşı yazılacak.
4. dtpDogum adlı kontrolün ValueChanged olayına çift tıklayın ve dtpDogum_ValueChanged
metoduna yaşı hesaplayan kodları yazın:
private void dtpDogum_ValueChanged(object sender, EventArgs e)
{
//Bugünün yılını alıp simdikiYıl adlı int tipindeki değişkene
eşitliyoruz.
int simdikiYil = DateTime.Now.Year;
//DateTimePicker a girilen tarihin yılını alıp dogumYili
adlı int tipindeki değişkene eşitliyoruz.
int dogumYili = dtpDogum.Value.Year;
int yas = simdikiYil - dogumYili;
//Kullanıcının yaşını lblYas adlı labela yazıyoruz.
lblYas.Text = yas.ToString()+” yaşındasınız”;
}
Uygulamayı çalıştırıp gözlemleyin.
Lab 4.2 Global Değişken
Bu örneğimizde değişkenlerin kapsamını inceleyeceğiz. Öncelikle bu konudaki bir cümleyi hatırlayalım:
“değişkenler içinde bulundukları scope (alan) ve alt alanlarda geçerlidir.”
Formun tasarımı Şekil 4.4’teki gibi olacaktır.
Şekil 4.4
1. Yeni bir Windows projesi açın ve adını ”DegiskenlerinKapsami” olarak değiştirin.
2. Tablo 4.4’teki kontrolleri formunuza ekleyin.
Tablo 4.4
Name
Text
Label
lblSayac
0
Button
btnArttir
+
Button
btnEksilt
-
55
56
Bölüm 4
3. Önce Form1 Class’ı içerisinde sayac değişkenini tanımlayın.
int sayac;
4. Şimdi btnArttir isimli Button’un üzerine çift tıklayarak kod penceresine geçin ve btnArttir’in
Click olayına gerekli kodları ekleyin:
private void btnArttir_Click(object sender, EventArgs e)
{
sayac++;
lblSayac.Text = Convert.ToString(sayac);
}
Bu kod önce sayac değişkeninin değerini bir arttırır ve sonucu lblSayac isimli Label kontrolünün
Text özelliğine tip dönüşümü yaparak eşitler.
5. Şimdi btnEksilt isimli Button’un üzerine çift tıklayarak kod penceresine geçin ve btnEksilt’in
Click olayına gerekli kodları ekleyin:
private void btnEksilt_Click(object sender, EventArgs e)
{
sayac--;
lblSayac.Text = Convert.ToString(sayac);
}
Bu kod önce sayac değişkeninin değerini bir eksiltir ve sonucu lblSayac isimli Label kontrolünün
Text özelliğine tip dönüşümü yaparak eşitler.
btnArttır’a bastığımızda sayac değişkenimiz bir artıyor, btnEksilt’e tıkladığımızda ise bir azalıyor.
Görüldüğü gibi her iki metodun içerisinde aynı değişkeni kullanabiliyoruz. Çünkü sayac değişkeni
bu metotların bir üst seviyesinde tanımlandı.
Lab 4.3 Topla Birleştir
Bu örneğimizde + operatörünün sayısal ve metinsel veri tiplerine göre nasıl bir davranış gösterdiğini inceleyeceğiz.
1. Yeni bir Windows projesi açın ve adını ” ToplaBirlestir” olarak değiştirin.
2. Formunuza Tablo 4.5’teki kontrolleri ekleyin.
Tablo 4.5
Name
TextBox
txtSayi1
TextBox
txtSayi2
TextBox
txtSonuc
Button
btnTopla
Text
Topla
3. btnTopla adlı Button kontrolüne çift tıklayıp toplama işlemi için gerekli kodları yazın:
private void btnTopla_Click(object sender, EventArgs e)
{
Değişkenler ve Veri tipleri
txtSonuc.Text = txtSayi1.Text + txtSayi2.Text;
}
4. Uygulamayı çalıştırın. txtSayi1’e 10 ve txtSayi2’ye de 20 değerini girip Topla düğmesine basın. Sonuç 1020 olacaktır. Bunun sebebi (+) operatörü iki string ifade olduğunda toplama
yapmak yerine birleştirme işlemi yapmasıdır.
5. Şimdi btnTopla adlı Button’nun Click olayındaki kodu şu şekilde değiştirin:
private void btnTopla_Click(object sender, EventArgs e)
{
int sayi1 = Convert.ToInt32(txtSayi1.Text);
int sayi2 = Convert.ToInt32(txtSayi2.Text);
int toplam = sayi1 + sayi2;
txtSonuc.Text = toplam.ToString();
}
Uygulamayı tekrar çalıştırın ve aynı sayıları tekrar girin. Topla düğmesine tıkladığınızda sonucun
30 olduğunu göreceksiniz. Bunun sebebi (+) operatörünün sayısal değerler için toplama işlemi
yapıyor olmasıdır.
Ödevler
Bir bankanın kredi bölümünde çalışanların işini kolaylaştıracak bir uygulama yazın. Uygulama
kullanıcıdan çekilmek istenen kredi miktarını, faiz oranı ve vadeyi alıp müşterinin ödeyeceği faiz
miktarını hesaplayacaktır.
Uygulamanın görüntüsü Şekil 4.5’teki gibi olacaktır.
Şekil 4.5
Faizi hesaplamak için kullanacağımız formül:
Faiz = ( Ana Para x
Faiz Oranı
x Gün ) / 360
57
5
Hatalar ve
Hataların
Giderilmesi
5 Hatalar ve Hataların
Giderilmesi
•
Giriş
•
Hatalar
•
Lab 5.1 Yaş Hesaplama
•
Lab 5.2 Dışarıdan Uygulama Çalıştırma
•
Lab 5.3 Geçiş Notu Hesaplama
•
Ödevler
Hatalar ve Hataların Giderilmesi
Bu bölümde uygulama geliştirirken karşımıza çıkan hata çeşitlerini, bu hataların yakalanma ve
giderilme süreçlerini öğreneceksiniz.
Bu bölüm tamamlandıktan sonra:

Hata kavramını anlayacak,

Derleme hataları, çalışma zamanı hataları ve mantıksal hataları öğrenecek,

Try..catch yapısını anlayacak,

Visual Studio’nun hata ayıklamada kullanıcıya nasıl yardımcı olduğunu öğreneceksiniz.
Giriş
Yazılım dünyasında kesin olan bir şey varsa, o da hatasız kod yazılamayacağıdır. Uygulamayı geliştiren yazılımcının deneyimi ne olursa olsun, projenin büyüklüğü ne olursa olsun hatalar
kaçınılmazdır. Hatalar, yazılımcının yanlışlıkla yazdığı bir koddan, daha önce öngöremediği bir
durumdan veya kullanıcıdan kaynaklı olabilir. Yazılım geliştirirken hatalardan korkulmaması gerekir. Korkulacak olan durum, bu hataların, uygulama piyasa sürüldükten sonra ortaya çıkmasıdır.
Yazılım geliştirirken uygulamanın verdiği her hatayı çözerek, daha sağlıklı bir uygulama ortaya
çıkarmak yazılımcının temel görevlerinden bir tanesidir.
Kullanıcıya daha sağlıklı bir ürün verebilmek için yazılım firmaları, piyasaya sürecekleri uygulamalarının hatalarını, önce kendi test mühendisleri sayesinde bulur ve düzeltir. Daha sonra bu uygulamanın beta sürümlerini çıkarıp son kullanıcılardan gelecek hata bildirimlerini alırlar ve o hataları
da giderirler. Bu uygulama geliştirme süreci de bazen yeterli olmaz, sırasıyla CTP (Community
Technology Preview) sürümlerini, daha sonra da RC (Release Candidate) sürümlerini çıkarırlar.
Tüm bu sürümler sonucu kullanıcılardan gelen hata bildirimleri doğrultusunda, son hataları da
ayıklayıp ürünü piyasaya çıkarırlar. Hatta büyük ölçekli programlarda bunlar bile çoğu zaman
tüm hataları arındırmak için yeterli olmaz; hataları gidermek için uygulamalara patch (yama) veya
service pack çıkarırlar.
Şekil 5.1
62
Bölüm 5
Yazılım jargonunda hatalara bug, hata ayıklama işlemine ise debugging denir. Aslında bug ve
debug kelimelerinin, hata ve hata giderme yerine kullanılması oldukça gariptir. Çünkü bug ingilizce böcek, debuging ise böcekten arındırmak demektir. Bu kelimelerin neden yazılım dünyasında
kullanıldığının ilginç bir hikayesi vardır. 9 Eylül 1947’de Amerika’da Mark II adlı askeri bir bilgisayar durup dururken bozulur. Mark II, bir oda büyüklüğünde, birçok elektronik parçadan oluşan
ve amacı sadece matematik işlemleri yapmak olan bir bilgisayardır. Uzun araştırmalardan sonra
teknisyenler sonunda bozukluğun sebebini bulurlar: Devrelerin arasına sıkışıp kalan, kendiyle
beraber, devreleri de kömüre döndüren bir böcek. Böceğin devreden alınması ve gerekli tamiratın
yapılmasından sonra Mark II tekrar sorunsuz şekilde çalışmaya başlar. Mark II’den sorumlu asker
Grace Murray Hopper, bilgisayarın günlük rapor defterine böceği bantla yapıştırıp şu notu düşer:
“First actual case of bug being found.” (Böceğin ilk vakası bulunmuştur.). O tarihten bu tarihe
bilgisayarlarda meydana gelen hatalara “bug”, bu hataları çözme işlemine de “debug” denir. O
defter sayfası günümüzde, National Museum of American History müzesinde sergilenmektedir.
(Böceğin ve Grace Hopper’ın resimlerini http://en.wikipedia.org/wiki/Admiral_Grace_Hopper adresinde bulabilirsiniz.)
Uygulamalarınızı hatasız (bu durum imkansız olduğuna göre en az hataya sahip demek daha
doğru olur) bir şekilde kullanıcıya sunmak bir yazılım geliştirici olarak temel görevlerinizden bir
tanesidir. Bu bölümde hataları nasıl bulacağınızı, daha da önemli olarak bu hataları nasıl gidereceğinizi göreceksiniz.
Hatalar
Yazılım dünyasında karşılaşılan hata tipleri üçe ayrılır:

Derleme hataları

Çalışma zamanı hataları

Mantıksal hatalar
Derleme hataları, büyük çoğunlukla kodların yanlış yazılmasından kaynaklanmaktadır. Tanımlanmayan bir değişkenin kullanılması, satır sonuna noktalı virgül konulmaması, eksik süslü parantez
kullanımı gibi. Bu hatalar, bulunması en kolay hatalardır. Çünkü kodlar derlenmez ve Visual Studio size bu tip hataların nerede olduğunu tek tek gösterir.
Çalışma zamanı hataları ise çoğunlukla kullanıcı yüzünden oluşan hatalardır. Örneğin bir
TextBox’ta yazılan değeri, kodunuz tarih (DateTime) tipine dönüştürmek isteyebilir. Kullanıcı eğer
geçerli bir tarih girmezse programınız hata verecektir. Bu tip hatalar bu bölümde göreceğiniz try..
catch yapısı ile çözülebilir.
En zor bulunan hatalar ise mantık hatalarıdır. Çünkü bu hatalar oluştuğunda hiçbir şekilde hata
mesajı almazsınız. Sadece kodlar istediğiniz gibi sonuç vermez, o kadar. Örneğin döviz kurları ile
işlem yapan bir uygulamanızın da, kullanıcılarınız hesaplamaların bazen yanlış çıktığını size söyleyebilir. Bu hata bir satırda yanlışlıkla artı işareti yazmak yerine eksi işareti yazmaktan da meydana gelebilir, internetten döviz kurlarını çekerken yanlışlıkla dolar yerine avro kurunu çekmenizden
de kaynaklanabilir. Belki daha başka akla hemen gelmeyecek sorunlardan da kaynaklanabilir. Bu
durumda yüzlerce hatta binlerce kod satırı arasından hatanın nereden kaynaklandığını bulmanız
gerekir. Kulağa imkansız gibi gelse de, neyse ki Visual Studio bize bu durumlar için oldukça yardımcı olur.
Derleme Hataları
Derleme hatalarını programlama dilinin kurallarına uymayan (Sözdizimi Hatası, Syntax Eror) veya
derleyicinin her durumda hata vermesi kesin olan (Derleyici Hatası, Compiler Error) kodlar yazıldığında gerçekleşir. Sözdizimi hatasına örnek olarak şunu verebiliriz:
C# için değişken tanımlama kuralı şöyledir:
Hatalar ve Hataların Giderilmesi
[Geçerli Bir Veri Tipi] [Değişken Adı];
Ayrıca değişken adının rakamla başlamaması, boşluk veya özel karakter barındırmaması gibi
tanımlama ile başka kuralları da vardır. Eğer bu kurallardan birine uyulmazsa hata alınacaktır.
Örneğin:
int deneme //satır sonunda noktalı virgül yoktur.
int44 deneme; //int44 diye bir veri tipi yoktur.
int 123deneme; //değişken adları rakam ile başlayamaz.
Derleyici hatasına örnek olarak da şunu verebiliriz:
int deneme;
deneme = “Yalçın”;
Burada söz dizimi hatası yoktur. İlk satırdaki değişken tanımlaması doğrudur. İkinci satırda ise bir
değişkene değer atama söz dizimi doğrudur. Ancak int veri tipi bekleyen bir değişkene string bir
değer atandığı için derleyici ikinci satırda hata verecektir.
Derleme anında, kodunuzun mantıklı bir şekilde çalışıp çalışmadığı kontrol edilmez; sadece ve sadece kodunuzun
programlama dilinin sözdizimine uyup uymadığı ve tür dönüşümlerinin doğru yapılıp yapılmadığı kontrol edilir.
Bu yüzden yapı olarak doğru ancak istenildiği şekilde çalışmayan projelerinizde derleme hatası almazsınız.
Eğer kodunuzda derleme hatası yapmışsanız, uygulamanızı çalıştırmak istediğinizde
Visual Studio, Şekil 5.2’deki hata penceresini
gösterecektir.
Buradaki mesajın Türkçesi şu şekildedir: “Uygulamanızda derleme hataları bulunmuştur.
Devam etmek ve en son başarılı şekilde derlenen uygulamanızı çalıştırmak ister misiniz?”
Şekil 5.2
Bu pencerede “Yes” (Türkçe işletim sistemlerinde “Evet”) düğmesine tıklarsanız programınız o
anki haliyle değil, var ise en son düzgün çalıştığı haliyle çalışacaktır. Örneğin, ekrana sadece
bir mesaj kutusunda “Merhaba” yazısı gösteren bir uygulama yazdınız. Çalıştırdınız ve bir sorun
çıkmadı. Uygulamanız tam istediğiniz gibi çalıştı. Daha sonra uygulamanıza, internete bağlanıp,
İstanbul’un hava durumunu çekip, bunları kullanıcıya gösteren kodlar eklediniz. Bu işlemleri yaparken de formunuza TextBox, ProgressBar, ListBox gibi birçok kontrol eklediniz. Ancak değişken
tanımlanan bir satırda yanlışlıkla satırın sonuna noktalı virgül koymayı unuttunuz. Uygulamanızı
görmek için çalıştırdığınızda, derleme hatanız olduğu için Şekil 5.2’deki hata penceresini göreceksiniz. Eğer “Yes” seçeneği ile devam ederseniz yeni oluşturduğunuz formu ve hava durumu
görmek yerine, daha önceki uygulamanızı yani ekranda size sadece “Merhaba” diyen bir mesaj
kutusu göreceksiniz. Çünkü yeni yazdığınız kodlarda derleme hatası olduğu için yeni kodlarınız
değil, bir önceki hatasız kodlarınız çalışacaktır. Buradan şu sonucu çıkarabilirsiniz; eğer binlerce
satırlık programınızın sadece bir yerinde derleme hatası yaparsanız, bundan sadece o kodun
dahil olduğu bölüm değil (örneğin hatalı satırın olduğu bir düğmenin tıklanma olayı) tüm proje
etkilenir. Bu sebeple projelerinizde hiçbir şekilde derleme hatası bulunmamalıdır.
Şekil 5.2’deki mesaj çıkınca asla “Do not show this dialog” seçeğini işaretleyip “Yes” düğmesine tıklamayın. Bu durum, derleme
hatalarına sahip bir uygulama başlatılmaya çalışıldığında size uyarı çıkarmadan otomatik olarak eski çalışır sürümü göstermesine
neden olur. Eğer böyle bir durumla karşılaşmışsanız tekrar eski ayarlara getirmek için Visual Studio’nun Tools menüsünün altındaki Options seçeneğini tıklayın. Karşınıza çıkan listeden Projects and Solutions düğümünü kenarındaki artı işaretine tıklayarak
açın ve Build and Run seçeneğini seçin. Sağ tarafta açılan ekrandaki “On Run, when build or deployment errors occur:” yazılı
combobox’ta “Prompt to launch” seçeneğini seçip, OK düğmesine tıklayın.
63
64
Bölüm 5
Eğer Şekil 5.2’deki pencerede “No” düğmesine tıklarsanız, Şekil 5.3’te görülen Error List penceresi ortaya çıkacaktır. Bu pencerede uygulamada geçen tüm derleme hatalarının bir listesi
sunulur.
Şekil 5.3
Her satırda, hatanın tanımı, hangi dosyada, satırda, sütunda ve projede olduğu gösterilir. Örneğin Şekil 5.3’teki hata satırı tam olarak şunu ifade eder: Hatalar (Project) adlı proje içerisindeki
Form1.cs (File) adlı kod dosyasının 26. (Line) satırının 21. (Column) karakterinde, int veri tipi
bekleyen bir değişkene “string” bir değer atanmaya çalışılmış. (Description)
Sizin için gereken en önemli sütun tanım (description) sütunudur. Diğer sütunlardaki bilgiler sizi
çok fazla ilgilendirmez. Çünkü hatayı görebilmek için ilgili projedeki, ilgili dosyayı açıp, satır ve
sütun saymazsınız. Bunu Visual Studio sizin için otomatik olarak yapar. Hatayı görmek için, Error
List penceresindeki hatayı gösteren satıra çift tıklamanız yeterlidir. Visual Studio imleci hatanın
olduğu noktaya konumlandırır.
Ayrıca Şekil 5.4’te göreceğiniz gibi hatanın olduğu yerin altı çizilir.
Şekil 5.4
Hatalı yerdeki alt çizginin rengi hatanın tipini de belirtir. Kırmızı, sözdizimi hatalarında, mavi derleyici hatalarında kullanılır. Eğer alt çizginin
rengi yeşil ise ilgili yerde hata yoktur, sadece bir uyarı vardır.
Ayrıca fare ile altı çizili yerin üzerinde biraz beklerseniz hata mesajı Şekil 5.5’teki gibi görülecektir.
Şekil 5.5
Projenizde kod yazmayı bitirdikten sonra derleme hatası olup olmadığını kontrol etmek mantıklı
bir iş değildir. Hatalar, kod yazılırken sık aralıklarla kontrol edilmelidir. Projeyi test etmek için her
seferinde çalıştırmak bir süre sonra tam bir işkence olur. Çünkü amaç sadece projede derleme
hatası olup olmadığını görmektir. Ancak çalıştırılarak test edilmeye kalkışılırsa, hata varsa Şekil
5.2’deki pencere karşınıza çıkar ve buradan “No” düğmesine tıklayıp hataları görürsünüz. Eğer
hata yoksa uygulama boşu boşuna açılır. Hele bir de ilk açılışta uzun süren bir işlem yapıyorsa
(internetten bilgi indirmek, veritabanına bağlanıp veri çekmek gibi) boş yere vakit kaybederseniz.
Derleme hata mesajlarını görmek için uygulamayı çalıştırmak yerine derlemeyi (Build) tercih etmelisiniz. Derleme işlemini ya Visual Studio’nun Build menüsü altındaki “Build [Proje Adı]” seçeneğini
tıklayarak ya da CTRL+Shift+B kısayolu sayesinde gerçekleştirirsiniz. Bu yüzdendir ki deneyimli
.NET
yazılımcılarının
klavyelerindeki CTRL,
Yazılım geliştirme ile yeni tanışmışsanız her yazdığınız satırdan sonra CTRL+Shift+B komShift ve B tuşları diğer
binasyonunu kullanarak proje derlemeyi alışkanlık haline getirmelisiniz. Zaman içerisinde
kazandığınız deneyimle beraber derlemelerin sıklığını biraz daha azaltabilirsiniz.
tuşlara nazaran daha
fazla aşınmıştır. Eğer
derleme işlemi başarı ile
Hatalar ve Hataların Giderilmesi
gerçekleşirse Visual Studio’nun en alttaki Status Bar’ının solunda “Build Succeeded” (Derleme
başarı ile gerçekleşmiştir.) yazısı görünür.
Sıkça Alınan Derleme Hataları
Bu bölümde sıkça alınan derleme hatalarının nedenleri ve çözümleri üzerinde durulmuştur. Örnek
üzerinde gösterilen kodlar sadece hataya odaklanabilmek için sadeleştirilmiştir. Burada anlatılanlar dışında bir hatanın daha birçok nedeni
ve çözümü olabilir. Burada amaçlanan, yazılıma yeni başlayan kişilerin en çok karşılaştığı
Şekil 5.6
hataların nedenlerini ve çözümlerini sunarak,
onlara yol göstermektir.
X expected
Hatanın Muhtemel Çeşitleri:
; expected
} expected
) expected
Hatanın Muhtemel Nedenleri:
Hata mesajında X olarak gösterilen karakterin kullanımı unutulmuştur.
Hatanın Muhtemel Çözümleri:
Şekil 5.6’da görülen satıra çift tıklanılır. İmlecin konumlandığı yere X olarak belirtilen karakter
yazılır.
Örnek:
int sayac //satır sonunda ; yok. “; expected” hatası alınır.
Cannot implicitly convert type X to Y
Şekil 5.7
Hatanın Muhtemel Çeşitleri:
Cannot implicitly convert type ‘string’ to ‘int’
Cannot implicitly convert type ‘string’ to ‘System.DateTime’
Cannot implicitly convert type ‘decimal’ to ‘bool’
Cannot implicitly convert type ‘string’ to ‘System.Windows.Forms.TextBox’
Hatanın Muhtemel Nedenleri:

Y veri tipi bekleyen bir değişkene X veri tipinde bir değer atanmaya çalışılmıştır.

Form üzerindeki bir kontrolün özelliğine değer atanmaya çalışılırken sadece kontrolün adı
yazılmıştır.
65
66
Bölüm 5
Hatanın Muhtemel Çözümleri:

Değişkenin beklediği veri tipinde bir değer girmek ya da uygunsa ConvertTo, Parse gibi yöntemlerle tür dönüştürme işlemi gerçekleştirmektir.

Kontrolün sadece adı yerine kontrolün özelliği yazılır.
Örnek:
int sayac;
sayac = textBox1.Text;
int yas;
yas=”on yedi”;
Burada textBox1’in Text özelliği string veri tipindedir. Bu değer, int veri tipindeki sayac değişkenine atanmak istendiğinde bu hata meydana gelir. İkinci bir hata da yas adlı int veri tipindeki değişkene “on yedi” string değerini atamaya çalışmaktır. Bu hataların çözümü şu şekilde olacaktır:
int sayac;
sayac = Convert.ToInt32(textBox1.Text);
int yas;
yas=17;
Hatanın ikinci türüne örnek olarak şu verilebilir. Bir formda textBox1 adında bir textbox ve comboBox1 adında bir combobox olsun. Yapılmak istenen textBox1’ de “Yalçın” yazısı çıkarmak ve
comboBox1’in elemanlarına da “Emre” yazısını eklemektir.
textBox1 = “Yalçın”;
comboBox1 = “Emre”;
Sadece kontrol adları kullanıldığı için bu kodlar hatalıdır. Doğru yazımı şu şekildedir:
textBox1.Text = “Yalçın”;
comboBox1.Items.Add( “Emre”);
Invalid token ‘X’ in class, struct, or interface member declaration
Şekil 5.8
Hatanın Muhtemel Çeşitleri:
Invalid token ‘(‘ in class, struct, or interface member declaration
Invalid token ‘=’ in class, struct, or interface member declaration
Hatanın Muhtemel Nedenleri:
Kod yazılmaması gereken bir scope’a kod yazılmıştır. Bazı scope sadece değişken tanımlamayı
kabul edip, diğer tür kodlarda hata verir. Bazı scope’lar ise değişken tanımlama da dahil hiç bir
kod yazımına izin vermez. Şekil 5.9’da bu scope’lar gösterilmiştir.
Hatalar ve Hataların Giderilmesi
Şekil 5.9
Hatanın Muhtemel Çözümleri:
Hata veren kod satırı doğru scope’a taşınmalıdır.
Örnek:
namespace Hatalar
{
public partial class Form4 : Form
{
MessageBox.Show(“Merhaba”);
private void button1_Click(object sender, EventArgs e)
{
}
}
}
Burada işaretli kod Şekil 5.9’da da görüleceği gibi yanlış bir scope’a yazılmıştır. Hatalı satırı şu
şekilde taşırsak hatayı gideririz:
namespace Hatalar
{
public partial class Form4 : Form
{
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(“Merhaba”);
}
}
}
67
68
Bölüm 5
A namespace does not directly contain members such as fields or methods
(Bkz: Invalid token ‘X’ in class, struct, or interface member declaration)
The name ‘X’ does not exist in the current context
Şekil 5.10
Hatanın Muhtemel Çeşitleri:
The name ‘sayac’ does not exist in the current context
The name ‘yas’ does not exist in the current context
The name ‘maas’ does not exist in the current context
The name ‘dogumTarih’ does not exist in the current context
Hatanın Muhtemel Nedenleri:

Hata mesajında X olarak belirtilen değişken tanımlanmamıştır.

Hata mesajında X olarak belirtilen değişken kullanımından daha aşağıda bir satırda tanımlanmıştır.
Hatanın Muhtemel Çözümleri:
Hatalı değişken tanımlanmalıdır veya tanımlandığı satır kullanımından üst bir satıra alınmalıdır.
Örnek:
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
sayac = 0;
}
}
Burada sayac adlı daha önce tanımlanmayan bir değişken kullanılmıştır. Aynı hata şu kod bloğunda da alınır:
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
sayac = 0;
int sayac; //kullanımdan sonra tanımlanmış
}
}
Bu kodun doğru yazımı şu şekilde olacaktır:
Hatalar ve Hataların Giderilmesi
public partial class Form1 : Form
{
//sayac değişkeni burada da tanımlanabilirdi
private void button1_Click(object sender, EventArgs e)
{
int sayac;
sayac = 0;
}
}
Type or namespace definition, or end-of-file expected
Şekil 5.11
Hatanın Muhtemel Çeşitleri:
Type or namespace definition, or end-of-file expected
Hatanın Muhtemel Nedenleri:
Daha önce açılmamış bir süslü parantez kapatılmıştır. Başka bir deyişle fazladan kapatma süslü
parantezi ( } ) kullanılmıştır.
Hatanın Muhtemel Çözümleri:

Fazla olan kapatma süslü parantezi silinir.

Doğru satıra açma süslü parantezi ( { ) eklenir.
Örnek:
Burada işaretli satırdaki süslü parantez fazladır.
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
}
}
}
Doğru yazımı şu şekilde olacaktır:
public partial class Form2 : Form
{
private void button1_Click(object sender, EventArgs e)
{
}
}
69
70
Bölüm 5
Hata Mesajları Hakkında Daha Fazla Yardım
Bu bölümde her hata mesajı ve o hata mesajlarının nedenlerinin hepsi yer almamıştır. Buradaki
hata mesajları tanımları, yazılıma yeni başlayanlar için bir kılavuz niteliği taşıma amacı gütmektedir.
Eğer bu bölümde ele alınan hatalardan daha farklı bir
hata mesajı alırsanız veya bu anlatımlar sizin probleminizi
kapsamıyorsa daha ayrıntılı bir yardım almalısınız. Bölüm
2’de anlatılan “Yardımı Kullanmak” başlığı size bu konuda
yol gösterecektir. Ayrıca hata mesajları hakkında MSDN’den yardım almak için Visual Studio’da
bir kısayol mevcuttur. Hata listesi ekranında, yardım almak istediğiniz hata satırının üzerine sağ
tıklayıp Show Error Help’i seçerseniz bu hata ile ilgili MSDN’in sayfasına yönlendirilirsiniz.
Eğer süslü parantez açılmışsa fakat kapatılmamışsa “} expected” hata mesajını görürsünüz. Çözüm için (Bkz: X expected)
Şekil 5.12
Çalışma Zamanı Hataları
Hatalar her zaman derleme esnasında bulunmazlar. Bazen kodlar, sözdizimi ve derleyici hatası
almayacak şekilde doğru yazıldığı halde çalışırken koşullara göre hata verebilirler.
Bu durumu şu örnekle açıklayabiliriz: Bir araba şirketi araba üretir ve müşterilere satar. Arabaların
üretim bandından sorunsuz ve çalışır olarak çıkması, günlük hayatta bu arabaların her zaman
çalışacağı anlamına gelir mi? Tabi ki gelmez. Peki, hangi sorunlar yaşanabilir?

Müşterilerden biri arabaya benzin yerine çay koyarsa araba çalışmayacaktır.

Müşterilerden biri arabayı suyun içerisinde kullanmaya çalışırsa araba çalışmayacaktır.

Hava sıcaklığı -40 dereceye düşerse araba çalışmayacaktır.

Arabanın yedek parçaya ihtiyacı olduğu zaman, satış kataloğunda adresi verilen yedek parça
dükkânı yerinde yoksa araba çalışmayacaktır.
Daha bu gibi birçok problem sayılabilir. Bu sorunların benzeri de yazdığınız uygulamalarda sizin
başınıza gelebilir.

Kullanıcı tarih girmesi gereken bir TextBox’a rakam yazabilir.

Microsoft Office için yazdığınız bir eklenti, Office olmayan bir bilgisayarda çalıştırılmaya çalışılabilir.

Uygulamanın çalıştığı bilgisayarda bir işlem için yeterli bellek (RAM) olmayabilir.

İnternet üzerinden Merkez Bankası’ndan döviz kuru çektiğiniz bir uygulamada Merkez
Bankası’nın sunucusu o an için çalışmıyor olabilir.
Net Framework, çalışma zamanı hatalarını, her zaman değil sadece istisnai durumlarda oluştuğu için
“exception” (istisna) olarak adlandırılır.
Bu tip hatalara “Çalışma Zamanı Hatası” denir. Çalışma zamanı hataları, uygulamaların hatasız bir
şekilde çalıştığı koşullardan daha farklı koşulların
meydana gelmesiyle oluşur.
Hatalar ve Hataların Giderilmesi
Uygulamayı çalıştıran kullanıcılar, çalışma zamanı hatası oluştuğunda Şekil 5.13’teki pencereyi
görürler.
Şekil 5.13
Bu mesajda sadece hatanın kaba bir tanımı bulunmaktadır. Şekil 5.13’teki örnekte hata için sadece “Input string was not in a correct format” (Girilen yazı doğru biçimde değil) tanımı verilmektedir.
Bu hatanın hangi satırda olduğu, hatanın daha detaylı bir açıklaması gibi bilgiler yoktur. Details
(Detay) düğmesine tıklanırsa Şekil 5.14’teki gibi çok karışık, kullanıcıların, hatta yazılımcıların,
hiçbir şey anlamayacağı yazılar ortaya çıkar.
Şekil 5.14
Böyle bir hata mesajını kullanıcının görmesi, istenmeyen bir durumdur. Bu ekran yerine kullanıcıya, gayet anlaşılır bir şekilde “Lütfen geçerli bir tarih giriniz” gibi bir mesaj gösterilebilir.
Kullanıcının gördüğü bu sevimsiz pencere neyse ki sadece uygulama, ilgili exe dosyası üzerinden çalıştırıldığında görülür. Visual Studio’da proje üzerinde çalışılırken aynı hata daha farklı bir
pencere ile gösterilir.
Şekil 5.15
Şekil 5.15’te de görüldüğü üzere bu pencere daha yazılımcı dostudur. Hata olan satır sarı renk ile
işaretlenir. Hata penceresinin en üstünde hata mesajı yer alır. Troubleshooting tips yazan alanda
ise bu hatanın muhtemel çözümleri yer alır. Bu çözümlerden birine tıklanıldığında o hata ilgili
MSDN sayfası açılır.
Ancak hatanın bilinmesi tek başına bir çözüm sağlamaz. Örneğin bu senaryoda kullanıcının girdiği veri sayıya dönüştürülebilir olmadığı için bu hata alınır. Bu sebepten ötürü kullanıcıdan veri
alma kodu kaldırılamaz. Bu hatayı çözmek için çeşitli yöntemler uygulanabilir. Örneğin sadece
rakam kabul eden bir TextBox kullanılabilir veya bu satıra gelmeden önce girilen değerin raka-
71
72
Bölüm 5
ma dönüştürülüp dönüştürülmeyeceği kontrol edilebilir. Ancak örnekte verilen kod çok basit bir
koddur. Çok daha karışık ve uzun bir kodda meydana gelebilecek aksaklıkların hepsi düşünülemeyebilir. Bu yüzden, hangi olasılıkta olursa olsun, bir hata oluştuğunda programı durdurmayıp,
kullanıcıya anlaşılır bir şekilde hatayı anlatan, belki de hata oluştuğunda yazılımcının sonradan
inceleyebilmesi için bir dosyaya bu hataları yazan veya hatayı e-posta olarak gönderen bir çözüme ihtiyaç olacaktır. Bu çözümün adı try..catch’dir.
try..catch
try..catch, uygulamada hata oluştuğunda yapılması istenilen kodların yazıldığı try ve catch isimli
bloklardan oluşan bir yapıdır. try bloğunda hata vermesi muhtemel kodlar yer alır. Eğer bir hata
oluşursa, uygulama hata oluşan satırda durup hata vermez; bunun yerine catch bloğu içerisindeki kodlar çalışmaya başlar. catch bloğundaki kodlar çalıştıktan sonra uygulama hata oluşan try
bloğu içerisinden değil, try..catch yapısı altındaki kodlardan devam eder. Böylelikle uygulamamız
hata oluşsa bile sağlıklı bir şekilde çalışmaya devam eder.
try..catch yapısı şu şekildedir:
try
{
//Try Bloğu
//Buraya hata vermesi muhtemel kodlar yazılır
}
catch (Exception ex)
{
//Catch Bloğu
//Buraya hata oluştuğunda çalışacak kodlar yazılır
}
Örnek olarak bir projede textBox1 isimli bir TextBox kontrolünüz var. Kullanıcının bu kontrole
girdiği değeri, matematik işleminde kullanılmak için int veri tipine çevirmek istiyorsunuz. Bu kodda
meydana gelebilecek muhtemel çalışma zamanı hatasını önceden kestirebilirsiniz. Kullanıcı int
veri tipine dönüştürülemeyecek bir veri girerse uygulama hata verir. Bu durum oluştuğunda, kullanıcıya anlaşılır bir şekilde uyarı vermek de istersiniz. Bu yüzden kodunuzu try bloğu içerisine
yazarsınız. Bu blok içerisindeki kodda bir hata oluştuğunda, beklediğiniz hata veya başka bir hata
fark etmez, catch bloğu içerisindeki kod çalışır.
try
{
int sayi;
sayi = Convert.ToInt32(textBox1.Text);
}
catch (Exception ex)
{
MessageBox.Show(“Geçerli bir sayı giriniz.”);
}
Catch bloğunun yanındaki (Exception ex) bölümü, oluşan hata ile ilgili detaylı bilgi almak için kullanılır. Örneğin catch bloğu içerisinde kullanılan ex.Message hatanın verdiği mesajı, ex.Source
ise hatanın nerede oluştuğunu döner.
Hatalar ve Hataların Giderilmesi
Bir try bloğunun birden fazla catch bloğu olabilir. Böylelikle oluşacak hataya göre farklı kodlar
çalıştırabilirsiniz. Örneğin bir dosya açma programında dosyanın belirttiğiniz yolda olmaması bir
hatadır, dosyanın bozuk olması başka bir hatadır.
Bir de try..catch yapısı ile beraber çalışan finally bloğu vardır. Bu blok tamamen opsiyoneldir,
kullanıp kullanmamak sizin kararınıza kalmıştır. finally bloğunda yazılan kodlar, try içerisinde bir
hata oluşsun ya da oluşmasın her zaman çalışır.
Bu iki senaryoyu da eğitiminizin ilerleyen zamanlarında göreceksiniz.
Uygulamanızda try..catch bloğu kullanıp, catch bloğu içerisini boş bırakırsanız uygulamanız asla hata vermez. Ancak bu istenmeyen bir durumdur.
Çünkü uygulamanın verdiği hata çözülmeyip, sadece göz ardı edilmiştir.
Mantiksal Hatalar
Mantıksal hatalar, uygulamaların istenildiği gibi çalışmadığı zamanlarda meydana gelen hatalardır. Diğer hata türlerinin aksine bu hataları mesaj olarak almak imkansızdır. Mantıksal hatalar
%100 yazılımcıdan kaynaklanır. Genellikle algoritmaların yanlış kurulmasından veya yanlışlıkla
bir kod yazılmasından meydana gelir.
Mantıksal hataları daha iyi anlamak için araba örneğine geri dönelim. Araba üretim bandından
sağlıklı bir şekilde çıkar yani arabada bir derleme hatası yoktur. Motoru vardır, dört kapısı vardır,
tekerleri vardır ve hepsi yerli yerindedir. (derleme hatalarının uygulamanın nasıl çalıştığıyla ilgilenmediğini hatırlayınız) Ancak arabada bir problem vardır. Silecek çalıştırılmak istenildiği zaman
arabanın kornası çalar. Bu bir çalışma zamanı hatası değildir. Çünkü araba çalışmamazlık etmez
veya silecek çalıştırılmak istenildiğinde elektriğin fazla gelmesinden dolayı birden durmaz. Sorun
sadece arabada bir parçanın istenildiği gibi çalışmamasıdır. Bunun muhtemel sebebi elektrikten
sorumlu teknisyenin bir anlık dalgınlığı sonucu silecek kabloları ile elektrik kablolarını yanlış yerlere bağlaması olabilir, silecek kablosunun gevşek sıkılmasından dolayı kayıp kornaya değmesi
olabilir, direksiyon içindeki kabloların yanlış bağlanmasından kaynaklanıyor olabilir ve bu gibi
birçok farklı neden olabilir.
Gerçek bir örnek vermek gerekirse:
decimal ortalama;
decimal sayi1;
decimal sayi2;
sayi1 = 10;
sayi2 = 30;
ortalama = sayi1 + sayi2;
MessageBox.Show(ortalama.ToString());
Bu kod 10 ve 30’un ortalamasını alıp bunu kullanıcıya göstermek amacı ile yazılmıştır. Ancak
çalıştırıldığında görülür ki, ekrana 20 yerine 40 yazan bir mesaj kutusu çıkar. Bu kodlarda hiç bir
şekilde derleme hatası yoktur. Her şey C# kurallarına uygun olarak yazılmıştır, tür dönüşümleri
de doğru bir şekilde yazılmıştır. Kodda çalışma zamanı hatası da yoktur. Çünkü decimal veri tipi
bekleyen değişkenlere doğru tipte veriler atanmıştır ve kullanıcıdan değer alınmadığı için başka
bir koşul oluşması da söz konusu değildir. Ancak yine de uygulama doğru çalışmaz. Bütün sorun,
yazılımcının ortalama işlemini yapan satırda (işaretli satır) toplamı ikiye bölmesini unutmasından
veya yanlışlıkla silmesinden kaynaklanmaktadır.
Görüldüğü üzere mantıksal hatalar oluştuğunda bir hata mesajı alınmaz. Ortada sadece yolunda
gitmeyen bir durum vardır. Bu sorunun nereden kaynaklandığını bulmak ve onu gidermek yazılımcının görevidir. Mantıksal hataları yakalamak diğer hata türlerini yakalamaktan daha zordur.
Yukarıdaki örnekte ortalama değişkeninin onlarca satır sonra başka bir matematik işleminde kul-
73
74
Bölüm 5
lanıldığını düşünün. Ortalama değişkeni
yanlış değer taşıdığı için o sonuç da hatalı çıkacaktır. Yine onlarca satır sonra bir
önceki durumdan çıkan sonucun yine bir
işlemden geçip, kullanıcıya gösterildiğini
varsayın. Şansı yaver giderse kullanıcı
bu durumu fark eder ve yazılımcıya haber
verir. Yazılımcı hatalı sonuç veren satırın yakınlarında bile olmayan küçücük bir
hatayı bulmak zorundadır. Peki, yüzlerce
hatta binlerce satır kod arasından mesaj
bile vermeyen küçücük bir hata nasıl bulunur? İşte bu “böcek ayıklama” sanatıdır.
Şekil 5.16
Debugging (Hata ayıklama) işleminin önce
mantığını anlamanız gerekir. Şöyle bir örnek verilebilir:
Evinizde uzun zamandır kullandığınız bir televizyonunuz var. İlk aldığınız günden beri kumandanızdan televizyonu kapatamıyorsunuz. Bir gün, bu durum canınıza tak ediyor ve problemi çözmesi için bir tamirci çağırıyorsunuz. Televizyon da yazılım projesi gibidir. Nasıl bir yazılım projesi
yüzlerce satır koddan oluşursa, televizyon da yüzlerce elektronik devreden oluşur. Televizyonun
kumandadan kapanmama sorunu bu devrelerin herhangi birinden kaynaklanıyor olabilir. Tamirci
bu problemi nasıl çözer? Önce belirttiğiniz durumu (televizyonun kumandadan kapanmama sorunu) kendisi test eder ve problemi kendisi de tasdikler. Sonra problemin neden kaynaklanabileceğini kabaca düşünür. Sorunun ya kumandada ya da televizyonda olduğunu düşünür. Kendisine
daha kolay geldiği için kumandayı incelemeye başlar. Önce kapatma tuşuna basıldığı zaman
elektrik verip vermediğine bakar. Eğer elektrik varsa bir sonraki adım olan bu elektriğin kızıl ötesi
vericiye ulaşıp ulaşmadığına bakar. Bir sorun yoksa bir sonraki adım olan kızıl ötesi sinyalinin
doğru bir şekilde vericiden çıkıp çıkmadığına bakar. Burada da bir sorun yoksa bir sonraki adım
olan televizyondaki kızıl ötesi alıcının bu sinyali doğru bir şekilde alıp almadığına bakar. Burada
da bir sorun yoksa bir sonraki adım olan alıcının televizyondaki elektriği kesmeye yarayan devreye elektrik akımı verip vermediğini kontrol eder ve nihayet alıcının elektriği veremediğini görür.
Bu durumda bir sonraki adım olan alıcıyı açıp içini incelemeye başlar. Kumandadan değişik tuşlarına basarak çeşitli sinyaller gönderip her devrenin istenildiği gibi çalışıp çalışmadığını inceler.
İncelemelerinin sonucunda elektrik olması gereken bir kabloda elektrik olmadığını görür. Kablo
yanmıştır. Bu kabloyu yeni bir kablo ile değiştirir. Daha sonra kumandanın kapatma tuşuna basar
ve artık problemin çözülmüş olduğunu görür.
Tamircinin yaptıklarını özetleyelim:
1. Kullanıcının söylediği durumun doğru olduğunu test etti.
2. Sorunun nereden kaynaklanabileceğini tahmin edip, işe oradan başladı.
3. Kumandanın tuşuna basılmasından başlayarak, adım adım tüm gerçekleşen işlemleri inceledi, her şeyin olması gerektiği gibi olduğundan emin oldu.
4. Hatanın yerini tespit etti.
5. Orada da adım adım inceleyerek hatayı buldu ve çözdü.
6. Her şeyin artık olması gerektiği gibi olduğundan emin oldu.
Yazılım geliştirmede hata ayıklama bu örneğe çok benzer. Bir mantıksal hata varsa önce bu sorunun nerelerden kaynaklandığı tahmin edilir. Örneğin uygulamanın hesaplama kısmında bir hata
varsa muhtemelen ilk olarak hesapla düğmesine basıldığı zaman çalışan kodlar incelenmeye
başlayacaktır. Koda bakıldığında hatanın sebebini bulmak çok zordur. Bu tip hatalar, çoğunlukla
Hatalar ve Hataların Giderilmesi
uygulama çalışırken bulunabilir. Bu yüzden tam hesaplamanın başladığı yerde uygulama durdurulup, adım adım gerçekleşen işlemlerin takip edilmesi gerekir.
Uygulamayı durdurmak ve sonra adım adım ilerletmek amacıyla değişkenlerin ve kontrollerin
nasıl çalıştığını incelemek için Visual Studio bize debug araçlarını sunar.
Breakpoint
Uygulamanın çalışırken durması istenilen noktalara Breakpoint koyulur. Breakpoint, ilgili satırın
üzerindeyken F9 tuşuna basarak veya satırın sol kenarındaki boşluğu fare ile tıklayarak koyulabilir. Ayrıca satır üzerindeyken sağ tıkla gelen menüden BreakPoint  Insert BreakPoint seçeneği
ile de koyulabilir. Şekil 5.17’de görüldüğü gibi Breakpoint koyulan bir satır kırmızı renk ile işaretlenir.
Şekil 5.17
Breakpoint, uygulamanın çalışırken ilgili satırda durmasını sağlar. Dolayısı ile yazılımcı o satırdan
başlayarak adım adım kodları izleyebilir. Uygulama breakpoint’in olduğu satıra geldiğinde Şekil
5.18’de görüldüğü gibi sarı bir renk alır ve debug moduna geçer.
Şekil 5.18
Uygulama debug moduna geçtikten sonra artık adım adım incelenmeye
başlanabilir. Nasıl tamirci için parçaların doğru çalıştığı önemli ise yazılımcı için de değişkenlerin istenilen değerleri taşıması önemlidir. Değişkenlerin o anki değeri Şekil 5.19’da görüldüğü gibi fare ile değişkenin
tanımının ya da kullanımının üzerinde durularak görülebilir.
Şekil 5.19
İncelenmesi gereken sadece değişkenler olmayabilir. Örneğin bir ListBox’ın o anda kaç eleman
taşıdığını ve bu elemanların ne oldukları öğrenilmek istenebilir. Visual Studio sayesinde istenilirse
ListBox’ın tüm özellikleri veya sadece bir özelliği mercek altına alınabilir. Hatta uygulama adım
adım ilerletilirken mevcut değerleri değişirse uyarı vermesi de sağlanabilir.
Watch Penceresi
Bu senaryoyu gerçekleştirmek için Visual Studio birçok araç sunsa da en kullanışlısı watch
penceresidir. Watch penceresi yazılımcıya takip edeceği değişken veya kontrollerin o anki
değerini, adını ve veri tipini gösterir. Watch
penceresi, uygulama sadece debug modda
ise görülür.
Watch penceresindeki satırlara izlemek istediğiniz değişkenleri, kontrolleri veya kontrollerin
özelliklerini yazabilirsiniz. Watch penceresinde
Şekil 5.20
75
76
Bölüm 5
Eğer watch penceresini yanlışlıkla kapatmışsanız Visual Studio’nun
Debug menüsünden Windows - Watch - Watch 1 seçeneğini tıklayarak
ya da Ctrl+D,W kısayolunu kullanarak tekrar çıkartabilirsiniz.
yazı yazarken Şekil 5.21’de görüldüğü gibi Visual Studio’nun İntelliSense
özelliğinden de faydalanırsınız.
Şekil 5.21
Eğer watch ekranına bir kontrol adı yazarsanız, ilgili satırın yanında bir artı işareti belirecektir. Bu
artı işaretine basarsanız Şekil 5.22’de görüldüğü gibi incelemek istediğiniz kontrolün tüm özelliklerinin o anki değerlerini görebilirsiniz.
Şekil 5.22
Watch ekranına bir değişken adı yazdığınızda, o değişkenin o anki değeri Value (değer) sütununda siyah renkli olarak çıkacaktır. Uygulamanızı adım adım ilerlettikçe eğer izlediğiniz değişkenin
değerinde bir değişiklik olursa Şekil 5.23’teki gibi Value sütunundaki değer kırmızı renk olacaktır.
Şekil 5.23
Bir değişkeni veya kontrolü izlemek için adını illaki watch penceresine elle yazmanıza gerek yoktur. İzlemek istediğiniz değişkeni veya kontrolün adını koddan seçip watch penceresi üzerine
sürükleyip bırakabilirsiniz.
Başka bir alternatif olarak, Şekil 5.24’te görüldüğü gibi bir değişken ya da kontrolün adının üzerinde sağ tıklama yaparak Add Watch seçeneğini de seçebilirsiniz.
Şekil 5.24
Hatalar ve Hataların Giderilmesi
Step Into
Uygulamanın durması ve değişkenlerin izlenmesi tek başına bir işe yaramaz. Uygulamanın adım
adım çalıştırılıp her satırda yapılan işlemlerin izlenmesi de gerekir. Visual Studio bu imkanı yazılımcılara Step Into komutu ile verir.
Uygulamanız debug modda iken F11 tuşuna basarsanız uygulama o anki durduğu satırı çalıştırıp bir sonraki satıra geçer.
Üzerine gelinen satır Şekil 5.25’te görüldüğü gibi sarı renk ile
işaretlenir. Her F11 tuşuna bastığınızda, çalışacak satır kalmayıncaya kadar bu durum devam eder. Böylelikle uygulamanızın adım adım nasıl çalıştığını izleyebilirsiniz.
Şekil 5.25
Uygulamanız debug modunda iken F5 (çalıştır) tuşuna basarsanız, program debug moddan çıkar
ve kaldığı yerden çalışmaya devam eder.
Lab 5.1 Yaş Hesaplama
1. Visual Studio’da TryCatchBlogu adında yeni bir Windows projesi oluşturun.
2. Form’un Text özelliğini “Yaş Hesaplayıcı” olarak değiştirin.
3. Forma bir tane TextBox kontrolü ekleyin. Name özelliğini txtDogumTarih olarak değiştirin.
4. Forma bir tane Label ekleyin. Name özelliğini “lblDogumTarih” olarak, Text özelliğini de “Doğum Tarihi” olarak değiştirin.
5. Forma bir tane Button ekleyin. Name özelliğini “btnYasHesapla”, Text özelliğini de “Yaş Hesapla” olarak değiştirin.
Şekil 5.26
6. btnYasHesapla düğmesine çift tıklayarak açılan kod bloğuna şu kodları yazın:
private void btnYasHesapla_Click(object sender, EventArgs e)
{
DateTime dogumTarih;
dogumTarih = Convert.ToDateTime(txtDogumTarih.Text);
int yas;
yas = DateTime.Now.Year - dogumTarih.Year;
MessageBox.Show(yas.ToString());
}
7. Projeyi çalıştırın.
8. txtDogumTarih kontrolüne geçerli bir tarih girin.
Örn: 6.5.1980
9. btnYasHesapla kontrolüne tıklayın.
Herhangi bir hata alınmamış; uygulama, girilen tarihe göre yaşı hesaplamıştır.
Şekil 5.27
77
78
Bölüm 5
10. txtDogumTarih kontrolüne geçersiz bir tarih girin. Örn: 21345 veya 41.5.1980
11. btnYasHesapla kontrolüne tıklayın.
Şekil 5.28’de görüldüğü gibi uygulama girilen metni tarih formatına çeviremeyip hata vermiştir.
Şekil 5.28
12. Projeyi durdurun.
13. Kodları şu şekilde değiştirin:
try
{
DateTime dogumTarih;
dogumTarih = Convert.ToDateTime(txtDogumTarih.Text);
int yas;
yas = DateTime.Now.Year - dogumTarih.Year;
MessageBox.Show(yas.ToString());
}
catch (Exception)
{
MessageBox.Show(“Lütfen geçerli bir tarih giriniz.”);
}
14. Projeyi tekrar çalıştırın.
15. txtDogumTarih kontrolüne tekrar geçersiz bir tarih girin.
16. btnYasHesapla kontrolüne tıklayın.
Şekil 5.29
Şekil 5.29’da görüldüğü gibi uygulama bu sefer hata verip kapanmamış, kullanıcıya bir mesaj
kutusu göstermiştir.
Hatalar ve Hataların Giderilmesi
17. Projeyi durdurun.
18. Kodları şu şekilde değiştirin. (Değişen yerler işaretlenmiştir.)
try
{
DateTime dogumTarih;
dogumTarih = Convert.ToDateTime(txtDogumTarih.Text);
int yas;
yas = DateTime.Now.Year - dogumTarih.Year;
MessageBox.Show(yas.ToString());
}
catch (Exception ex)
{
MessageBox.Show(“Programda hata oluştu:” + ex.Message);
}
19. Projeyi tekrar çalıştırın.
20. txtDogumTarih kontrolüne tekrar geçersiz bir tarih girin.
21. btnYasHesapla kontrolüne tıklayın.
Şekil 5.30’da görüldüğü gibi uygulama hata verip kapanmamış ve kullanıcıya hatanın ne olduğunu söylemiştir.
Şekil 5.30
Lab 5.2 Dışarıdan Uygulama Çalıştırma
1. Visual Studio’da TryCatchBlogu2 adında yeni bir Windows projesi oluşturun.
2. Formun Text özelliğini “Çalıştır!!!” olarak değiştirin.
3. Forma bir TextBox kontrolü ekleyin. Name özelliğini txtUygulama olarak değiştirin.
4. Forma bir Button ekleyin. Name özelliğini “btnCalistir”, Text özelliğini ise “Çalıştır” olarak değiştirin.
Şekil 5.31
79
80
Bölüm 5
5. btnCalistir kontrolüne çift tıklayarak açılan kod bloğuna şu kodları yazın:
private void btnCalistir_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(txtUygulama.Text);
}
6. Projeyi çalıştırın.
7. txtUygulama kontrolüne geçerli bir internet adresi yazın. Örnek: www.yazilimuzmani.com
8. btnCalistir kontrolüne tıklayın.
Şekil 5.32’deki gibi yeni açılan bir browser’da istediğiniz sayfa göründü.
Şekil 5.32
9. txtUygulama kontrolüne “calc” yazın.
10. btnCalistir kontrolüne tıklayın.
Şekil 5.33’ teki gibi ekranınıza Windows’un hesap makinesi çıktı.
Şekil 5.33
11. txtUygulama kontrolüne geçersiz bir uygulama adı yazın. Örn: c:\uydurdum.exe,
w.yazilimuzmani.com gibi
12. btnCalistir kontrolüne tıklayın.
Olmayan bir web adresi girmek System.Diagnosistics.Process.Start için bir hata
değildir. Bu kodun görevi çalıştırmak istediğiniz şey bir web sayfası ise yazdığınız
sayfayı işletim sisteminizin browser’ına yollayıp orada açtırmaktır.
Visual Studio Şekil 5.34‘teki
gibi bir hata mesajı çıkardı.
Hatalar ve Hataların Giderilmesi
Şekil 5.34
Bu hatanın sebebi yazdığınız uygulama ya da dosya yolunun yanlış olmasıdır.
13. Projeyi durdurun.
14. Kodu şu şekilde değiştirin:
private void btnCalistir_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start(txtUygulama.Text);
}
catch (Exception)
{
MessageBox.Show(“Girdiğiniz uygulama ya da dosya yolu
yanlış.”);
}
}
15. Projeyi çalıştırın.
16. txtUygulama kontrolüne geçersiz bir uygulama adı yazın.
17. btnCalistir kontrolüne tıklayın.
Şekil 5.35
Şekil 5.35’teki gibi uyarı mesajı alındı ve uygulama hata verip durmadı.
Lab 5.3 Geçiş Notu Hesaplama
1. Visual Studio’da MantiksalHata adında yeni bir Windows projesi oluşturun.
2. Form’un Text özelliğini “Geçiş Notu Hesaplama” olarak değiştirin.
81
82
Bölüm 5
3. Form’a 5 tane Label kontrolü ekleyin. Bir tanesinin Name özelliğini “lblSonuc”, Text özelliğini
ise “0” olarak değiştirin.
4. Form’a 2 tane TextBox kontrolü ekleyin. Özelliklerinde herhangi bir değişiklik yapmayın.
5. Form’a 1 tane Button kontrolü ekleyin. Name özelliğini “btnGecisNotuHesapla”, Text özelliğini
ise “Geçiş Notu Hesapla” olarak değiştirin.
Şekil 5.36
6. btnGecisNotu düğmesine çift tıklayarak açılan kod bloğuna şu kodları yazın:
private
e)
void
btnGecisNotuHesapla_Click(object
sender,
EventArgs
{
double vizeNotu;
double finalNotu;
vizeNotu = Convert.ToDouble(textBox1.Text);
finalNotu = Convert.ToDouble(textBox1.Text);
double ortalama;
ortalama = vizeNotu * 0.3 + finalNotu * 0.7;
lblSonuc.Text = ortalama.ToString();
}
7. Projeyi çalıştırın.
8. textBox1’e 40, textBox2’ye 60 değerini girin.
9. btnGeciNotuHesapla düğmesine tıklayın.
Şekil 5.37
Şekil 5.37’deki gibi gösterilen sonucun doğru olmadığını göreceksiniz. (Sonucun (40*0.3) +(60*0.7)
= 54 çıkması gerekirdi.)
10. Projeyi durdurun.
Hatalar ve Hataların Giderilmesi
11. Seçili satıra Breakpoint koyun.
private
e)
void
btnGecisNotuHesapla_Click(object
sender,
{
double vizeNotu;
double finalNotu;
vizeNotu = Convert.ToDouble(textBox1.Text);
finalNotu = Convert.ToDouble(textBox1.Text);
double ortalama;
ortalama = vizeNotu * 0.3 + finalNotu * 0.7;
lblSonuc.Text = ortalama.ToString();
}
12. Projeyi çalıştırın.
13. textBox1’e 40, textBox2’ye 60 değerini girin.
14. btnGeciNotuHesapla düğmesine tıklayın.
Uygulama bu noktada duracaktır.
15. Watch penceresine textBox1.Text yazın.
16. textBox2.Text yazısını seçip watch penceresine sürükleyip bırakın.
17. vizeNotu değişkeni üzerine sağ tıklama yapıp Add Watch seçeneğini tıklayın.
18. Watch penceresine finalNotu yazın.
Şekil 5.38
19. F11 tuşuna basarak seçili satırı çalıştırıp bir sonraki satıra geçin.
Değerlerin Şekil 5.39’da gösterilen şekilde değişmiş olması gerekir.
Şekil 5.39
20. Tekrar F11 tuşuna basarak seçili satırı çalıştırıp bir sonraki satıra geçin.
EventArgs
83
84
Bölüm 5
Değerlerin Şekil 5.40’ta gösterilen şekilde değişmiş olması gerekir.
Şekil 5.40
Bu satırda bir mantıksal hata vardır. textBox2’nin değeri finalNotu değişkenine atanması gerekirken, finalNotu, textBox’in değerini alıyor.
21. Projeyi durdurun.
22. Hatayı bulduğunuz satırı şu şekilde değiştirin:
finalNotu = Convert.ToDouble(textBox2.Text);
23. Projeyi çalıştırın.
24. textBox1’e 40, textBox2’ye 60 değerini girin.
25. btnGeciNotuHesapla düğmesine tıklayın.
Sonuç hatasız olarak Şekil 5.41’deki gibi görülecektir:
Şekil 5.41
Ödevler
1. Yeni bir Windows projesi oluşturup, Şekil 5.42’deki gibi tasarlayın. Uygulamanın çalışması şu
şekilde olacak şekilde kodlarını yazın:
TextBox’a girilen değer eğer sayısal ise 1. ListBox’a, değilse 2. ListBox’a atılsın.
Şekil 5.42
2. Yeni bir Windows projesi oluşturup, Şekil 5.43‘teki gibi tasarlayın.
Hatalar ve Hataların Giderilmesi
TexBox’ların adı txtSayi1 ve txtSayi2’dir. Formda sonucun çıkacağı Label kontrolünün adı da
lblSonuc’tur.
Şekil 5.43
Uygulama TextBox’lara girilen iki sayının ortalamasını gösterir.
İki sayının ortalaması, bu iki sayının toplamının ikiye bölünmesi ile bulunur.
Örnek: 10 ile 20‘ nin ortalaması 15’tir. Bu sonuç şu şekilde bulunur:
10+20=30
30/2=15
private void btnHesapla_Click(object sender, EventArgs e)
{
double 1inciSayi
double 2inciSayi;
1nciSayi = txtSayi1.Text;
2ncisayi = txtSayi2.Text;
double ortalama;
ortalama = 1nciSayi + 2ncisayi / 2;
lblSonuc.Text = ortalama.ToString();
}

Verilen kodlardaki derleme hatalarını ortadan kaldırın.

Verilen kodları çalışma zamanı hatası vermeyecek şekilde düzenleyin.

Verilen kodlardaki mantık hatasını düzeltin.
85
6
Algoritma
6 Algoritma
•
Algoritma Nedir?
•
Akış Diyagramı
•
Algoritma Uygulamaları
•
Lab 6.1 Stok Takip Yazılımı
•
Ödev
Algoritma
Programlamanın temelinde çalışma akışını, izlenecek yolları belirleyen algoritmalar vardır. Bir iş
yapılmaya başlanmadan önce nasıl planlanıyorsa, kodlamaya geçilmeden önce de bir çalışma
planı belirlenmelidir. Yazılımlar, bu planda yazılan kodları belli bir sıra ile okur ve işler. Dolayısıyla
algoritma yapısını çok iyi kurmak gerekir. Kurulan algoritmalar akış diyagramları ile görsel zenginlik kazanırlar.
Bu bölüm tamamlandıktan sonra:

Algoritma kurmayı öğrenecek,

Akış diyagramları ile algoritmaları görsel olarak ifade edebileceksiniz.
Algoritma Nedir?
Algoritma, bir işin hangi etaplardan geçilerek yapılacağını gösteren çalışma planıdır. Algoritma
bir programlama dili değildir. Programlama dillerine yol gösteren bir yöntem dizisidir. Her dilde
algoritma yazılıp uygulanabilir. Örneğin bir cep telefonunun el kitapçığında yazan, rehber kaydı
girmek için izlenecek yollar, o işin algoritmasıdır.
Algoritma yazarken, uygulamanın çalışması için kullanılan kaynakların, yapılması gereken kontrollerin veya işlemlerin açıkça ifade edilmesi gerekir. Ayrıca iyi bir algoritmanın, tüm ihtimalleri
kontrol edip istenmeyen durumlarda ne yapılması gerektiğini belirtmesi gerekir.
Örneğin, bir e-ticaret uygulamasında ürün satış algoritması çıkarılır. Satın alınacak ürün seçildikten sonra, kullanıcıdan adet miktarı bilgisi alınır. Uygulama yazılırken, bu değerin int veri tipinde
olacağına karar verildiği düşünülürse; kullanıcının girdiği adet miktarı bu değişkene atanmadan
önce kontrol edilmelidir. Eğer int veri tipinin tutamayacağı bir değer girilmişse, çalışma anında
uygulamanın beklenmedik şekilde durduğu ya da istenmeyen sonuçların üretildiği gözlemlenir.
Ayrıca sistemin verdiği hata, kullanıcının anlamayacağı bir mesaj içereceği için, uygulamanın
imajını da kötü yönde etkiler.
Veri girişi
Çalışma zamanında çoğu zaman, işleyişin tamamlanması için dışarıdan bir bilgi girilmesi gerekir.
Algoritmanın çalışması için ihtiyaç duyduğu veriler, işlemi başlatan kişiden veya belirtilen bir kaynaktan alınabilir. Bu bilgiler sağlanmadan işlem devam etmez.
Kararlar
Karar ve kontrol yapıları algoritmanın akışını yönlendiren en önemli kavramlardır. Girilen veya
işlem sonucunda elde edilen veriler, işlemin amacına göre kontrol edilir ve sonuca göre algoritma
akışı istenilen yere yönlendirilir.
İşlemler
Algoritmanın akışı boyunca veriler üzerinde değişiklikler, yeni değer atamaları gibi işlemlere ihtiyaç duyulur. Algoritmalar kurulurken, yapılan işlemlerin yalın halde, tek tek yazılması okunabilirliği
arttırır.
Algoritmalar adım sırası ile çalışır ve karar yapıları sonucunda farklı bir yere yönlendirilmediği
müddetçe, bir sonraki adım ile işlemeye devam eder.
Örnek: Telefon kulübesinden telefon açmak için örnek bir algoritma
1. Telefon kulübesine git
2. Telefon kartı al
90
Bölüm 6
3. Telefon sırasında kaç kişi olduğuna bak
4. Kişi sayısı sıfırdan fazlaysa 3 e dön
5. Kapı kapalıysa kapıyı aç
6. İçeri gir, kapıyı kapat
7. Telefon kartını telefona yerleştir
8. Ahizeyi kaldır
9. Numarayı çevir
10. Konuşmanın bitip bitmediğine bak
11. Konuşma bittiyse kartı al, bitmediyse 10 a dön
12. Bir daha konuşma yapılacaksa 7‘ye dön
13. Kapıyı aç, dışarı çık
Bu algoritmanın işlemesi için, her ihtimal gözden geçirilerek, algoritma akışı gerekli yerlere yönlendirilir. Örneğin kapının kapalı olması durumunda kapıyı açmak için gerekli komutlar verilmelidir. Bu algoritmanın ihtiyaç duyduğu veriler, ya kullanıcı tarafından verilir ya da işlem başlamadan
önce belirlidir. Sıradaki kişi sayısı, telefon kartı gibi veriler kullanıcı tarafından sağlanmış; çevrilecek numara, algoritma başlamadan önce belirlenmiştir.
Akış Diyagramı
Madde madde yazılan algoritmaların okunması kolaydır ancak işleyişin bütününü görmek çoğu
zaman mümkün değildir. Akış diyagramları, algoritmaları görsel biçimde göstermeyi, dolayısıyla
daha anlaşılır hale getirmeyi sağlar. Algoritmada yapılacak işlemlerin çeşitlerine göre çeşitli semboller kullanılır.
Başla – Bitir
Algoritmanın hangi aşamadan başlayacağını ve ne zaman biteceğini gösteren semboldür. Bir
algoritmayı temsil eden akış diyagramında, bir tane Başla ve bir tane Bitir sembolü olmalıdır.
Şekil 6.1
Veri Girişi
Kullanıcıdan veya başka bir kaynaktan alınan verilerin isimlerini tutar.
Şekil 6.2
Karar Verme
Karar yapısını belirten semboldür. Üstünde koşul ifadesi belirtilir.
Şekil 6.3
Algoritma
Veri tabanı
Veri tabanında okuma veya yazma işlemi yapıldığını gösterir.
Şekil 6.4
Ekran
Üzerinde yazılan yazının bilgi olarak ekranda görüneceğini belirtir.
Şekil 6.5
Printer
Üzerinde yazılan yazının yazıcıdan çıkarılacağını belirtir.
Şekil 6.6
İşlem
Bir işlem yapılacağını belirten semboldür. Her işlem için ayrı bir fonksiyon sembolü kullanılması,
akış diyagramını daha anlaşılır kılar.
Şekil 6.7
Fonksiyon
İşlem sembolüne yazılamayacak büyüklükte işlemler, alt işlem olarak bu sembolle belirtilir.
Şekil 6.8
Algoritma Uygulamaları
Bilet Satma
Bir tiyatro uygulamasının sürekli gerçekleştireceği temel işlem bilet satmaktır. Bu işlemi gerçekleştirmek için gerekli kodlar yazılmadan önce, algoritma kurulmalıdır.
1. Kullanıcının istediği oyun, gün ve yer bilgileri alınır.
2. Veritabanı sorgulanarak, belirtilen günde oynayan oyunun boş yerleri çıkartılır.
91
92
Bölüm 6
3. Boş yer sayısı sıfırsa, o günde belirtilen oyun oynamıyordur ya da oyundaki bütün yerler satılmıştır.
4. Her iki durumda da bilet kesilemediği için ekrana hata mesajı gösterilir. Gün ve oyun bilgilerini
baştan almak için ilk etaba dönülür.
5. Kullanıcıdan oturmak istediği yer bilgisi alınır.
6. İstediği yerin dolu olup olmadığı kontrol edilir.
7. Yer dolu ise ekrana hata mesajı gösterilir ve yer bilgisi tekrar alınmak üzere 5. etaba dönülür.
8. Yer boşsa, veritabanında oyunun yer kayıtları güncellenir.
9. İstenilen gün, oyun ve yer bilgilerini içeren bilet yazıcıdan çıkartılır.
Şekil 6.9
Çay Demleme
Bu örnekte, bir çay demleme işleminde yapılması gereken işlemleri, kontrol edilmesi gereken
olayları içeren algoritma kurulur.
1. Kullanıcıdan su vermesi beklenir.
2. Suyu ısıtma işlemi yapılır.
3. Suyun kaynayıp kaynamadığı kontrol edilir. Kaynamamışsa 2. etaba dönülür.
4. Çay daha önceden hazır olduğu için, kullanıcıdan beklenmez. Demliğe çay koyma işlemi
yapılır.
5. Kullanıcıdan, demleme işleminin ne kadar süreceği bilgisi alınır.
6. Kullanıcıdan alınan demleme süresi ile şimdiki zaman (çayın demlenmeye başladığı zaman)
toplanır. Çıkan değer, BitisZamani isimli değişkene atılır. Bu değişken demleme işleminin ne
zaman biteceği bilgisini tutar.
7. Şimdiki zaman, bitiş zamanından küçükse çayın demlenmesi için ayrılan süre daha dolmamış
demektir. Bu süre dolana kadar 7. etap tekrarlanır.
8. Çayın demlendiğini, kullanıcıya ekran üzerinde bildiren bir mesaj çıkartılır.
Algoritma
Şekil 6.10
Üniversite Eğitim Notunu Hesaplama
Üniversitede bir dersin başarı notu, genelde bir vize ve bir final notu ile hesaplanır. Vize notunun
katsayısı finalden daha düşüktür. Sonuçta çıkan not 50 ve üstüyse öğrenci geçer, 50 altıysa kalır.
Bu örnek, vizenin %30 ve finalin %70 ağırlıklı olduğu başarı notunun hesaplanmasını akış diyagramı ile gösterir.
1. Notu hesaplanacak öğrencinin numarası
kullanıcıdan alınır.
2. Veritabanından öğrencinin vize ve final notları çekilir.
3. Eğer final notu 28 veya daha düşükse öğrenci kalır ve 9. etaba gidilir. Bu durumda
vize notu 100 olsa dahi, sonuç olarak toplanan not 50 altında olur. Dolayısıyla öğrencinin kalması kesinleşir. Böyle bir kontrol
yapılması, gereksiz işlemlerin yapılmasını
engeller.
4. Vize değişkenine, veritabanından alınan
vize notunun %30 u atanır.
5. Final değişkenine, veritabanından alınan final notunun %70 i atanır.
6. Sonuc değişkenine, vize ve final değerlerinin toplamı atanır.
7. Sonuc değerinin 50’den büyük olup olmadığı kontrol edilir.
8. Sonuc 50’den büyükse ekrana “Geçtiniz” yazan bir mesaj çıkartılır. Algoritmadan çıkılır.
9. Sonuc 50’den küçükse ekrana “Kaldınız” yazan bir mesaj çıkartılır.
Şekil 6.11
93
94
Bölüm 6
Lab 6.1 Stok Takip Yazılımı
Basit bir stok takip yazılımının algoritması:
1. Kullanıcının kullanıcı adı ve şifre bilgileri alınır.
2. Girilen kullanıcı adı ve şifre bilgilerinin veri tabanında olup olmadığı kontrol edilir.
3. Eğer varsa; kullanıcın yetkili olduğu formlar açılır. Yoksa kullanıcıya mesaj döner. Bilgiler
tekrar istenir.
4. Kullanıcı stok takibi yapmak istediği ürünü seçer.
5. Seçilen ürün veri tabanında taranarak stok bilgileri ekrana getirilir.
6. Eğer ürün stoğu kritik seviyede ise kullanıcı uyarılır.
7. Kullanıcı ürün stoğunu güncellemeye çalıştığında yeni stok değerinin negatif olup olmadığı
kontrol edilir.
8. Eğer negatif ise güncelleme kabul edilmez. Pozitif ise güncelleme kabul edilir.
9. Kullanıcı yeni ürün eklemeye çalıştığında eklenecek ürünün veri tabanında olup olmadığına
bakılır.
10. Eğer ürün varsa stok bilgisini günceller, yoksa ürünü veri tabanına kaydeder.
Algoritması oluşturulan Stok Takip Uygulamasının akış diyagramını hazırlayın.
Ödev
1. Kullanıcı tarafından girilen sayının çift ya da tek olup olmadığını bulan algoritmayı adım adım
yazın.
2. Akış diyagramını MS Visio ile çizin.
7
Operatörler
ve Karar
Yapıları
7 Operatörler ve Karar
Yapıları
•
Operatörler
•
if Deyimi
•
switch Deyimi
•
Lab 7.1 Sayı Tahmin Oyunu
•
Lab 7.2 Uygulama Yükleyici
•
Lab 7.3 Şans Oyunu
•
Ödevler
Operatörler ve Karar Yapıları
Bu bölümde ilişkisel ve mantıksal operatörler ve program akışını kontrol eden deyimleri incelenmektedir. Bir veya birden fazla değişkenin durumunu kontrol etmek, hangi durumda programın ne
şekilde davranacağı ele alınacaktır.
Bu bölüm tamamlandıktan sonra:

İlişkisel ve mantıksal operatörleri kavrayacak,

if deyimi etkin bir biçimde kullanacak,

switch deyimi ile gelişmiş durum kontrolü yapabileceksiniz.
Operatörler
Uygulama geliştirilirken bir durum karşılaştırması yapmak isteyebiliriz. Örneğin kullanıcıdan alınan bir bilginin doğruluğunu sınamak isteyebiliriz. Finansman işlemlerinde eksi değerler bir anlam
ifade etmeyeceği için kullanıcının girdiği bilginin sıfırdan büyük olup olmadığı gibi bir sınama ilişkisel operatörler yardımıyla sınanabilir.
İlişkisel Operatörler
==
Eşittir
!=
Eşit değildir
<
Büyüktür
>
Küçüktür
>=
Büyüktür veya eşittir
<=
Küçüktür veya eşittir
İlişkisel ve mantıksal operatörler her zaman bool tipinde bir sonuç döndürürler. Dolayısıyla genellikle if deyimi ile birlikte kullanılır.
Bir sayı tahmin oyunu yaptığımızı düşünelim ve kullanıcıdan TextBox’a bir sayı girmesini isteyelim. Kullanıcının sayıyı doğru bilip bilmediğini sınayalım:
1int sayi = 5;
2int tahmin = Convert.ToInt32(TextBox1.Text)
3if ( sayi == tahmin )
4
MessageBox.Show(“Tebrikler, bildiniz.”);
5else
6
MessageBox.Show(“Üzgünüm, bilemediniz.”);
3 nolu satırda görüldüğü gibi bir ilişkisel operatör kullanılarak eşitliğin sağlanıp sağlanmadığı
sınanmıştır.
98
Bölüm 7
Mantıksal Operatörler
&
VE
|
VEYA
||
Kısa Devre VEYA
&& Kısa Devre VE
!
DEĞİL
Mantıksal operatörler ise iki bool değerini karşılaştırmak için kullanılır.
Bunu parola giriş ekranında Kullanıcı Adı ve Parola’nın sınandığı bir örnekte açıklayalım.
1string KullaniciAdi = txtKullaniciAdi.Text;
2string Parola = txtParola.Text;
3
4if( KullaniciAdi == “admin” & Parola == “123” )
5
MessageBox.Show(“Tebrikler, giriş başarılı.”);
6else
7
MessageBox.Show(“Üzgünüm, giriş başarısız.”)
4 nolu satırda görüldüğü gibi iki adet ilişkisel operatör kullanılmış. KullaniciAdi == “admin” ve
Parola == “123”. Daha önce ilişkisel ve mantıksal operatörlerin her zaman bool tipinde değer
döndürdüğünden bahsetmiştik. Dolayısıyla bu iki ilişkisel sınamanın bool tipindeki sonuçlarını &
mantıksal operatörü ile sınayarak her iki değerinde doğrulunu kontrol etmiş olduk.
Mantıksal Operatörlerin Sonuçları
p
q
p & q p | q
!p
false
false
false
false
true
true
false
false
true
false
false
true
false
true
true
true
true
true
true
false
Kısa Devre Operatörler
Kısa devre operatörlerinin normal VE ( & ) ve VEYA ( | ) operatörlerinden çalışma mantığı biraz
farklıdır. Normal operatörlerde ne olursa olsun her iki operatörde kontrol edilir. Örneğin normal
VE ( & ) operatöründe ilk operatörün sonucu yanlış ( false ) ise ikinci operatörde ne olursa olsun
sonuç yanlış ( false ) çıkacaktır. Aynı şekilde VEYA ( | ) operatörü kullanıldığında ilk operatörün
sonucu doğru ( true ) ise ikinci operatör ne olursa olsun sonuç doğru ( true ) çıkacaktır. Bu iki
durumda da ikinci operatörün kontrol edilmesi gereksizdir. Kısa devre operatörleri ( && , || ) kullanıldığı zaman bu durumlarda ikinci operatör kontrol edilmez. Bu performans artışı sağlayacağı
gibi bazı istisnai durumlarda programın hata vermesini de engelleyecektir.
1string KullaniciAdi = txtKullaniciAdi.Text;
2string Parola = txtParola.Text;
Operatörler ve Karar Yapıları
3
4if( KullaniciAdi == “admin” & Parola == “123” )
5
MessageBox.Show(“Tebrikler, giriş başarılı.”);
6else
7
MessageBox.Show(“Üzgünüm, giriş başarısız.”)
Örnekte kullanıcı adı yanlış girilse dahi parola da kontrol edilmektedir. Hâlbuki kullanıcı adı yanlış
girilirse parola doğru girilse dahi sonuç yanlış çıkacaktır.
false
& true = false
Dolayısıyla parolayı ikinci bir kez kontrol etmeye gerek yoktur. 4. satırdaki VE( & ) operatörünü
Kısa Devre VE ( && ) yaparsak kullanıcı adının yanlış girilmesi halinde Parola kontrolü yapılmadan sonuca daha kısa sürede ulaşarak yanlış ( false ) sonucunu döndürecektir.
1string KullaniciAdi = txtKullaniciAdi.Text;
2string Parola = txtParola.Text;
3
4if( KullaniciAdi == “admin” && Parola == “123” )
5
MessageBox.Show(“Tebrikler, giriş başarılı.”);
6else
7
MessageBox.Show(“Üzgünüm, giriş başarısız.”)
Bu yüzden C#’ta normal VE ( & ) ve VEYA ( | ) operatörlerinden daha çok Kısa Devre ( && ) ve
Kısa Devre VEYA ( || ) kullanılmaktadır.
Atama Operatörü
Atama operatörü bir adet eşittir ( = ) dir.
değişken = değer;
Sağdaki değeri soldakine aktarır. Ancak sağdaki değer soldakinin veri tipine uyumlu olmak zorundadır. Değilse, tip dönüştürme işlemi uygulanmalıdır.
Ardı ardına değer atama işlemine izin verir.
Bir oyun uygulaması geliştirdiğinizi başlangıçta her oyuncuya 30 puan verdiğinizi düşünelim.
byte oyuncu1,oyuncu2,oyuncu3;
oyuncu1 = oyuncu2 =
oyuncu3 = 30;
Burada önce oyuncu3’ün değeri 30 olacak, ardından oyuncu2’ye oyuncu3 değeri atanacak ve
oyuncu1’e de aynı şekilde oyuncu2’nin değeri atanacak ve sonuçta tüm değişkenler aynı değere
sahip olacaktır.
?: Operatörü
?: Operatörü C#’ta oldukça kullanışlıdır. Bu operatör üç parçadan oluşur. Bu yüzden üçlü ( ternary
) operatör de denir. ?: operatörü bazı durumlarda ilerleyen bölümlerde göreceğimiz if-else deyimi
yerine kullanılır. ?: operatörü genellikle bir atama operatörü ile beraber kullanılır.
99
100
Bölüm 7
Yazımı şu şekildedir:
değişken = koşul ? doğru kısım : yanlış kısım ;
koşul bölümünde bir değişkenin değeri ilişkisel ve mantıksal operatörler ile sınanır. Sonuç doğru
( true ) ise doğru kısım değeri değişkene atanır, sonuç yanlış ( false ) ise yanlış kısım değeri değişkene atanır.
Bir sayının mutlak değerini alacağımızı varsayalım. Önce sayının sıfırdan küçük olup olmadığını
kontrol etmemiz gerekir. Eğer sıfırdan küçük ise sayıyı eksi ile çarparız, sıfırdan büyük ise sayının
kendi değerini alacağız.
1int sayi = -5;
2int mutlakDeger;
3mutlakDeger = ( sayi < 0 ) ? –1 * sayi : sayi;
Burada mutlakDeger değişkeni sonuç olarak 5’tir. 3 nolu satırda atama yapılmadan evvel sayi’nın
sıfırdan küçük olup olmadığı sınanmış sonuç olarak doğru ( true ) çıkmıştır ve ?: operatörünün
doğru kısmı çalıştırılmıştır.
Operatörlerin Öncelik Sırası
*
/
+
-
<<
>>
<
>
==
!=
&
^
|
&&
||
?:
=
%
<=
>=
Operatörler ve Karar Yapıları
if Deyimi
C#’ta uygulama akışlarını kontrol etmek için kullanılan deyimlerden biri if, diğeri ise switch’tir.
Switch deyimi bir sonraki konuda incelenecektir. if, uygulamada bir koşulun kontrolünü sağlayan
deyimdir. Genel yazım şekli şöyledir:
if ( koşul )
{
Koşul doğru ise yapılacak işler;
}
else
{
Koşul yanlış ise Yapılacak işler;
}
koşul kısmında İlişkisel ve Mantıksal Operatörler kullanılarak bir değişkenin durumu kontrol edilir.
Hatırlarsanız ilişkisel ve mantıksal operatörler her zaman bool tipinde bir sonuç döndürür demiştik. if deyimi bu sonuca göre ilgili bloğu çalıştırır. if veya else deyiminden sonra sadece tek satır
yazılacaksa süslü parantezler kullanılmadan yazılabilir.
if ( koşul )
doğru ise yapılacak işler;
else
yanlış ise Yapılacak işler;
Bu durumda deyimlerden sonraki ilk satır scope gibi algılanacaktır.
Şimdi kullanıcının girdiği parolayı kontrol eden bir örnek yapalım:
1 string parola = txtParola.Text;
2
3 if (parola == “123456”)
4 {
5
MessageBox.Show(“tebrikler, parola doğru”);
6 }
7 else
8 {
9
MessageBox.Show(“üzgünüm, parola yanlış”);
10}
Örneği incelediğimizde, 3 nolu satırda if deyimi içerisinde parola değişkeninin değeri == operatörü
ile kontrol ediliyor. Kullanıcın girdiği değer “123456” değerine eşit ise deyim true değerini döndürecek ve ilk scope çalışacaktır. Eşit değil ise o zaman false değerini döndürecek ve else deyiminden sonraki scope çalışacaktır. Şimdi örneğimizi biraz geliştirelim. Kullanıcıdan parola dışında bir
de kullanıcı adı bilgisi isteyelim ve her ikisi de doğru ise işlem başarılı olsun.
string parola = txtParola.Text;
string kullaniciAdi = txtKullaniciAdi.Text;
if (kullaniciAdi == “admin” && parola == “123456”)
101
102
Bölüm 7
{ MessageBox.Show(“tebrikler, Kullanıcı Adı ve Parola
}
doğru”);
else
{ MessageBox.Show(“üzgünüm, Kullanıcı Adı veya Parola
}
yanlış”);
Burada if deyiminde VE (&&) operatörü ile iki koşulunda true olması durumunda girişi doğruladık.
Fakat durumun false olmasının hangi koşuldan kaynaklandığını bilemiyoruz. Bu durumu iç içe if
deyimi kullanarak çözebiliriz.
string parola = txtParola.Text;
string kullaniciAdi = txtKullaniciAdi.Text;
if (kullaniciAdi == “admin”)
{
if (parola == “123456”)
{
MessageBox.Show(“tebrikler,
doğru”);
Kullanıcı
Adı
ve
}
else
{
MessageBox.Show(“üzgünüm, Parolanız yanlış”);
}
}
else
{
MessageBox.Show(“üzgünüm, Kullanıcı Adınız yanlış”);
}
Bazen uygulama geliştirirken peş peşe birçok if deyimi kullanmak zorunda kalabiliriz.
byte ay = Conver.ToByte(txtAy.Text);
if (ay == 1)
MessageBox.Show(“Ocak”);
else if (ay == 2)
MessageBox.Show(“Şubat”);
else if (ay == 3)
MessageBox.Show(“Mart”);
else if (ay == 4)
MessageBox.Show(“Nisan”);
else if (ay == 5)
MessageBox.Show(“Mayıs”);
else if (ay == 6)
Parola
Operatörler ve Karar Yapıları
MessageBox.Show(“Haziran”);
else if (ay == 7)
MessageBox.Show(“Temmuz”);
else if (ay == 8)
MessageBox.Show(“Ağustos”);
else if (ay == 9)
MessageBox.Show(“Eylül”);
else if (ay == 10)
MessageBox.Show(“Ekim”);
else if (ay == 11)
MessageBox.Show(“Kasım”);
else if (ay == 12)
MessageBox.Show(“Aralık”);
else
MessageBox.Show(“1-12 arası sayı girmelisiniz”);
Örnekte olduğu gibi 1 ile 12 arası girilen sayıya göre kullanıcıya ay bilgisi dönmektedir. Burada
peş peşe 12 adet if yerine tek if deyimi kullanılmış ve devamında ise else if deyimleri ile devam
edilmiş girilen değer 1 ile 12 arası değil ise else değiminde uyarı mesajı verilmiştir. Burada kullanılan else if deyimi, kodun tüm if deyimlerini kontrol etmesini engellemiş ve sondaki else deyiminin
kullanımını sağlamıştır.
switch Deyimi
switch deyimi de if deyimi gibi uygulama akışlarını kontrol etmek için kullanılır. Genellikle daha
okunaklı ve birçok durum için daha verimli olduğu için karmaşık else if blokları yerine kullanılır.
Genel yazım şekli şöyledir:
switch ( değişken )
{
case durum1 :
yapılacak işler;
break;
case durum2 :
yapılacak işler;
break;
case durum3 :
yapılacak işler;
break;
.
.
.
default :
yapılacak işler;
break;
}
103
104
Bölüm 7
Bir önceki konuda else if deyimi ile yaptığımız örneği birde switch ile yapalım:
byte ay = Conver.ToByte(txtAy.Text);
switch (ay)
{
case 1 :
MessageBox.Show(“Ocak”);
break;
case 2:
MessageBox.Show(“Şubat”);
break;
case 3:
MessageBox.Show(“Mart”);
break;
case 4:
MessageBox.Show(“Nisan”);
break;
case 5:
MessageBox.Show(“Mayıs”);
break;
case 6:
MessageBox.Show(“Haziran”);
break;
case 7:
MessageBox.Show(“Temmuz”);
break;
case 8:
MessageBox.Show(“Ağustos”);
break;
case 9:
MessageBox.Show(“Eylül”);
break;
case 10:
MessageBox.Show(“Ekim”);
break;
case 11:
MessageBox.Show(“Kasım”);
break;
case 12:
MessageBox.Show(“Aralık”);
break;
default :
MessageBox.Show(“1-12 arası sayı girmelisiniz”);
break;
}
Operatörler ve Karar Yapıları
Örneği incelediğimizde, txtAy isimli TetxBox’a girilen sayıya denk gelen kısım switch deyimi tarafından ilgili case’de (durum) çalıştırılır. İşlem yapıldıktan sonra break atlama ifadesi ile diğer
case’lerin çalışması önlenir. En sonda bulunan default if deyimindeki else gibi çalışır yani hiçbir
case‘in uymadığı durumda çalışan bölümdür.
switch deyimi kullanırken dikkat edeceğimiz hususlardan bir tanesi de durumunu kontrol ettiğimiz değişken ile case’lerde belirttiğimiz sabitlerin veri
tiplerinin aynı veya uyumlu olması gerektiğidir.
case
ifadelerinde değişken
kullanılamaz.
Lab 7.1 Sayı Tahmin Oyunu
1. Yeni bir Windows projesi açın ve ismini “SayiTahmini” olarak değiştirin. Formunuzun görüntüsü Şekil 7.1’deki gibi olmalıdır.
Şekil 7.1
2. Formunuza Tablo 7.1’deki kontrolleri ekleyin.
Tablo 7.1
Name
Text
Label
lblSayi
Bir Sayi Giriniz
Label
lblMesaj
1-100 arası bir sayi girin
Button
btnTahminEt
Tahmin Et
Button
btnBaslat
Oyunu Başlat
Button
btnKapat
Oyundan Çık
3. Tahmin edilecek sayıyı tutmak için int tipinde bir değişken tanımlayın. Ardından bu sayısı
rastgele oluşturacak Random nesnesini ekleyin. Bu nesnelere tüm scope’lardan ulaşılacağı
için global tanımlanmalıdır.
int sayi;
Random rastgele = new Random();
4. btnBaslat adlı Button’a çift tıklayarak kod penceresine geçin ve rastgele sayı üreterek oyunun
başlatan kodu yazın.
private void btnBaslat_Click(object sender, EventArgs e)
{
//0-100 arsı rastgele bir sayı üretip değerini sayi adlı değişkene
atıyoruz.
sayi = rastgele.Next(0, 101);
}
5. btnTahminEt adlı Button’a çift tıklayarak kod penceresine geçin ve txtSayi kontrolüne girilen
sayının tahmin edilen sayı ile aynı olup olmadığını kontrol eden kodları yazın.
105
106
Bölüm 7
private void btnTahminEt_Click(object sender, EventArgs e)
{
//Kullanıcının girdiği sayiyi girilenSayi adlı tamsayı değişkene
atıyoruz.
int girilenSayi = Convert.ToInt32(textSayi.Text);
//girilen
kazanılır
sayı
eğer
rastgele
üretilen
sayıya
eşitse
oyun
if (sayi == girilenSayi)
{
lblMesaj.Text = “BRAVOO BULDUNNN !!!”;
}
//girilen sayı eğer rastgele üretilen sayıdan büyükse uyarı uyarı
verilir.
if (sayi > girilenSayi)
{
lblMesaj.Text = “Daha büyük bir sayı girin”;
}
//girilen
verilir.
sayı
eğer
rastgele
üretilen
sayıdan
küçükse
uyarı
if (sayi < girilenSayi)
{
lblMesaj.Text = “Daha küçük bir sayı girin”;
}
}
6. Son olarak btnKapat adlı Button’un Click olayına formu kapatacak kodları yazın.
private void buttonKapat_Click(object sender, EventArgs e)
{
//Formu Close metodu ile form kapanıyor.
this.Close();
}
Lab 7.2 Uygulama Yükleyici
Bu örneğimizde arka planda bir program yüklenirken kullanıcıya programın yüklenmesiyle ilgili
detayları veren bir uygulama geliştireceğiz. Programınız mevcut yüklenme miktarını da grafiksel
olarak gösterebilmelidir. Uygulama bittiğinde programın görüntüsü Şekil 7.2’deki gibi olacaktır.
Operatörler ve Karar Yapıları
Şekil 7.2
1. Yeni bir Windows projesi açın ve ismini “ProgramYukleniyor” olarak değiştirin.
2. Formunuza Tablo 7.2’deki kontrolleri ekleyin.
Tablo 7.2
Name
Text
PictureBox
pcbResim
ProgressBar
pbDurum
Label
lblDurum
Birazdan
program
başlayacak
Button
btnDevam
Devam ->
Timer
tmrYukleyici
yüklemesi
tmrYukleyici’nin Interval özelliğini 1000 yapın.
3. Formun Load olayına yükleme işlemini başlatan kodları yazın.
private void Form1_Load(object sender, EventArgs e)
{
//Yükleme işlemi bitmeden devam düğmesine basılamasın
btnDevam.Enabled = false;
//Yükleme işlemi şimdi başlasın
tmrYukleyici.Start();
}
4. tmrYukleyici adlı Timer kontrolünün Tick olayına uygulamanın gövdesini oluşturacak if deyimi
ile yüklenen modülleri gösterecek kodları yazın.
private void tmrYukleyici_Tick(object sender, EventArgs e)
{
//Artışı sağlamak için rastgele sayı oluşturucu tanımlıyoruz
//Artışın rastgele olmasının sebebi kullanıcının uygulamayı her
yüklediğinde
//farklı artışlar görüp durumdan şüphelenmemesi :)
//İsterseniz timer’ın interval’ini de rastgele değiştirip daha da
gerçekçi hale
//getirebilirsiniz
Random rastgeleSayiOlusturucu = new Random();
int artisOrani = rastgeleSayiOlusturucu.Next(1, 20);
107
108
Bölüm 7
//oluşturduğumuz rastgele artışı progress bar’ın artışı olarak
atıyoruz.
pbDurum.Step = artisOrani;
//progress bar’dan artışı gerçekleştirmesini sağlıyoruz.
pbDurum.PerformStep();
//artıştan sonraki progress bar’ın değerini suAnkiDeger değişkenine
atıyoruz
int suAnkiDeger=pbDurum.Value;
if (suAnkiDeger<=20) //0-20 arasında
{
lblDurum.Text = “Program yüklenmeye hazırlanıyor.”;
}
else if(suAnkiDeger>20&&suAnkiDeger<=45) //21-45 arasında
{
lblDurum.Text=”Güvenlik modülü yükleniyor.”;
}
else if (suAnkiDeger > 45 && suAnkiDeger <= 70) //46-70 arasında
{
lblDurum.Text=”Veritabanı modülü yükleniyor.”;
}
else if(suAnkiDeger>70 && suAnkiDeger<=95) //71-95 arasında
{
lblDurum.Text = “Bellek optimizasyonu yapılıyor.”;
}
else if
arasında
(suAnkiDeger
>
95
&&
suAnkiDeger
<
100)
//96-100
{
lblDurum.Text
burakılıyor.”;
=
“Lazer
kalkanları
devre
dışı
}
else
{
//geriye sadece tek ihtimal kalıyor. O da 100.
//100’ü aşamaz çünkü progress bar’ın maximum değeri 100.
//PerformStep() metodu sayesinde artış 100’ü aşsa bile hata
vermeden
//değeri otomatik olarak 100’e taşınır.
//Yükleme bitti yazısı
lblDurum.Text = “Yükleme başarı ile tamamlanmıştır.”;
//timer durdurulur
Operatörler ve Karar Yapıları
tmrYukleyici.Stop();
//artık kullanıcı devam düğmesine basabilir
btnDevam.Enabled = true;
}
}
5. btnDevam kontrolüne çift tıklayarak kod penceresinde formu kapatan kodu yazın.
private void btnDevam_Click(object sender, EventArgs e)
{
//ve form kapatılır
this.Close();
}
Lab 7.3 Şans Oyunu
Bu örneğimizde ekrana rastgele gelen 3 numaraya göre oynanan bir şans oyunu uygulaması
yapacağız.
1. Yeni bir Windows projesi açın ve ismini “SansOyunu” olarak değiştirin. Uygulamanız ekran
görüntüsü Şekil 7.3’teki gibi olacaktır.
Şekil 7.3
2. Formunuza Tablo 7.3’teki kontrolleri ekleyin.
Tablo 7.3
Name
Text
Label
lblSayi1
0
Label
lblSayi2
0
Label
lblSayi3
0
Label
lblSonuc
label1
Button
btnBasla
Start
109
110
Bölüm 7
3. Form1’in Load olayına çift tıklayarak kod penceresine geçin ve gerekli kodları yazın.
private void Form1_Load(object sender, EventArgs e)
{
lblSonuc.Text = “Puanınız : “ + puan.ToString();
}
4. btnBasla’ya çift tıklayarak kod penceresine geçin ve btnBasla’nın Click olayına gerekli kodları
yazın.
int puan=30;
private void btnBasla_Click(object sender, EventArgs e)
{
//Rastgele sayı üretebilmek için kullanacağınız Random türünden
bir nesne tanımlayın.
Random rnd = new Random();
//Label kontrollerine rastgele sayilar atayınız.
lblSayi1.Text = rnd.Next(1, 11).ToString();
lblSayi2.Text = rnd.Next(1, 11).ToString();
lblSayi3.Text = rnd.Next(1, 11).ToString();
//Label kontrollerine atanan rastgele sayiları kontrol edin.
//lblSayi1, lblSayi2 ve lblSayi3’ün herbirinin Text özelliği “7”
ise puanı 100 arttırın.
if (lblSayi1.Text == “7” && lblSayi2.Text == “7” && lblSayi3.Text
== “7”)
{
puan += 100;
}
//lblSayi1
arttırın.
ve
lblSayi2’
nin
Text
özelliği
“7”
ise
puanı
10
puanı
10
else if (lblSayi1.Text == “7” && lblSayi2.Text == “7” )
{
puan
+= 10;
}
//lblSayi2
arttırın.
ve
lblSayi3’
nin
Text
özelliği
“7”
ise
else if (lblSayi2.Text == “7” && lblSayi3.Text == “7”)
{
puan += 50;
}
//lblSayi3’ün text özelliği “7” ise puanı 5 arttırın.
else if (lblSayi3.Text == “7”)
{
}
puan += 5;
Operatörler ve Karar Yapıları
//puanı 3 azaltın.
else
{
puan -= 3;
}
//puanı Yazdırın.
lblSonuc.Text=”Puanınız : “ + puan.ToString();
//Eğer puan<=0 ise kullanıcıya yeniden oynayıp oynamak istemediğini
sorun.
if (puan<=0)
{
if (MessageBox.Show(“Oyun bitti. Tekrar oynamak ister misiniz?”,
this.Text,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1)==DialogResult.Yes)
{
//Tekrar oynamak isterse puan değişkenini ve
Label kontrollerini programın başlangıcındaki hale getirin.
puan = 30;
lblSayi1.Text = “0”;
lblSayi2.Text = “0”;
lblSayi3.Text = “0”;
ToString();
lblSonuc.Text
}
else
{
=
“Puanınız
:
“
+
puan.
//Tekrar oynamak istemezse uygulamayı kapatın.
this.Close();
}
}
}
Ödevler
1. Açılırken saydamlıktan donukluğa, kapanırken donukluktan saydamlığa geçebilen bir form
hazırlayın. Bunun için formun Opacity özelliğini kullanabilirsiniz.
2. Msn Messenger uygulamasında olduğu gibi Button’a tıklandığında formu titreten uygulamayı
hazırlayın.
111
8
Döngüler
8 Döngüler
•
for Döngüsü
•
while Döngüsü
•
do while Döngüsü
•
foreach Döngüsü
•
Lab 8.1 Tarih Doğrulama
•
Lab 8.2 Gazeteler
•
Lab 8.3 Kelime Arama
•
Ödevler
Döngüler
Döngüler bir programlama dili için en çok kullanılan ifadelerden biridir. Ardı ardına ya da sıralı bir
iş yaptıracağımız zaman bunu döngüler yardımıyla yaparız. C# dilinde 4 adet döngü çeşidi vardır.
Bunlar for, while, do while ve foreach döngüleridir.
for Döngüsü
for döngüsü başlangıç değerinden itibaren belirtilen koşul sağlanana kadar içine yazıldığı kod
parçasını ardı ardına çalıştırır. Genel yazım şekli şöyledir;
for ( başlangıç;koşul;artım)
{
yapılacak işler;
}
başlangıç, döngü kontrol değişkeni olarak da ifade edilebilir. Döngü içerisinde bir sayaç görevini
görür.
koşul, döngünün ne kadar çalışacağını denetleyen mekanizmadır. Koşul sağlanıyorken döngü
çalışmaya devam eder. Koşul sağlanmadığında ise döngü durur. Koşulda genellikle başlangıç
değerinin durumu denetlenir.
artım, başlangıç değerinin döngünün her adımda artma yada azaltma miktarını belirler. Eğer başlangıç değeri hiç değişmez ise sonsuz döngü oluşur.
Şimdi 1’den 100’e kadar olan sayıların toplamını bulan bir uygulama geliştirelim:
int toplam = 0;
for (byte i = 1; i <= 100; i++)
{
toplam += i;
}
MessageBox.Show(toplam.ToString());
Kodu çalıştırdığınızda sonuç olarak 5050 alacaksınız.
başlangıç, byte i = 1; for döngüsünde döngünün hangi adımda olduğu i değişkeninin durumu ile
ifade edilir.
koşul, i <= 100; koşulun görevi döngünün devam edip etmeyeceğine karar vermektir. Her adımda
koşul kontrol edilir. Doğru ( true ) verdikçe döngü devam eder. Buradaki örnekte i değişkeni 100
den küçük ve eşit iken döngü çalışmaya devam edecektir.
artım, i++; burada döngünün her adımında i’nin değeri 1 arttırılır.
Bu bilgiler ışığında şimdi de 1’den 100’e kadar çift sayıların toplamını bulalım.
int toplam = 0;
for (byte i = 0; i <= 100; i += 2)
{
116
Bölüm 8
toplam += i;
}
MessageBox.Show(toplam.ToString());
Sonuç: 2550
Gördüğünüz gibi sadece artım kısmını değiştirdik. Böylelikle döngümüz ilk örnekteki gibi 100 kere
değil 50 kere dönmüş oldu.
Şimdiye kadar yaptığımız örneklerde başlangıç değeri artarak devam ediyordu. Bazı durumlarda
başlangıç değerinin azalarak devam etmesini isteyebiliriz. Örneğin bir işe başvuru formunda sene
bilgilerini bir ComBox’a teker teker elle girdirmek yerine bunu bir for döngüsü yardımıyla rahatlıkla
yapabilir. En yakın senenin en üstte olmasını istenirse bu başlangıç değerini 2008’den 1908’e
doğru azalarak gitmesi gerekir:
for(short i = 2008; i >= 1908;i -=1)
{
cmbSene.Items.Add(i);
}
Kullanıcıdan aldığımız bir sayının asal olup olmadığını denetleyen bir program yazalım. Bildiğiniz
gibi asal sayılar 1’e ve kendisinden başka sayılara tam bölünmeyen sayılardır. Bir sayının asal
olup olmadığını, onu 1 ve kendisi hariç tüm sayılara bölümünden kalanı denetleyerek bulabiliriz.
Bu örnekte for döngüsü yanında mod ( % ) operatöründen ve program atlama ifadesi break‘ten
yararlanacağız. Zira bir sayının birden fazla tam böleni olabilir ve bizim bulduğumuz ilk tam bölenden sonra döngünün çalışmasına gerek kalmayabilir. Bu şekilde büyük bir sayı girildiğinde
döngünün uzun süre çalışmasını engelleyerek performans artışı sağlamış oluruz.
1int sayi = Convert.ToInt32(txtSayi.Text);
2bool asalMi = true;
3int tamBolen = 0;
4
5for (int i = 2; i < sayi; i++)
6{
7
int kalan = sayi % i;
8
if (kalan == 0)
9
{
10
tamBolen = i;
11
asalMi = false;
12
break;
13
14
}
}
15
16
17
if (asalMi == true)
MessageBox.Show(sayi.ToString() + “ asaldır.”);
Döngüler
18
else
19
MessageBox.Show(sayi.ToString() + “ asal değildir. Tam
böleni: ” + tamBolen.ToString());
1 nolu satırda kullanıcının girdiği sayıyı alıyoruz.
2 nolu satırda asalMi değişkenine true değerini atıyoruz. Bu, kullanıcının girdiği tüm sayıları önceden asal kabul ettiğimiz anlamına gelir. For döngüsü içerisinde asal sayı kuralını bozan durum
gerçekleştirirse asalMi değişkeni false olmaktadır.
3 nolu satırda tamBolen değişkeni ile kullanıcının girdiği sayının en küçük tam bölenini bilgi mahiyetinde saklayacağız.
5 nolu satırda gördüğünüz gibi başlangıç noktamız 2 ve koşulumuz küçük eşittir <= değilde sadece küçüktür < . Bildiğiniz gibi asal sayı kuralına göre sayı 1 ve kendisinden başka böleni olmayan
sayı idi. Başlangıç noktasını 2 vererek 1 sayısını, küçük eşittir yerine küçük yazarak sayının kendisini bölme işleminden saf dışı tutuyoruz.
7 nolu satırda sayi’nın i‘ye bölümünden kalanı mod kullanarak hesaplanıyor.
8 nolu satırda kalan kontrol ediliyor. Eğer kalan sıfırda ise 10,11 ve 12 numaralı satırlar çalıştırılacak.
10 nolu satırda kullanıcıya bilgi mahiyetinde sunulacak tamBolen değeri atanıyor.
11 nolu satırda daha sonra 16 nolu satırda kontrol edeceğimiz asalMi değişkeninin değerine true
atanıyor.
12 nolu satır performans için kilit noktadır. Burada break ifadesini kullanmasak da uygulamamız
yine doğru sonuç üretecektir. 1000000 gibi büyük bir sayı girildiğinde döngümüz 2 den 999999
a kadar çalışacaktır. Ancak döngümüz henüz ilk adımda iken yani i değişkeni 2 iken tamBolen
bulunursa diğer sayıların kontrol edilmesine gerek yoktur. Bu yüzden break ifadesi yardımıyla
döngüden çıkılır ve geri kalan sayılar gereksiz yere kontrol edilmez.
16 nolu satırda asalMi değişkeninin durumu kontrol edilerek kullanıcıya uygulamanın sonu hakkında bilgi verilir.
Continue
Bir döngünün sonraki tekrara erken geçişini sağlamak için continue ifadesi kullanılır. Bir bakıma
break ifadesinin tamamlayıcısıdır. Daha önceki konuda örneğini yaptığımız 1 ile 100 arasındaki
çift sayıların toplamını bulan uygulamayı biraz değiştirerek continue ifadesini kullanarak tekrar
yapalım.
1for (int i = 0; i <= 100; i ++)
2{
3
İf((i%2) != 0)
4
5
continue;
listBox1.Items.Add(i);
6}
Örneğimizi incelediğimizde, 3 nolu satırda mod operatörü ile sayının çift olup olmadığı kontrol
ediliyor. Eğer sayı çift değilse 4 nolu satırdaki continue ifadesi ile o satırdan itibaren kod icra
edilmeyip döngüye tekrar zorlanıyor yani kod 1 nolu satıra dallanıyor. Böylelikle sadece çift olan
sayılar için 5 nolu kod satırı çalışıyor ve çift sayılar ListBox kontrolüne ekleniyor.
117
118
Bölüm 8
while Döngüsü
C#’taki döngülerden bir diğeri ise while döngüsüdür. while döngüsü bir koşul sağlanıyorken dönmeye devam eder. Koşul yanlış ( false ) sonucunu verdiği zaman ise sonlandırılır. Genel yazım
şekli şöyledir.
while( koşul )
{
yapılacak işler;
}
1’den 100’e sayıların toplamını bulan bir while döngüsü yazalım:
int toplam = 0;
int sayac = 1;
while( sayac <= 100 )
{
toplam+= sayac;
sayac++;
}
Sonuçta toplam değişkeni 5050 verecektir. Örnekte görüldüğü gibi sayac döngü içerisinde her
adımda 1 arttırılıyor. Böylelikle sayac 101 olduğunda döngü artık sonlandırılıyor. Burada koşulumuz sayac değişkeninin değerinin 100 den küçük veya eşit olmasıdır. Koşul doğru (true) sonucunu verdikçe döngü işletiliyor, koşulun yanlış (false) değerini vermesi halinde ise döngü sonlandırılıyor.
while döngüsü bu şekilde sırayla yapılacak işlemlerden ziyade problem çözümünde bir koşulun
durumun sınamak için kullanılır.
Kullanıcı tarafından girilen bir sayının kaç basamaklı olduğunu bulmak while döngüsü için daha
açıklayıcı bir örnek olacaktır.
1int sayi = Convert.ToInt32(txtSayi.Text);
2int basamak = 0;
3
4while (sayi > 0)
5{
6
basamak++;
7
sayi /=
10;
8}
9
10
MessageBox.Show(“Girdiğiniz sayı “ + basamak.ToString() +
“basamaklıdır.”);
Örnekte görüldüğü gibi 4 nolu satırda koşulumuz sayi değişkeninin sıfırdan büyük olmasıdır.
6 nolu satırda basamak değişkeni 1 arttırılır.
Döngüler
7 nolu satırda ise sayı‘nın değeri 10’a bölüp kendisine eşitlenir. (Bir sayıyı sonuç 0 oluncaya kadar kaç kere 10’a bölerseniz, o sayının basamak sayısını bulursunuz.)
Böylelikle sayı basamak sayısı kadar 10’a bölünecektir.
do while Döngüsü
C#’taki bir diğer döngü de do while döngüsüdür. for ve while döngülerinden farklı olarak koşul
döngünün sonunda kontrol edilir. Bu da do while döngüsünün en az bir kere çalıştırılacağı anlamına gelir.
Genel yazım şekli şöyledir:
do
{
yapılacak işler;
} while ( koşul );
1’den 100’e kadar olan sayıların toplamını do while döngüsü yardımıyla bulalım.
int toplam = 0;
int sayac = 0;
do
{
sayac++;
toplam += sayac;
} while (sayac < 100);
MessageBox.Show(“toplam “ + toplam.ToString() + “,sayac “ + sayac.
ToString());
Hatırlarsanız benzer bir örneği while döngüsü ile yaptık, ancak while döngüsündeki koşulumuzu
bir hatırlayalım:
while( sayac <= 100 )
{
....
}
Görüldüğü gibi sayac 100’den küçük ve eşit.
do while’daki koşulumuza tekrar bakalım:
do
{
....
} while ( sayac < 100 );
Görüldüğü gibi do while döngüsünde koşulumuz 100’den küçük olması aranıyor ancak sayac 100
iken bile bir kez çalışıyor ve koşul aşağıda olduğu için sayac 100 iken döngüden çıkıyor.
119
120
Bölüm 8
foreach D öngüsü
C#’ta bir diğer döngü de foreach döngüsüdür. foreach, dizi (Array) ve koleksiyon ( collection )
tabanlı nesnelerin elemanları üzerinden ilerleyen bir döngüdür.
Genel kullanım şekli şöyledir;
foreach(tip değişken in koleksiyon)
{
yapılacak işler;
}
tip: buradaki tip koleksiyonun veri tipi ile aynı veya uyumlu olmak zorundadır.
foreach döngüsü bir sonraki bölüm olan Diziler anlatılırken işlenecektir.
değişken: foreach döngüsü içerisinde koleksiyonda bulunan sıradaki
elemanı temsil eder.
koleksiyon: ArrayList ya da dizi gibi aynı tip verileri barındıran koleksiyon.
Lab 8.1 Tarih Doğrulama
Bu örnekte amaç, form yüklendiği anda gün, ay ve yıl bilgisini tutan 3 adet ComboBox kontrolünü
for döngüleri yardımı ile doldurmaktır.
Formunuzun görüntüsü Şekil 8.1’deki gibi olmalıdır.
Şekil 8.1
1. Yeni bir Windows projesi açın ve ismini “TarihDogrulama” olarak değiştirin.
2. Formunuza Tablo 8.1’deki kontrolleri ekleyin.
Tablo 8-1
Name
Text
Label
lblGun
Gün:
Label
lblAy
Ay:
Label
lblYil
Yil:
ComboBox
cmbGun
ComboBox
cmbAy
ComboBox
cmbYil
Button
btnKontrol
Geçerli Tarih mi?
3. Formun üzerinde boş bir yere çift tıklayarak kod penceresine geçin ve Load olayına gerekli
kodları yazın.
Döngüler
private void Form1_Load(object sender, EventArgs e)
{
//cmbGun ve cmbAy adlı Combobox’ları uygun sayılarla doldurabilmek
için int tipinde bir değişken tanımlayın.
int counter = 1;
for (int i = 1920; i <= 2008; i++)
{
//cmbYil adlı ComboBox’ a 1920 den 2008’e kadar olan sayıları
ekleyin.
cmbYil.Items.Add(i);
if (counter < 13)
{
ekleyin.
//cmbAy adlı ComboBox’ a 1’ den 13’e kadar olan sayıları
cmbAy.Items.Add(counter);
}
if (counter < 32)
{
//cmbGun adlı ComboBox’ a 1’ den 32’ye kadar olan
sayıları ekleyin.
cmbGun.Items.Add(counter);
}
//Her döngüde counter adlı değişkeni bir arttırın.
counter++;
}
}
4. İkinci aşamada kullanıcı btnKontrol adlı Button’a tıkladığı anda girdiği tarihin geçerli bir tarih
olup olmadığını kontrol edeceğiz. btnKontrol‘a çift tıklayarak kod penceresine geçin ve Click
olayına gerekli kodları yazın.
private void btnKontrol_Click(object sender, EventArgs e)
{
try
{
//Kullanıcının ComboBox kontrollerine girdiği değerleri
DateTime türünden dt isimli bir değişkene dönüştürmeye çalışın.
Eğer çevirme işlemi başarılı olursa “Geçerli bir tarih seçtiniz”
uyarısı verin.
DateTime dt = Convert.ToDateTime(cmbGun.Text + “.” + cmbAy.Text +
“.” + cmbYil.Text);
MessageBox.Show(“Geçerli bir tarih seçtiniz”);
}
catch (Exception ex)
{
//Çevirme işlemi
seçtiniz” uyarısı verin.
başarılı
olmazsa
“Geçersiz
bir
tarih
121
122
Bölüm 8
MessageBox.Show(“Geçersiz bir tarih seçtiniz”);
}
}
5. Projenizi çalıştırın ve geçerli bir tarih girip Button‘a basın. Aynı işlemi 31.02.1996 tarihi için
yeniden deneyiniz.
Lab 8.2 Gazeteler
Bu örneğimizde foreach döngüsü ile bir kontrolden diğerine öğelerin nasıl aktarıldığına bakacağız.
Formunuzun görüntüsü Şekil 8.2’deki gibi olmalıdır.
Şekil 8.2
1. Yeni bir Windows projesi açın ve ismini “Gazete” olarak değiştirin.
2. Tablo 8.2’deki kontrolleri formunuza ekleyin.
Tablo 8.2
Name
CheckedListBox
clGazeteler
ListBox
lbOkunanlar
Button
btnSec
Text
>>
clGazeteler adlı CheckedListBox’a Milliyet, Hürriyet, Sabah, Radikal, Posta, Fotomaç, Fanatik,
Takvim, Tercüman öğelerini ekleyin.
clGazeteler adlı kontrolde Ctrl tuşuyla biden fazla öğe seçebilmek için kontrolün Properties paneline girerek SelectionMode özelliğini MultiSimple olarak değiştirin.
3. Amacımız kullanıcının clGazeteler adlı CheckedListBox’tan seçtiği gazeteleri btnSec adlı
düğmeye tıkladığında lbOkunanlar adlı Listbox kontrolüne eklemektir.
4. Şimdi btnSec isimli Button’un Click olayına aşağıdaki kodları yazın.
private void btnSec_Click(object sender, EventArgs e)
{
//Eğer Button’ a tıklandığında hiç bir gazete seçili değilse
kullanıcıya uyarı veriyoruz.
if (clGazeteler.SelectedItems.Count == 0)
else
{
MessageBox.Show(“Hiç bir Gazete Seçilmedi”);
Döngüler
//Seçili
ekliyoruz.
öğeleri
lbOkunanlar
adlı
ListBox
kontrolüne
lbOkunanlar.Items.Clear();
foreach (string gazete in clGazeteler.CheckedItems)
{
lbOkunanlar.Items.Add(gazete);
}
}
}
5. Foreach döngüsünde, clGazeteler.CheckedItems adlı koleksiyonda clGazeteler adlı kontrolde seçili olan tüm öğeler bulunur. Bu koleksiyonda bulunan bütün string tipindeki öğeler lbOkunanlar adlı kontrole ekleniyor.
Lab 8.3 Kelime Arama
Bu örneğimizde kullanıcının gireceği bir ifadenin aranan metin içerisinde kaç kere geçtiğini veren
bir uygulama oluşturacağız.
Formunuzun görüntüsü Şekil 8.3’teki gibi olmalıdır.
Şekil 8.3
1. Yeni bir Windows projesi oluşturun ve ismini “KelimeArama” olarak değiştirin.
2. Formunuza Tablo 8.3’teki kontrolleri ekleyin.
Tablo 8.3
Name
Text
TextBox
txtKelime
TextBox
txtMetin
Button
btnAra
Ara
Label
lblMetin
Arama Yapılacak Metin
Label
lblKelime
Aranacak Kelime
Ayrıca lblMetin’in kontrolünün MultiLine özelliğini true olarak değiştirin.
3. btnAra’ya çift tıklayarak kod penceresine geçin ve kullanıcının txtMetin kontrolü ile girdiği
değeri metin içinde arayan kodları yazın.
private void btnAra_Click(object sender, EventArgs e)
{
//aradığımız ifadenin metin içerisinde kaç kere geçtiğini
123
124
Bölüm 8
//tutacak olan Sayi adlı integer tipinden değişken tanımlayın.
int Sayi = 0;
//kullanıcının txtMetin’e girmiş olduğu değeri Metin değişkenine
atadık.
string Metin = txtMetin.Text;
//kullanıcının txtKelime’ye girmiş olduğu değeri Kelime değişkenine
atadık
string Kelime = txtKelime.Text;
//Konum adında integer tipinden değişkenini tanımlayıp Kelime’nin,
Metin içerisindeki konumunu bu değişkene atayın.
int Konum = Metin.IndexOf(Kelime);
//Kelime Metin içinde tekrar ettiği sürece devam edecek while
döngüsü tanımlayın.
while (Konum!=-1)
{
//Konum değişkenini Kelime’nin Metin içerisinde bir sonra
geçtiği konuma eşitleyin.
Konum = Metin.IndexOf(Kelime, Konum + 1);
//Sayi değişkenini bir arttırın.
Sayi++;
}
//Kullanıcıya
gösterin
Kelime’nin
Metin
MessageBox.Show(“Girdiğiniz ifade,
ToString() + “ kere geçiyor”);
içinde
metin
kaç
kere
içrisinde
geçtiğini
“+
Sayi.
}
4. IndexOf metodunun tek parametreli kullanımında metot Metin içerisinde Kelime’nin ilk geçtiği
yerdeki Kelime’nin ilk harfinin index numarasını geri döner. Örneğin “Bilge Adam Bilgi Teknolojileri Akademisi” metninde “Bilgi” kelimesini IndexOf methodunu kullanarak ararsak dönen
sonuç 11 olacaktır. Herhangi bir metin içindeki karakterlerin index numarası 0‘ dan başlar.
IndexOf metodunun iki parametre alan kullanımında ise ilk parametre aranacak kelimeyi, ikinci parametre ise arama yapmaya başlanacak karakterin index numarasını ifade eder.
IndexOf metodu belirtilen kelime’yi aranan metin içinde bulamazsa geriye -1 döner.
5. txtMetin ve txtKelime kontrollerine veriler girerek uygulamanızı test edin.
Ödevler
1. For döngüsü kullanarak çarpım tablosu hazırlayın. Sonuçları ListBox kontrolünde gösterin.
2. Cep telefonlarının PIN giriş ekranına benzer bir form tasarlayın. Kullanıcı 3 defa PIN numarasını hatalı girerse “Uygulamanız bloke olmuştur” mesajı verin ve Button kontrolünü görünmez
yapın. Kullanıcı 3 deneme hakkı içinde doğru olarak PIN numarasını girerse “Hoş geldiniz”
mesajı verip formu kapatın.
9
Diziler
9 Diziler
•
Bazı Dizi Özellikleri ve Metotları
•
Lab 9.1 Sayısal Loto
•
Ödevler
Diziler
Değişkenleri öğrenirken gördük ki her değişkene sadece bir değer atayabiliriz. Bazı durumlarda
aynı tipteki değişkenleri bir arada tutma ihtiyacı duyabiliriz. C# bize aynı tipteki değişkenleri tek bir
adla saklayabileceğimiz dizileri (Array) sunmaktadır.
Bir dizi tanımlamanın genel yazım şekli şöyledir:
tip[] diziismi = new tip[elemansayisi];
tip: dizide tutulacak verilerin tipidir.
diziismi: dizinin ismi.
boyut: dizide tutulacak eleman sayısı. 5 elemanlı tam sayılar dizisi tanımlamak istersek:
int[] sayilar = new int[5];
Dizilere veri atamak istersek:
diziismi [indeks] = değer;
indeks: dizideki verilere verilen sıra numarası. C#’ta indeksler sıfırdan başlar.
Dizilerden değer okumak için ise:
değişken
= diziismi [indeks];
Örneğin 10 kişilik bir sınıftaki öğrencilerin notlarını her öğrenci için bir not değişkeni oluşturup
tutmak yerine notlar dizisi içerisinde tutabiliriz.
byte[] notlar = new byte[10];
Bu şekilde notlar isminde 10 tane byte değeri tutabilecek bir dizi tanımladık. Şimdi notları diziye
aktaralım.
notlar[0] = 50;
notlar[1] = 60;
notlar[2] = 90;
notlar[3] = 40;
notlar[4] = 60;
notlar[5] = 30;
notlar[6] = 40;
notlar[7] = 70;
notlar[8] = 60;
notlar[9] = 100;
128
Bölüm 9
Şekil 9.1
notlar dizi değişkenindeki 5 numaralı Ahmet’in notunu okuyalım:
byte ahmetinNotu;
ahmetinNotu = notlar[5];
Bütün değerlere tek tek erişmek, eğer bu değerler bir kaç tane ise pek sorun olmayacaktır. Fakat
tümünü listelemek istersek bu yöntem pek uygun olmayacaktır. Bunun için foreach döngüsü kullanılabilir. Şimdi foreach döngüsü ile tüm elemanları ListBox’ ta gösterelim:
foreach(byte not in notlar)
{
listbox1.Items.Add(not);
}
foreach döngüsü bir dizi üzerinde işlem
yaparken, dizi elemanları sadece okunur
durumdadır, değerleri değiştirilemez.
Bir diziyi ilk değerleri vererek de tanımlayabiliriz.
tip[] diziismi = { değer1, değer2, değer3.... değerN};
Bu şekilde süslü parantezler içerisinde dizinin bütün değerleri girilir ve dizinin boyutu da N olur.
byte[] notlar = { 50, 60, 90, 40, 60, 30, 40, 70, 60, 100 };
Şimdi dizide bulunan notların aritmetik ortalamasını alalım. Bunun için dizideki her elemanı genelToplam isimli bir değişkene aktaracağız. Sonuçta genelToplam’ı dizi mevcuduna bölüp aritmetik
ortalamayı elde edeceğiz.
byte[] notlar = { 50, 60, 90, 40, 60, 30, 40, 70, 60, 100 };
int genelToplam = 0;
int ortalama;
foreach (byte not in notlar)
{
genelToplam += not;
}
ortalama = genelToplam / notlar.Length;
MessageBox.Show(“Aritmetik Ortalama :”+ortalama.ToString());
Şimdi Bölüm 4’te Veri Tipleri konusunda string hakkında öğrendiğimiz bir cümleyi hatırlayalım:
String bir char dizisidir.
Diziler
Dolayısıyla string bir ifadeyi foreach ile çevirip harflerine teker teker ulaşalım. Örnek olarak kullanıcının girdiği bir ifadeyi tersten yazdıralım.
string kelime = txtKelime.Text;
string tersKelime = “”;
foreach (char harf in kelime)
{
tersKelime = harf.ToString() + tersKelime;
}
MessageBox.Show(tersKelime);
Bazı Dizi Özellikleri ve Metotları
Diziler, .NET Framework içinde tanımlı Array sınıfı temsil eder. Tüm diziler Array sınıfında tanımlı
özellikleri ve metotları kullanırlar. Bu metotlardan ve özelliklerden en sık kullanılanları:
Length
Dizinin saklayabileceği toplam eleman sayısını veren özelliktir.
string[] isimler = new string[20];
MessageBox.Show(isimler.Length.ToString());
//Sonuç = 20
Clear
Parametre olarak verilen dizinin, belirtilen indeks aralığındaki tüm değerlerini temizler. Temizleme
işleminde atanan değer, dizi elemanlarının tiplerine göre değişir. Örneğin int tipinde tanımlı bir
dizinin elemanları temizlenirse 0 değerini alacaktır. Buna karşın String tipindeki elemanlar “” (boş
yazı) değerini alır.
int[] dizi = {50, 63, 64, 75};
//1 nolu elemandan itibaren 2 eleman siler
Array.Clear(dizi, 1, 2);
MessageBox.Show(dizi[2].ToString());
//Sonuç = 0
// Dizideki tüm elemanları siler
Array.Clear(dizi, 0, dizi.Length);
Reverse
Parametre olarak verilen dizinin eleman sırasını tersine çevirir. Dizinin tüm elemanlarının veya
belirli indeks aralığındaki elemanlarının sırası tersine çevrilebilir.
string [] harfler = {“A”, “B”, “C”};
Array.Reverse(harfler);
MessageBox.Show(harfler[2]);
// Sonuç = A
129
130
Bölüm 9
Sort
Parametre olarak verilen dizinin elemanlarını küçükten büyüğe sıralar. Eğer dizi numerik ise rakamların büyüklüğüne göre, yazı tiplerinde ise baş harflerine göre sıralanır. Reverse’ün tersidir.
string [] harfler = {“C”, “B”, “A”};
Array.Sort(harfler);
MessageBox.Show(harfler[2]);
// Sonuç = C
IndexOf
İlk parametrede verilen dizide, ikinci parametrede verilen değeri arar. Aranan değer dizide bulunursa bulunan elemanın indeks değeri, bulunamazsa -1 döndürür.
decimal[] sonuclar = {78, 99, 100, 12.2};
decimal maksimum = 100;
MessageBox.Show(Array.IndexOf(sonuclar,maksimum).ToString());
// Result= 2
Lab 9.1 Sayısal Loto
1. Yeni bir Windows projesi açın ve ismini “SayisalLoto” olarak değiştirin.
2. Formunuza Tablo 9.1’deki kontrolleri ekleyin.
Tablo 9.1
Name
Text
Label
lbl1
1.Sayi
Label
lbl2
2.Sayi
Label
lbl3
3.Sayi
Label
lbl4
4.Sayi
Label
lbl5
5.sayi
Label
lbl6
6.sayi
Button
btnBaslat
Başlat
3. Formunuzun görüntüsü Şekil 9.2’deki gibi olmalıdır.
Şekil 9.2
4. Amacımız btnBaslat adlı Button’a tıklandığında 1-49 arası 6 farklı sayıyı Label kontrolleri
aracılığı ile form üzerinde görüntülemektir. Şimdi btnBaslat’a çift tıklayarak kod penceresine
geçin ve gerekli kodları olayına yazın:
private void btnBaslat_Click(object sender, EventArgs e)
{
Diziler
// Boyutu 6 olan int array’ i tanımlayın.
int[] sayilar = new int[6];
//Random tipinden bir değişken oluşturun.
Random r = new Random();
//int tipinden bir değişken oluşturun ve ilk değerini 0 olarak
atayın.
int counter = 0;
//Bir while döngüsü tanımlayın ve koşul olarak counter<6 olarak
belirtin.
while (counter<6)
{
//int tipinden bir değişken oluşturun ve değerini Random
değişkenin 1 ile 49 arası ürettiği tamsayıya eşitleyin.
int sayi = r.Next(1, 50);
//Sayi adlı değişkenin değerinin sayilar adlı dizide var
olup olmadığını Array.IndexOf metodu ile kontrol edin.
if (Array.IndexOf(sayilar, sayi) == -1)
{
//Eğer sayi adlı değişkenin değeri sayilar dizisinde
yoksa dizinin counter numaralı öğesine sayi değerini eşitleyin.
sayilar[counter] = sayi;
//counter’ı 1 arttırın.
counter++;
}
}
//Sayilar dizisini küçükten büyüğe düzenleyin.
Array.Sort(sayilar);
//Label kontrollerine
yazdırın.
sayilar
dizisindeki
değerleri
sıra
ile
lb1.Text = sayilar[0].ToString();
lbl2.Text = sayilar[1].ToString();
lbl3.Text = sayilar[2].ToString();
lbl4.Text = sayilar[3].ToString();
lb5.Text = sayilar[4].ToString();
lb6.Text = sayilar[5].ToString();
}
5. Uygulamada kullandığımız IndexOf metodu ilk parametre olarak aldığı dizi içinde ikinci parametre olarak aldığı değeri arar ve eğer bu değer varsa değerin bulunduğu indeksi yoksa -1’ i
geri döndürür.
6. Uygulamayı çalıştırın ve Label kontrollerinde görünen sayıların birbirinden farklı ve sıralanmış
bir biçimde olduğunu gözlemleyin.
131
132
Bölüm 9
Ödevler
1. Kullanıcının girdiği TC.Kimlik numarasının geçerli olup olmadığını kontrol eden bir uygulama
hazırlayın. Geçerli bir TC.Kimlik numarasında ilk 10 hanenin toplamının birler basamağındaki
rakam kimlik numarasının son hanesindeki rakama eşit olmalıdır.
2. Kullanıcının TextBox kontrolüne girdiği şifreyi belli kriterleri kullanarak zayıf, orta veya kuvvetli
şifre olarak tanımlayan bir Windows uygulaması geliştirin.
Kriterler

Girilen şifre 6 karakterden az ise zayıf şifredir.

Girilen karakter sayısı 6 ve daha fazla ise ve,

Sadece sayılardan veya sadece harflerden oluşuyorsa zayıf şifredir.

Rakam ve harflerden oluşuyorsa orta kuvvetli şifredir.

Rakam,harf ve alfanumerik karakterler(*,?,+,#,&,!,é) içeriyorsa kuvvetli şifredir.
10
Metotlar
10 Metotlar
•
Metot Nedir?
•
Metotları Kullanmak
•
Parametreler
•
Kendi Metodumuzu Yazmak
•
Metot Overload
•
Lab 10.1 Hesap Makinesi
•
Lab 10.2 Hepsini Temizle
•
Lab 10.3 IsNumeric
•
Ödevler
Metotlar
Bu bölümde birçok programlama dilinin olduğu gibi C#’ın da temel kavramlarından olan metotları
detayları ile inceleyeceğiz. Metotların tanımları ve kullanımı, parametrelerin özellikleri örneklerle
işlenecektir.
Bu bölüm tamamlandıktan sonra:

Metot kavramını öğrenecek,

Problem çözmede metotların yerini kavrayacak,

Parametrelerin tiplerini ve kullanım yerlerini öğreneceksiniz.
Metot Nedir?
Program yazarken belli bir işi yapan kod bloğunu bir kaç kez kullanmak gerekebilir. Bunun için
aynı kod bloğunu tekrar yazmak yerine bunu bir metot olarak hazırlarız ve ihtiyaç duyduğumuz
yerde metot ismi ile çağırarak çalıştırabiliriz. Bu bize daha az kod yazma imkânı sağlayıp zaman
kazandırdığı gibi, olası değişikliklerde de daha az hata yapmamızı sağlar.
Bir muhasebe programı yazdığımızı ve maaş hesaplamalarını programımızın birçok yerinde kullandığımızı düşünelim. Maaş hesaplaması yapan kod bloğunu metot
olarak tanımlayıp ilgili yerlerde bu metodu çalıştırarak işimizi kolayca
halledebiliriz.
Metotlara örnek vermek gerekirse şu ana kadar kullanılan TextBox’ın
Focus metodu, ComboBox’ın Clear (Items.Clear) metodu, Random’ın
Next metodu verilebilir. Metotlar Şekil 10.1’de görüldüğü gibi Visual
Studio IntelliSense’de mor renkli kutucuklar olarak tanımlanırlar.
Şekil 10.1
Metotları Kullanmak
Bazı metotlar geriye değer döndürür, bazıları ise döndürmez. Geriye değer döndürmeden kasıt
şudur: Şu ana kadar birçok örnekte Random sınıfını kullandınız. Random sınıfının Next adlı bir
metodu vardır. Bu metot, çağırdığınızda size bir sonuç üretir ve siz onu programınızda uygun
yerlerde kullanırsınız. Başka bir örnek de MessageBox sınıfının Show metodudur. Show size DialogResult cinsinden bir değer döndürür ve siz onu yakalayıp işlemlerinizi yaparsınız. Bir metodun
geriye hangi tip değeri döndüreceği Visual Studio IntelliSense’te kolaylıkla görülebilir:
Şekil 10.2
Şekil 10.3
Görüldüğü gibi Şekil 10.2’deki metot DialogResult tipinden, Şekil 10.3’teki metot ise int tipinden
bir değer döner.
Geriye değer döndüren metotları kullanmak için genellikle şu yol izlenir:
MetodunDöneceğiTip degiskenAdi;
degiskenAdi=metot;
Bu yapı kullanılarak Şekil 10.3’teki metot, çağrılmak ve dönen değeri yakalanmak istenirse şu
şekilde bir kod yazılabilir:
136
Bölüm 10
1Random rastgele=new Random();
2int sayi;
3sayi = rastgele.Next(1,101);
4label1.Text=sayi.ToString();
1 nolu satırda daha önceki örneklerden de hatırlayacağınız bir rastgele sayı üretici oluşturuldu.
2 nolu satırda ise Next metodunun döndüğü veri tipine sahip bir değişken oluşturuldu.
3 nolu satırda ise 2 nolu satırdaki değişken yazılıp, eşittir işaretinin sağ tarafında metot yazıldı.
Böylelikle metottan dönen değer bu değişkene atandı.
4 nolu satırda ise değer, ekranda gösterildi.
Yazılıma yeni başlayanların çok sık yaptıkları
bir hata geriye değer dönen bir metodu kullanıp, onu bir değişkene eşitlememesidir.
Bazı metotlar ise geriye değer döndürmezler. Bunlara
void denir. Bir metodun geriye değer döndürmediği Şekil
10.4’teki gibi, Visual Studio IntelliSense’de rahatça görülebilir.
Şekil 10.4
void’leri kullanmak oldukça kolaydır. Tek yapılması gereken isminin yazılmasıdır. Örneğin bir
TextBox’ın içeriğini temizlemek için Clear metodunu çalıştırmaya ihtiyaç vardır.:
textBox1.Clear();
Görüldüğü üzere void’ler bir değişkene atanmadan direk çalıştırılırlar.
Parametreler
Parametreler, metotların istenilen işlemi yapabilmesi için kullanıcı tarafından değerleri verilmesi
gereken değişkenlerdir. Bir metotta istenilen parametrelerin sayısına ve bu parametrelerin veri
tiplerine o metodun imza’sı denir.
Örneğin Random sınıfının Next metodu geriye istenilen aralıkta bir rastgele sayı döndürmek için
en düşük değer ve en yüksek değer için int tipinde iki adet değer bekler.
Şekil 10.5
Bu değerleri 1 ve 101 olarak vermek için kod şu şekilde yazılabilir:
sayi = rastgele.Next(1,101);
Görüldüğü gibi bir metot birden fazla parametre alıyorsa bu değerler girilirken virgül işareti ile
ayrılır.
Başka bir örnek olarak System.Dignosistics.Process.Start metodu verebilir. Şekil 10.6’daki gibi bu
metoda IntelliSense ile bakıldığı zaman string veri tipinde bir değer beklediği görülür.
Metotlar
Şekil 10.6
Bu metot şu şekilde çalıştırılır:
System.Diagnostics.Process.Start(“calc”);
ya da
System.Diagnostics.Process.Start(textBox1.Text);
Kendi Metodumuzu Yazmak
Eğer bir metot parametre istemiyorsa onu
çağırmak için metot ismi yazıldıktan sonra
parantez açılır ve kapatılır. Temizle() gibi...
Bir metot şu şekilde tanımlanır:
tip metotismi( parametrelistesi )
{
yapılacak işler;
}
tip: Metodun geriye döndüreceği değerin tipidir. Ancak metot geriye değer döndürmüyorsa buraya void
yazılır.
metotismi: Metoda verilen isimdir. Metot yazıldıktan sonra bu isimle çağırılacaktır.
parametrelistesi: Metot içerisine gerekli hesaplamaların yapılması için dışarıdan verilebilecek değerlerdir.
Bir metot, Şekil 10.7’deki gibi geriye değer döndürme ve parametre alma durumuna göre dört farklı
şekilde tanımlanabilir.
Şekil 10.7
İlk olarak verilen bir sayının karesini alan yani o sayıyı kendisi ile çarpan bir metot yapalım. Metodun adı KareAl, geriye döndüreceği veri tipi int ve alacağı parametre veri tipi de int olsun.
int KareAl(int sayi)
{
int sonuc;
sonuc=sayi*sayi;
return sonuc;
}
Örnekte görüldüğü gibi önce fonksiyonun geriye döndüreceği veri tipi belirtilir. (int) Daha sonra
metoda isim verilir. (KareAl). Parantezler içerisinde metot içerisine gönderilecek parametrelerin
veri tipi ve ismi belirtilir. (int sayi)
Metot içerisinde gerekli işlemler yapıldıktan sonra geriye değer döndürebilmek için return ifadesini kullanılır. Eğer return ifadesi yazılmazsa veya her durumda çalışmayacak bir şekilde yazılırsa
(mesela bir if bloğu içerisine) uygulama hata verir ve derlenmez. return ifadesi metodun çalışmasını durdurur ve sağındaki değeri geriye döndürür.
137
138
Bölüm 10
Uygulama, return ifadesini gördükten sonra metodu çalıştırmayı bırakır. Bu yüzden return ifadesi kullanıldıktan sonraki yazılan kodlar çalışmayacaktır. Bu durum
size Visual Studio tarafından “Unreachable code detected” uyarısı olarak verilir.
Geriye değer döndürmeyen bir metot ise şu şekilde yazılabilir:
void Temizle()
{
textBox1.Clear();
textBox2.Clear();
comboBox1.Items.Clear();
}
İlk olarak metodun bir değer döndürmediğini belirtmek için void kelimesi kullanılır. Sonra metoda
isim verilir. Daha sonra parantezler içerisine parametreler yazılır. (Bu örnekte metodun parametreye ihtiyacı yoktur)
void’lerde, geri değer dönen metotlardan farklı olarak return ifadesi kullanmak zorunlu değildir.
Ancak istenilirse kullanılabilir. Return ifadesi void’lerde metottan çıkmak için kullanılır.
void Sil(bool eminMi)
{
İf(eminMi==false)
{
//eminMi parametresinin değeri false gelirse metodun //geri kalanı
çalışmaz.
return;
}
//silme işlemi yapan kodlar...
}
Metot tanımlarken dikkat etmeniz gereken bir diğer konu da, metotların sadece kendi işlerini yapacak şekilde tasarlamak olacaktır. Yani bir metoda hem toplama işlemi hem de sonucu TextBox’a
yazdırma görevi vermemek gerekir. Bu durum metodun kullanışlı olmasını engeller. Örneğin:
1 int topla(int sayi1, int sayi2)
2 {
3
int toplam = sayi1 + sayi2;
4
txtToplam.Text = toplam.ToString();
5
return toplam;
6 }
4 nolu satır metodu txtToplam adlı TextBox kontrolüne bağımlı hale getirdiğinden fonksiyonel
olma özelliğini kaybetmiştir.
Metot Overload
Methot Overload (metotları aşırı yükleme), bir metodun birden fazla, farklı imza ile tanımlanmasıdır. Daha farklı bir anlatımla aynı isimli metodun birden fazla farklı parametre imzası almasıdır.
Metotlar
Güncel hayattan bir örnek ile konuyu açalım. Biri size “Benim doğum tarihim 6.5.1980. Ben kaç
yaşındayım?” diye sorabilir. Aynı soru “Benim doğum yılım 1980. Ben kaç yaşındayım?” olarak da
sorulabilir. Aslında burada iki farklı hesaplama söz konusudur. Birincisinde günümüzdeki yıldan
verilen değerdeki yıl bulunarak çıkartılır. İkincisinde ise günümüzdeki yıldan doğrudan verilen değer çıkartılır. Bu iki farklı hesaplama dolayısı ile iki farklı metot gerektirir. Bu metotları kod olarak
yazmak istersek şu şekilde yazabiliriz:
int TariheGoreYasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}
int YilaGoreYasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}
Ancak görüldüğü gibi bu iki metodun da amacı aynıdır: Yaş Hesaplamak! C#, parametrelerin imzası ayrı olduğu sürece birden fazla metoda aynı ismi verme olanağını tanır.
Bu bilgi ışığında kodlar şu şekilde yazılabilir:
int YasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}
int YasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}
Artık sadece YasHesapla ismi kullanılarak iki metot da çağırılabilir. Eğer metoda DateTime tipinde
bir değer gönderirseniz ilk metot, int veri tipinde değer gönderirseniz ikinci metot çalışacaktır. Visual Studio’da bir metodun kaç overload’u olduğu görülebilir. Ayrıca bu metodun overload’larının
istediği imzalar IntelliSense’de aşağı-yukarı ok tuşları ile gezilebilir.
139
140
Bölüm 10
Şekil 10.9
Şekil 10.8
Overload’ların kullanılma nedeni yazılımcıyı metot kargaşasından kurtarmaktır. Şekil 10.10’da
görüldüğü gibi MessageBox sınıfının Show metodunun 21 tane overload’ı vardır.
Şekil 10.10
MessageBox’ın kullanımını hatırlayın. Bazen sadece ekranda mesaj olarak görünmesi gereken
metni verirken, bazen metnin yanında pencere başlığını, bazen pencerede gözükecek ikonu,
bazen de Yes-No, OK gibi gösterilecek düğmeleri veriyoruz. Aslında bunların hepsi ayrı ayrı metotlardır. Eğer MessageBox’ın Show metodunda overload kullanılmasaydı,
MessageBox.SadeceMetinGoster(“Merhaba Dünya”);
MessageBox.MetinVeBaslikGoster(“Merhaba Dünya”,”İlk Programımım”);
MessageBox.MetinBaslikVeDugmeGoster(“Merhaba
Programımım”, Buttons.YesNo);
Dünya”,”İlk
gibi kargaşaya yol açan bir çok metot kullanılacaktı. Oysa overload sayesinde sadece Show metodunu kullanıp parametrelerini değiştiriyoruz.
Lab 10.1 Hesap Makinesi
Bu örneğimizde 4 işlem yapabilen bir hesap makinesi uygulaması geliştireceğiz. Uygulamamızda
karar yapılarını, try...catch ifadesini ve metot yazmayı inceleyeceğiz.
1. Yeni bir Windows projesi açın ve ismini “HesapMakinesi” olarak değiştirin. Formunuzun görüntüsü Şekil 10.11’deki gibi olmalıdır.
Şekil 10.11
2. Formunuza Tablo 10.1 deki kontrolleri ekleyin.
Tablo 10.1
Name
Text
Label
lblSayi1
İlk Sayi
Label
lblSayi
İkinci Sayi
Label
lblIslem
İşlem
TextBox
txtSayi1
TextBox
txtSayi2
ComboBox
cmbIslem
Button
btnIslemYap
İşlem Yap
Metotlar
3. Öncelikle btnIslemYap’a tıklandığında kullanılacak bir metot hazırlayın. Kod penceresine geçin ve gerekli kodları yazın.
//3 parametre
tanımlayın.
alan
ve
geriye
değer
döndürmeyen
bir
metot
void IslemYap(int ilkSayi, int ikinciSayi, string islemTipi)
{
//Islemin sonucunu tutacak bir değişken tanımlayın ve ilk değerini
0 olarak atayın.
int sonuc = 0;
//Kullanıcının cmbIslem’den seçeceği işleme göre parametre olarak
aldığınız ilkSayi ve ikinciSayi’yi işleme sokun.
switch (islemTipi)
{
case “Topla”:
sonuc = ilkSayi + ikinciSayi;
break;
case “Çıkar”:
sonuc = ilkSayi - ikinciSayi;
break;
case “Çarp”:
sonuc = ilkSayi * ikinciSayi;
break;
case “Böl”:
sonuc = ilkSayi / ikinciSayi;
break;
default:
break;
}
//Sonucu gösterin
MessageBox.Show(sonuc.ToString());
}
4. btnIslemYap’a çift tıklayın ve kod penceresine geçerek btnIslemYap’ın Click olayına gerekli
kodları yazın.
private void btnIslemYap_Click(object sender, EventArgs e)
{
//Kullanıcının 0 ile bölme yapmasını engelleyin.
if (Convert.ToInt32(txtSayi2.Text)
“Bölme”)
==
0
&&
cmbIslem.Text
=
MessageBox.Show(“0 ile bölme yapılmaz”);
else
{
//Kullanıcının
deneyin.
girdiği
değerlere
göre
işlemi
yapmayı
141
142
Bölüm 10
try
{
IslemYap(Convert.ToInt32(txtSayi1.Text),
ToInt32(txtSayi2.Text), cmbIslem.Text);
Convert.
}
//Islem Yap metodunun bir hata ile karşılaşması durumunda
(Kullanıcının herhangi bir TextBox kontrolünü boş geçmesi veya bu
kontrollere sayı haricinde veri girmesi) uyarı verin.
catch (Exception)
{
MessageBox.Show(“Veri uyuşmuyor”);
}
}
}
Lab 10.2 Hepsini Temizle
Bu örneğimizde Form içindeki TextBox kontrollerinin içeriğini temizleyen bir metot hazırlayacağız.
1. Yeni bir Windows projesi oluşturun ve ismini ”TextBoxTemizle” olarak değiştirin. Formun görünümü Şekil 10.12’deki gibi olmalıdır.
Şekil 10.12
2. Formunuza Table 10.2’deki kontrolleri ekleyin.
Tablo 10.2
TextBox
txt1
1.Textbox
TextBox
txt2
2.Textbox
TextBox
txt3
3.Textbox
TextBox
txt4
4.TextBox
Button
btnTemizle
Temizle
3. Kod penceresine geçerek TextBoxTemizle adlı metot için gerekli kodları yazın.
private void textBoxTemizle()
{
//Form1’deki tüm kontrollere foreach döngüsü ile erişin.
foreach (Control c in this.Controls)
{
Metotlar
//Eğer kontrol TextBox ise Text’ini temizleyin.
if (c is TextBox)
{
c.Clear();
}
}
}
4. btnTemizle çift tıklandığı zaman textBoxTemizle adlı metodu çağırın. btnTemizle’ye çift tıklayın ve kod penceresinde btnTemizle’nin Click olayına gerekli kodları yazın.
private void btnTemizle_Click(object sender, EventArgs e)
{
//textBoxTemizle’yi çağırın.
textBoxTemizle();
}
Lab 10.3 IsNumeric
1. Yeni bir Windows projesi açın ve adını ”NumaraTest ” olarak değiştirin.
2. Tablo 10.3’ teki kontrolleri formunuza ekleyin.
Tablo 10.3
Name
Text
Button
btnTest
Test Et
TextBox
txtGirilen
-
3. Şimdi NumberTest isimli metot için gerekli kodları ekleyin:
public bool NumberTest(object value)
{
try
{
int i = Convert.ToInt32(value);
return true;
}
catch (Exception)
{
return false;
}
}
Bu metot parametre olarak aldığı değeri try bloğu içerisinde sayıya dönüştürmeye çalıştırmaktadır. Eğer olumlu sonuç alırsa true değer dönecektir. Bu değeri sayıya dönüştüremezse catch
bloğu çalışacak ve false değer dönecektir.
4. Şimdi btnTest isimli Button’ un üzerine çift tıklayarak kod penceresine geçin ve btnTest’ in
Click olayına gerekli kodları ekleyin:
143
144
Bölüm 10
private void btnTest_Click(object sender, EventArgs e)
{
if (NumberTest(txtGirilen.Text))
{
MessageBox.Show(“Sayı girildi..”);
}
else
{
MessageBox.Show(“Sayı girilmedi!”);
}
}
if yapısı içerisinde koşul olarak NumberTest metodu çağırılmaktadır. Eğer bu metottan dönen
değer true ise “Sayı girildi..” mesajı görüntülenecektir. Eğer bu metottan dönen değer false ise
“Sayı girilmedi!” mesajı görüntülenecektir.
Ödevler
1. Girilen sayı dizisindeki tek sayıları, ayrı bir dizide sıralayan uygulamayı yazın.
2. Bir TextBox’a sayı girilirken, girilen sayıyı basamaklara ayıran ve aralarına nokta koyan
uygulamayı yazın. (basamaklar üçer üçer ayrılacak ve aralarına nokta konulacaktır. Bu işlem
rakamlar girilirken yapılacaktır.)
3. Döviz kurlarına göre, girilen ücret miktarını Türk Lirası(YTL), Euro(€) ve Dolar($)’a çeviren
uygulamayı yazın.
11
String – Math –
DateTime
Metotları
11 String – Math – DateTime Metotları
•
String
•
ToCharArray
•
Math
•
DateTime
•
IsLeapYear
•
Lab 11.1 Kaç Gündür Yaşıyorum
•
Lab 11.2 Kayan Yazı
•
Lab 11.3 Kelimeyi Ters Çevir
•
Lab 11.4 İlk Harf Büyük
•
Lab 11.5 Metot Çalışma Zamanı
•
Ödevler
String – Math – DateTime Metotları
Bu bölümde .NET Framework içerisinde en sık kullanılan metotları inceleyeceğiz. Bu metotları üç
ana bölümde ele alacağız. Karakter tabanlı işlemler için String, matematiksel işlemler için Math
ve tarih ile ilgili işlemler için de DateTime başlıkları altında metotları tek tek açıklayıp örneklendireceğiz.
String
Compare
Compare metodu iki string ifadeyi karşılaştırmak için kullanılır. İlk parametre değeri ikinci parametre değerinden büyük ise 1, küçük ise -1 değerler eşit ise 0 döndürür.
Tanımı:
int Compare (string strA, string strB)
Örnek:
int sonuc = string.Compare(“a”, “b”);
//sonuc -1
int sonuc = string.Compare(“b”, “a”);
//sonuc 1
int sonuc = string.Compare(“a”, “a”);
//sonuc 0
Contains
Contains metodu, string ifadeler içinde arama yapmak için kullanılır. Parametre olarak verilen
string değer Contains metodunu çağıran string değer içinde mevcut ise geriye true, değilse false
döndürür.
Tanım:
bool Contains(string str);
Örnek:
string cumle = “Bilgeadam Bilgi Teknolojileri”;
string kelime1 = “Bilgi”;
string kelime2 = “Bilge”;
string kelime3 = “emre”;
bool sonuc = cumle.Contains(kelime1);
//sonuc = true
bool sonuc = cumle.Contains(kelime2);
//sonuc = true
148
Bölüm 11
bool sonuc = cumle.Contains(kelime3);
//sonuc = false
StartsWith - EndsWith
EndsWith, string ifadeler içinde arama yapmak için kullanılan başka bir metottur. Metodu çağıran
string değer parametre olarak verilen string değer ile bitiyor ise geriye true, bitmiyor ise false döndürür. StartsWith metodu ile de parametre olarak verilen string değer ile başlayıp başlamadığını
öğrenebilirsiniz.
Tanım:
bool EndsWith(string str);
bool StartWith(string str);
Örnek:
string cumle = “<b>Bu yazı kalın olacak</b>”;
string kelime1 = “/b>”;
string kelime2 = “<b”;
bool sonuc = cumle.EndsWith(kelime1);
//sonuc = true
bool sonuc = cumle.StartsWith(kelime2);
//sonuc = true
IndexOf
IndexOf, string ifadeler içinde arama yapmak için en çok kullanılan metottur. Metodu çağıran
string değer parametre olarak verilen string değeri içeriyor ise ilk konumun indeksini, içermiyor
ise -1 döndürür.
Tanım:
int IndexOf(string str);
int IndexOf(char c);
Örnek:
string cumle = “Fizik evrenin işletim sistemidir.”;
char karakter = ‘j’;
string kelime = “sistem”;
int sonuc = cumle.IndexOf(karakter);
//sonuc = -1
int sonuc = cumle.IndexOf(kelime);
//sonuc = 22
String – Math – DateTime Metotları
Insert
Insert metodu string değerlere belirtilen indeksten itibaren parametre olarak verilen string değerler eklemek için kullanılır. Elde edilen string değer geri döner.
Tanım:
string Insert(int indeks, string str);
Örnek:
string cumle = “Fizik işletim sistemidir.”;
string kelime = “evrenin” + “ “;
cumle = cumle.Insert(6, kelime);
//cumle = Fizik evrenin işletim sistemidir.
Join
Join metodu string dizilerini birleştirmek için kullanılır. İlk parametre değeri ile ikinci parametre
değeri olarak verilen string dizisindeki elemanları birleştirir. Geriye elde edilen string değer döner.
Bu metodun tam tersi Split’tir.
Tanım:
string Join(string ayrac, string[] dizi);
Örnek:
string[] dizi = {“Fizik”,”evrenin”,”işletim”,”sistemidir”}; string
cumle = string.Join(“ “, dizi); //cumle = Fizik evrenin işletim
sistemidir;
PadLeft - PadRight
Bir string değer soldan ya da sağdan yeni değerler eklemek için PadLeft ve PadRight metotları
kullanılır. İlk parametre değeri metodu çağıran string değerin toplam uzunluğuna eşit olana kadar
ikinci parametrede verilen karakter değerini ekler.
Tanım:
string PadLeft(int uzunluk, char karakter);
string PadRight(int uzunluk, char karakter);
Örnek:
string kelime = “7”;
sonuc = kelime.PadLeft(2,’0’);
//sonuc = “07”
sonuc = kelime.PadRight(2, ‘0’);
//sonuc = “70”
Remove
Remove metodu ile string bir değerin belirli bir bölümünü çıkarabilirsiniz. İlk parametre değeri
başlangıç indeksini ikinci parametre değeri ise kaç karakter çıkarılacağını belirtir.
149
150
Bölüm 11
Tanımı:
string Remove(int indeks,int karakterSayisi);
Örnek:
string kelime = “HoTMaiL”;
sonuc = kelime.Remove(0, 1);
//sonuc=otMail
sonuc = kelime.Remove(kelime.Length-1, 2);
//sonuc =
hoTMa -- son 2 karakteri çıkarır
Replace
Replace metodunu kullanarak string bir ifadenin belli bir parçasını değiştirebilirsiniz. İlk parametre
değeri değişecek parçayı ikinci parametre değeri ise yerine geçecek parçayı ifade eder. Elde
edilen değer geri döner.
Tanım:
string Replace(string str1, string str2)
Örnek:
string işlem = “1 + 5 = 6”;
işlem = işlem.Replace(“1”, “Bir”);
işlem = işlem.Replace(“+”, “artı”);
işlem = işlem.Replace(“5”, “beş”);
işlem = işlem.Replace(“=”, “eşittir”);
işlem = işlem.Replace(“6”, “altı”);
//işlem = Bir artı beş eşittir altı
//istenmeyen karakterleri silmek için de kullanılabilir.
string kelime=”merhaba@ dünya”;
kelime=kelime.Replace(“@”,””)
//kelime= merhaba dünya
Split
Split metodu, bir string değeri, parametre olarak verilen karakter ile bölmek için kullanılır. Geriye
string dizisi döner.
Tanım:
String[] Split(char karakter);
Örnek:
string cumle = “Yusuf,Emre,AYRILMAZ”;
string[] dizi = cumle.Split(‘,’);
//dizi[0] = Yusuf, dizi[1] = Emre v dizi[2] = AYRILMAZ
String – Math – DateTime Metotları
Substring
Substring metodu ile string bir değerin belirtilen bir parçasını elde edebilirsiniz.
Tanım:
string Substring(int indeks, int karakterSayisi)
Örnek:
string kelime = “Bilgeadam”;
string parca = kelime.Substring(5,4);
//parca = adam
ToCharArray
ToCharArray metodu, çağıran string değerin karakter dizisini döner.
Tanım:
char[] ToCharArray()
Örnek:
String kelime = “Emre”;
Char[] dizi = kelime.ToCharArray();
//dizi[0] = E, dizi[1] = m, dizi[2] = r ve dizi[3] = e
ToLower
ToLower metodu ile bir string değerin tüm karakterlerini küçük harfe çevirebilirsiniz.
Tanım:
string ToLower()
Örnek:
string kelime = “BİLGEADAM”;
kelime = kelime.ToLower();
//kelime = bilgeadam
ToUpper
ToUpper metodu ile bir string değerin tüm karakterlerini büyük harfe çevirebilirsiniz.
Tanım:
string ToUpper()
Örnek:
string kelime = “Bilgeadam”;
kelime = kelime.ToUpperr();
//kelime = BİLGEADAM
151
152
Bölüm 11
Trim - TrimStart - TrimEnd
Trim metodu ile string bir değerin başındaki ve sonundaki boşlukları temizleyebilirsiniz. TrimStart
ve TrimEnd metotları ile de sadece solundaki ya da sağındaki boşluklar temizlenebilir.
Tanım:
string Trim()
Örnek:
string kelime = “
Bilgeadam
“;
kelime = kelime.Trim();
//kelime = “Bilgedadam”
kelime = kelime.TrimStart();
//kelime = “Bilgedadam
”
kelime = kelime.TrimEnd();
//kelime = “
Bilgedadam”
Math
Ceiling
Ceiling metodu ile parametre değeri olarak verilen ondalıklı sayı yukarı yuvarlanarak tam sayıya
çevrilir.
Tanım:
double Ceiling(double sayı)
Örnek:
double sayi1 = 2.1;
double sayi2 = 2.7;
double sayi3 = -2.7;
double sonuc = Math.Ceiling(sayi1);
//sonuc = 3.0
double sonuc2 = Math.Ceiling(sayi2);
//sonuc2 = 3.0
double sonuc3 = Math.Ceiling(sayi3);
//sonuc3 = -2.0
Floor
Floor metodu ile parametre değeri olarak verilen ondalıklı sayı aşağı yuvarlanarak tam sayıya
çevrilir.
Tanım:
double Floor(double sayı)
String – Math – DateTime Metotları
Örnek:
double sayi1 = 2.1;
double sayi2 = 2.7;
double sayi3 = -2.7;
double sonuc = Math.Floor(sayi1);
//sonuc = 2.0
double sonuc2 = Math.Floor(sayi2);
//sonuc2 = 2.0
double sonuc3 = Math.Floor(sayi3);
//sonuc3 = -3.0
Max
Max metodu ile parametre değeri olarak verilen iki sayıdan büyük olanı elde edilir. Tüm sayı tiplerinde kullanılabilir.
Tanım:
double Max(double sayi1, double sayi2)
Örnek:
Double sayi1 = 90, sayi2 = 91;
Double sonuc = Math.Max(sayi1, sayi2);
//sonuc = 91
Min
Min metodu ile parametre değeri olarak verilen iki sayıdan küçük olanı elde edilir. Tüm sayı tiplerinde kullanılabilir.
Tanım:
double Min(double sayi1, double sayi2)
Örnek:
Double sayi1 = 90, sayi2 = 91;
Double sonuc = Math.Min(sayi1, sayi2);
//sonuc = 90
Pow
Pow metodu ile bir sayının kuvveti elde edilir. İlk parametre değeri olarak verilen sayının ikinci
parametre olarak verilen sayıya olan kuvveti geriye döner.
Tanım:
double Pow(double sayi1, double sayi2)
153
154
Bölüm 11
Örnek:
Double sayi = 9;
Double sonuc = Math.Pow(sayi, 2);
//sonuc = 81
Round
Round metodu ile parametre olarak verilen ondalıklı sayıyı en yakın sayıya yuvarlar.
Tanım:
double Round(double sayi)
Örnek:
Double sayi1 = 9.4;
Double sayi2 = 9.9;
Double sayi3 = -9.1;
Double sonuc = Math.Round(sayi1);
//sonuc = 9
Double sonuc2 = Math.Round(sayi2);
//sonuc2 = 10
Double sonuc3 = Math.Round(sayi3);
//sonuc3 = -9
Sqrt
Sqrt metodu ile parametre değeri olarak verilen sayının karekökü geri döner.
Tanım:
double Sqrt(double sayi)
Örnek:
Double sayi = 9;
Double sonuc = Math.Sqrt(sayi);
//sonuc = 3
DateTime
AddX
AddX metotları ile parametre olarak verilen sayı değer, metodu çağıran tarihe eklenir.
X yerine kullanılabilecek değerler:
Years (Yıl), Months (Ay), Days (Gün), Hours (Saat), Minutes (Dakika), Seconds (Saniye)
ve MiliSeconds (Milisaniye).
Tanım:
DateTime AddDays(double deger)
DateTime AddMinutes(double deger)
DateTime AddYears(deger)
String – Math – DateTime Metotları
Örnek:
//10.11.2007
DateTime bugun = DateTime.Now;
DateTime BesGunSonrakiTarih = bugun.AddDays(5);
//sonuç 15.11.2007
DaysInMonth
DaysInMonth metodu ile parametre değeri olarak
verilen yıl ve ayın kaç gün olduğunu öğrenebilirsiniz.
Eğer verilen parametre negatif olursa tarihin eklenmiş değil çıkarılmış hali döner. 4 gün öncenin tarihini bulmak için bugun.AddDays(-4) kullanılır.
Tanım:
int DaysInMonth(int yıl, int ay)
Örnek:
int gunSayisi = DateTime.DaysInMonth(1996,2);
//gunSayisi = 29;
IsLeapYear
IsLeapYear metodu ile parametre olarak verilen 4 haneli yıl değeri, artık yıl ise geriye true, değilse
false döner.
Tanım:
bool IsLeapYear(int yıl)
Örnek:
bool sonuc = DateTime.IsLeapYear(2004);
//sonuc = true;
bool sonuc = DateTime.IsLeapYear(2005);
//sonuc = false;
Subtract
Substract metodu ile iki tarih arasındaki farkı bulabilirsiniz.
Tanım:
TimeSpan Substract(DateTime tarih)
Örnek:
// 5.4.1976
DateTime tarih1 = new DateTime(1976, 4, 5);
//bugün 10.11.2007
155
156
Bölüm 11
TimeSpan fark = DateTime.Now.Subtract(tarih1);
//fark = 11541 gün, 277000 saat ve 16620046 dakika
Lab 11.1 Kaç Gündür Yaşıyorum
Bu örneğimizde girilen doğum tarihine göre kullanıcının hangi gün doğduğunu ve kaç gündür
hayatta olduğunu hesaplayan bir uygulama geliştireceğiz.
1. Yeni bir Windows uygulaması oluşturun ve ismini “KacGundurYasiyorum” olarak değiştirin.
Form görüntüsü Şekil 11.1’deki gibi olmalıdır.
Şekil 11.1
2. Formunuza Tablo 11.1’deki kontrolleri ekleyin. lblDogumGunu ve lblYasanGun, label1 ve
label2’nin sağındadır.
Tablo 11.1
Name
Text
TextBox
txtDogumTarih
Label
label1
Doğduğunuz Gün:
Label
label2
Yaşadığınız Gün Sayısı:
Button
btnHesapla
Hesapla
Label
lblDogumGunu
Label
lblYasananGun
Label
label3
Doğum Tarihi:
3. btnHesapla’ya çift tıklayarak kod penceresine geçin ve btnHesapla’nın Click olayına gerekli
kodları yazın.
//DateTime türünden bir değişken tanımlayın.
DateTime dogumTarih;
try
{
//txtDogumTarih’e girilen değeri Datetime türüne çevirerek
değişkene eşitleyin
dogumTarih = Convert.ToDateTime(txtDogumTarih.Text);
}
catch (Exception)
{
//Hatalı bir tarih girilirse uyarı verin.
MessageBox.Show(“Geçerli bir tarih giriniz.”);
return;
String – Math – DateTime Metotları
}
string ingilizceGunAdi;
//DateTime nesnesinin DayOfWeek özelliğini kontrol ederek bu değerin
ingilizcesini yakalayın.
ingilizceGunAdi = dogumTarih.DayOfWeek.ToString();
//Türkçe’sini, lblDogumGunu’ne yazdırın
switch (ingilizceGunAdi)
{
case “Sunday”:
lblDogumGunu.Text = “Pazar günü doğdunuz”;
break;
case “Monday”:
lblDogumGunu.Text = “Pazartesi günü doğdunuz”;
break;
case “Tuesday”:
lblDogumGunu.Text = “Salı günü doğdunuz”;
break;
case “Wednesday”:
lblDogumGunu.Text = “Çarşamba günü doğdunuz”;
break;
case “Thursday”:
lblDogumGunu.Text = “Perşembe günü doğdunuz”;
break;
case “Friday”:
lblDogumGunu.Text = “Cuma günü doğdunuz”;
break;
case “Saturday”:
lblDogumGunu.Text = “Cumartesi günü doğdunuz”;
break;
default:
break;
}
//TimeSpan türünden bir değişken oluşturun ve kullanıcının girdiği
tarih ile bugünün tarihi arasındaki farkı bu değişkene atayın.
TimeSpan fark = DateTime.Now.Subtract(dogumTarih);
//double türünden bir değişken tanımlayın ve kullanıcının girdiği
tarih ile bugünün tarihi arasındaki toplam gün sayısını bu değişkene
eşitleyin.
double yasananGun = fark.TotalDays;
157
158
Bölüm 11
//yasananGun’ü lblYasananGun’ e yazdırın.
lblYasananGun.Text
hayattasınız”;
=
Convert.ToInt32(yasananGun)
+
“
gündür
4. Uygulamamızda kullandığımız TimeSpan türü zaman aralığı belirlemek için kullanılır. TotalDays o aralıktaki toplam gün sayısını belirtir. Uygulamanızı çalıştırın ve geçerli bir tarih girerek test edin.
Lab 11.2 Kayan Yazı
1. Yeni bir Windows projesi açın ve adını ”KayanYazi” olarak değiştirin. Formunuzun görüntüsü
Şekil 11.2’deki gibi olmalıdır.
Şekil 11.2
2. Formunuza Tablo 11.2’deki kontrolleri ekleyin.
Tablo 11.2
Name
Text
Interval
Button
btnBaslat
Başlat
-
Button
btnDurdur
Durdur
-
Timer
timer1
-
500
3. Şimdi Form1 içerisinde global olarak yazi değişkenini tanımlayın.
string yazi = “C S H A R P “;
4. Şimdi Form1’ in üzerine çift tıklayarak kod penceresine geçin ve Form1’in Load olayına gerekli kodları ekleyin:
private void Form1_Load(object sender, EventArgs e)
{
this.Text = yazi;
}
5. Şimdi btnBaslat isimli Button’un üzerine çift tıklayarak kod penceresine geçin ve btnBaslat’in
Click olayına gerekli kodları ekleyin:
private void btnBaslat_Click(object sender, EventArgs e)
{
timer1.Start();
}
String – Math – DateTime Metotları
6. Şimdi btnDurdur isimli Button’un üzerine çift tıklayarak kod penceresine geçin ve btnDurdur’un
Click olayına gerekli kodları ekleyin:
private void btnBitir_Click(object sender, EventArgs e)
{
timer1.Stop();
}
7. Şimdi timer1 isimli Timer’ın üzerine çift tıklayarak kod penceresine geçin ve timer1’in Tick
olayına gerekli kodları ekleyin:
private void timer1_Tick(object sender, EventArgs e)
{
string ilkharf = yazi.Substring(0, 1);
yazi = yazi.Remove(0, 1);
yazi += ilkharf;
this.Text = yazi;
}
Bu kod kelimemizin ilk harfini bir değişken içerisine kaydettikten sonra kelimemizin ilk harfini
silerek 1 karakter kısaltır. Daha sonra değişken içerisindeki bu harfi kelimenin sonuna ekleyerek
kayma efektini gerçekleştirir.
Lab 11.3 Kelimeyi Ters Çevir
Bu örneğimizde TextBox kontrolüne girilen ifadeyi tersine çeviren bir uygulama hazırlayacağız.
1. Yeni bir Windows projesi açın ve ismini “TersKelime” olarak değiştirin. Form görüntüsü Şekil
11.03’teki gibi olmalıdır.
Şekil 11.3
2. Formunuza Tablo 11.3‘teki kontrolleri ekleyin.
Tablo 11.3
Name
Text
TextBox
txtKelime
Label
lblKelime
Kelime:
Label
lblSonuc
Girdiğiniz Kelimenin Tersi:
Button
btnTersineCevir
Tersine Çevir
3. btnTersCevir’e çift tıklayarak kod penceresine geçin ve btnTersCevir’in Click olayına gerekli
kodları yazın.
159
160
Bölüm 11
private void btnTersineCevir_Click(object sender, EventArgs e)
{
//kullanıcının girdiği yazıyı tutan değişken
string girilenYazi = txtKelime.Text;
//oluşacak yazı bu değişkende tutulacak
string tersYazi = “”;
for (int i = 0; i < girilenYazi.Length; i++)
{
//sırasıyla girilenTazi’daki her harf dolaşılıp, oluşan yazının
başına atılıyor.
tersYazi = girilenYazi.Substring(i, 1) + tersYazi;
}
//sonuç kullanıcıya gösteriliyor
lblSonuc.Text = tersYazi;
}
Lab 11.4 İlk Harf Büyük
Bu örneğimizde Textbox kontrolüne girilen metin içerisindeki her kelimenin ilk harfini büyük harf
yapan bir uygulama hazırlayacağız.
1. Yeni bir Windows uygulaması açın ve ismini “BuyukHarfeCevirme” olarak değiştirin. Form
görüntüsü Şekil 11.4’teki gibi olmalıdır.
Şekil 11.4
2. Formunuza Tablo 11.4’teki kontrolleri ekleyin.
Tablo 11.4
Name
Text
TextBox
txtMetin
Label
lblMetin
Metin Giriniz:
Button
btnCevir
Çevir
Label
lblSonuc
Sonuc:
3. btnCevir’e çift tıklayarak kod penceresine geçin ve btnCevir’in Click olayına gerekli kodları
yazın.
private void btnCevir_Click(object sender, EventArgs e)
{
//sonucu tutacak değişken
String – Math – DateTime Metotları
string sonuc=””;
//kullanıcının girdiği değerin ,sağındaki ve solundaki boşluklar
alınarak girilenYazi değişkenine atılır.
string girilenYazi = txtMetin.Text.Trim() ;
//girilenYazi boşluk karakterinden Split edilerek kelimeler
ayrıştırılır.
string[] kelimeler = girilenYazi.Split(‘ ‘);
//her kelime dönülür
for (int i = 0; i < kelimeler.Length; i++)
{
//kelimenin ilk harfi alınıp ilkHarf değişkenine atanır.
string ilkHarf = kelimeler[i].Substring(0,1);
//ilk harf haricindeki harfler sonrakiHarfler değişkenine
atanır.
string sonrakiHarfler = kelimeler[i].Substring(1);
//kelimenin düzgün yazılmış hali ilk harf büyük, diğerleri de
küçük harflere çevrilerek duzeltilmisKelime değişkenine atanır.
string duzeltilmisKelime = ilkHarf.ToUpper() + sonrakiHarfler.
ToLower();
//elde edilen kelime sonuc değişkenine eklenir ve bir sonraki
kelime için boşluk bırakılır.
sonuc += duzeltilmisKelime+” “;
}
//en sondaki boşluk karakteri temizlenir.
sonuc = sonuc.TrimEnd();
//sonuç kullanıcıya gösterilir.
lblSonuc.Text = sonuc;
}
4. Uygulamayı çalıştırın ve txtMetin’e değer girerek test edin. Çalışan uygulamanın ekran görüntüsü Şekil 11.05’teki gibidir.
Şekil 11.5
161
162
Bölüm 11
Lab 11.5 Metot Çalışma Zamanı
Bu örneğimizde program içinde kullandığımız metotların çalışmalarının kaç saniye sürdüğünü
gösteren bir uygulama geliştireceğiz.
1. Yeni bir Windows projesi açın ve ismini “MethodCalismaSuresi” olarak değiştirin. Form görüntünüz Şekil 11.06’daki gibi olmalıdır.
Şekil 11.6
2. Formunuza Tablo 11.5’teki kontrolleri ekleyin.
Tablo 11.5
Button
btnCalistir
Çalıştır
ListBox
lsAsalSayi
Label
lblBaslangic
Başlama Zamanı:
Label
lblBitis
Bitiş Zamanı:
Label
lblSure
Çalışma Süresi :
3. Öncelikle uygulamamızda kullanacağımız ve çalışma süresini gözlemleyeceğimiz metodu
tanımlayın. Örneğimizde 1-100 arası asal sayıları bulan bir metot kullanacağız. Bu metot
çalışma süresi gözlemleyebilmemiz için iyi bir örnek oluşturacaktır. Kod penceresine geçin ve
gerekli kodları yazın.
//1-100 arası asal sayiları bulan ve asal sayilari lstAsalSayi’da
görüntüleyen bir method yazın.
private void asalSayi()
{
for (int i = 2; i < 100; i++)
{
int ortakbolenSayisi = 0;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
ortakbolenSayisi++;
}
if (ortakbolenSayisi == 0)
lbAsalSayi.Items.Add(i);
}
}
String – Math – DateTime Metotları
4. btnCalistir’a çift tıklayarak kod penceresine geçin ve btnCalistir’in Click olayına gerekli kodları
yazın.
private void btnCalistir_Click(object sender, EventArgs e)
{
//Metot çağırılamdan önceki zamanı alın.
DateTime baslangic = DateTime.Now;
// Metot çağrılmadan önceki zamanı lblBaslangic’ a yazdırın. Daha
ayrıntılı hesaplama için
//baslangic adlı DateTime türünden değişkenin Millisecond özelliğini
de kullanın.
lblBaslangic.Text += baslangic.ToLongTimeString() + “:” + baslangic.
Millisecond;
//Metodu çalıştırın
asalSayi();
//Metodun çalışmasının bitiği andaki zamanı alın.
DateTime bitis = DateTime.Now;
//Metodun çalışması bittikten sonraki zamanı lblBitis’ e yazdırın.
Daha ayrıntılı hesaplama için
//bitis adlı DateTime türünden değişkenin Millisecond özelliğini
de kullanın.
lblBitis.Text += bitis.ToLongTimeString()+”:”+bitis.Millisecond;
//Çalışma süresini elde edebilmek için TimeSpan türünden bir
nesne tanımlayın ve baslangic ve bittiş arasındaki farkı bu nesneye
atayın.
TimeSpan sonuc = bitis - baslangic;
//Metodun kaç milisaniye çalıştığını görüntüleyin.
lblSonuc.Text += sonuc.TotalMilliseconds.ToString();
}
5. Çalışan uygulamanın ekran görüntüsü Şekil 11.7’deki gibidir.
Şekil 11.7
163
164
Bölüm 11
Ödevler
1. Temel olarak 4 işlem yapabilen (Daha fazla işlem yaptırabilirsiniz) hesap makinesi uygulaması geliştirin.
2. Finans sektörü için uygulama geliştiren yazılım takımında yer alıyorsunuz. Günlük kurların
takip edildiği modülü yazmanız gerekiyor. Modüldeki amaç ondalık kısmı 6 haneli elde dilen
döviz değerlerini ekranda yuvarlanmış ve ondalık kısmı 2 hane olarak göstermek
A
.NET Framework
– MSIL – CLR
Kavramları
A .NET Framework – MSIL
– CLR Kavramları
•
.NET Framework Nedir ?
•
C# Compiler Kullanarak Uygulama
Derlemek
•
Wizard (Sihirbaz) Yardımıyla Setup
Hazırlama
•
Online MSDN Üzerinden Arama
•
ToString Metodu – Numerik Biçimlendirme
.NET Framework – MSIL – CLR Kavramları
Uygulama geliştirme sürecine başlamış olduğunuz ilk 50 saat içerisinde temel olarak bir uygulama geliştiricisinin hangi özelliklere sahip olması gerektiği, hangi ortamların kullanılabileceği ve
temel kavramların ne olacağı konusunda bilgi sahibi oldunuz. Bu bölümde ise .NET Platformunu
daha yakından tanıyacağız. Bu bölümde anlatılanlar ön bilgi amaçlı olup, eğitimin daha sonraki
süreçlerinde işinize yarayacak olan temel konuları içermektedir.
.NET Framework Nedir ?
.NET Framework, dilden, işletim sisteminden ve cihazdan bağımsız uygulama geliştirebilecek
olduğumuz esnek, genişletilebilir ve “kullanımı kolay” bir uygulama geliştirme platformudur.
Platform kelimesini mercek altına aldığımızda ise .NET Framework’ ün bir programlama dili olmadığını, içerisinde çeşitli amaçlar için geliştirilmiş birçok aracın bulunduğu bir paket olarak değerlendirebiliriz.
Temel olarak .NET Framework ; CLS, CTS ve CLR olarak 3 ana araçtan oluşur. Şu an için bu
araçlardan sadece CLR‘ın biliniyor olması sizin için yeterli olacaktır. CLR‘ın ne olduğu konusunda
bilgi sahibi olmadan önce .NET Framework’ün nasıl dilden bağımsız bir yapısı olduğu hakkında
bilgi sahibi olalım.
.NET Framework kitap içerisinde de bahsedildiği üzere 50’den fazla dili desteklemektedir. Peki,
bu kadar dil, ortak bir noktada nasıl buluşabilmektedir? İşte bu noktada karşımıza Microsoft tarafından geliştirilen, 50’den fazla dilin derleme aşamasında otomatik olarak dönüştürüldüğü, orta
seviyeli bir dil olan MSIL (Microsoft Intermediate Language) karşımıza çıkmaktadır. .Net Framework uyumlu dillerin derleyicileri, derleme işlemi esnasında eğer kod içerisinde herhangi bir
problem ile karşılaşmaz ise kullanılan uygulama geliştirme dilinin kodlarını MSIL adı verilen ortak
bir dile çevirmektedir.
Konunun daha rahat anlaşılabilmesi açısından Şekil A.1 sizlere yardımcı olacaktır.
Şekil A.1’den de anlaşılabileceği üzere işlem 3 adımda oluşmaktadır.
Şekil A.1
168
Ek-A
Yazılan kodlar derleyici tarafından önce MSIL’e dönüştürülmekte, daha sonra bu orta seviyeli kod
hangi platform üzerinde çalıştırılıyor ise o platforma uygun makine diline çevrilmektedir. Peki, bu
noktada platforma uygun makine diline çevirim işlemi nasıl gerçekleşmektedir? Bu hangi araç ile
sağlanmaktadır? Temel yaklaşımla bakıldığında bu noktada karşımıza CLR (Common Language
Runtime) isimli araç çıkmaktadır. CLR çalışma anında MSIL kodlarını belirli kurallar çerçevesinde
makine diline çevirmekte ve uygulama çalıştırılacak hale getirilmektedir.
Peki, bu araçlar sistem üzerine nasıl kurulabilmektedir?
Eğitim süreci içerisinde sözü geçtiği üzere Microsoft tarafından geliştirilmiş, .Net Framework adı
verilen yaklaşık 25 MB’lık bir yükleme paketi bulunmaktadır. .Net Framework ile geliştirilen bir
uygulamanın diğer bir makinede (Örn: Arkadaşınızın makinesi, annenizin Notebook’u, halanızın
Surface PC’si v.b.) çalıştırılabilmesi için minimum yaklaşımla bu paketin sistem üzerine kurulu
olmuş olması gerekmektedir. Bu paketin yüklemesi sonucunda sisteminize .NET Framework ile
geliştirilen bir uygulamanın çalıştırılabilmesi için gereken temel araçlar sisteme kurulacaktır.
C# Compiler Kullanarak Uygulama Derlemek
Bu bölümde VS.NET 2008 arayüzünü kullanmadan Notepad üzerinde yazacak olduğumuz kod
bloğunu C# Compiler’ın üzerine gönderecek ve uygulamayı derleme sürecini izleyebileceğiz.
Aşağıdaki kod bloğunu boş bir Notepad sayfasına yazın.
using System;
public static class CSharpCompiler
{
public static void Main(string [] Args)
{
Console.WriteLine(“Merhaba Dünya !”);
Console.ReadLine();
}
}
Dosyayı txt olarak
kaydediyoruz, exe
olarak değil !
Dosyayı C:\ dizini altına Kodlar.txt olarak kaydedin.
Bir sonraki adımda Başlat > Çalıştır’a (Start > Run) şu komutları yazarak
Enter tuşuna basın:
%comspec% /k “”C:\Program Files\Microsoft Visual Studio 9.0\VC\
vcvarsall.bat”” x86
Açılan pencereye aşağıdaki komutu yazınız ve Enter tuşuna basın:
csc c:\Kodlar.txt
Ekran üzerinde herhangi bir hata çıkmamış ise uygulamamız derlenmiş; kodlarınız çalıştırılmak
üzere MSIL kodlarına dönüştürülmüş demektir.
Uygulamayı C:\Program Files\Microsoft Visual Studio 9.0\VC dizini altında EXE yani Executable
(Çalıştırılabilir) formatta bulabilirsiniz.
Exe’ye çift tıkladığınızda Şekil A.2’deki ekranı görüntüleyebilirsiniz.
Ek-A
Şekil A.2
Bu bölümde derleme işlemi için normal şartlarda VS.NET‘e ihtiyacımızın olmadığını ama mantıklı
bir yaklaşımla bakıldığında VS.NET kullanmamanın ne kadar da zor olduğu ile ilgili bilgi sahibi
olmuş olduk.
Wizard (Sihirbaz) Yardımıyla Setup Hazırlamak
Bu bölümde VS.NET üzerinde tanımlı sihirbazlar yardımıyla, geliştirmiş ve yayınlamayı düşündüğümüz bir uygulamanın Setup (Yükleme) paketinin nasıl hazırlanacağı ile ilgili basit ve anlaşılır
bir örnek hazırlayacağız.
Örneğimizi geliştirmeye geçmeden önce bir yükleme paketinin neden oluşturulması gerektiği ile
ilgili temel olarak bilgi sahibi olalım.
Geliştirmiş olduğumuz uygulamaları farklı bilgisayarlar üzerinde çalıştırmak isteyebiliriz.
Örneğin geliştirmiş olduğumuz bir kart oyununu MSN üzerinden bir arkadaşımıza göndererek
uygulamayı arkadaşımız ile paylaşmak isteyebiliriz. Peki, bu noktada ne tip problemler ile karşılaşabiliriz?
Öncelikle karşılaşabilecek olduğumuz en temel problem; uygulamanın .Net Framework ile geliştirilmiş olmasından dolayı uygulamayı gönderiyor olduğumuz kişinin makinesinde bu kurulumun
gerçekleştirilmiş olmasının gerekliliğidir. Bu kontrolü ancak ve ancak uygulamayı gönderiyor olduğumuz kişiye sorarak gerçekleştirebiliriz.
Bir diğer yaşanabilecek problem ise uygulama ile birlikte birden fazla dosyanın bulunmasının
gerektiği durumlarda dosyaları tek tek göndermek, tek tek gönderilse bile bunların ilgili klasörlere
tek tek kopyalanmasını sağlamak kolay bir iş değildir.
Peki, tüm bu problemlere çözüm olabilecek yapıda, hemen hemen internet üzerinden indirmiş olduğumuz tüm uygulamaların ilk çalıştırılma sürecinde karşımıza çıkan bir “yükleme paketi” modeli
üzerinden ilerlesek hem bizim açımızdan hem de uygulamayı gönderdiğimiz kişi açısından daha
uygun olmaz mıydı?
İşte bu noktada karşımıza VS.NET üzerinde hazır tanımlı olan Setup Projesi şablonları çıkmaktadır. Bu şablonlar yardımıyla birkaç tıklama ile uygulamalarımıza yükleme paketi oluşturabilir,
yüklenecek olan makinede yapılması gereken tüm işlemleri bu paket içerisinde tanımlayabiliriz.
Yükleme paketinin bir diğer avantajı ise uygulamanın yüklenecek olduğu sistemde .Net Framework kontrolünü yapması, şayet yok ise kişiyi ilgili Download sayfasına yönlendirmesidir.
Şimdi daha fazla vakit kaybetmeden örnek projemizi oluşturalım.
169
170
Ek-A
VS.NET’ i açtıktan sonra File > New > Project penceresinden şekildeki proje şablonunu seçiyoruz.
Şekil A.3
Bir sonraki adımda karşımıza çıkan Sihirbaz penceresindeki yönergeleri izleyelim.
Şekil A.4
Çıkan sihirbaz penceresinde Create a setup for a Windows Application seçeneğini seçelim.
Ek-A
Şekil A.5
Next düğmesine tıkladıktan sonra Setup paketi içerisinde hangi dosyaların bulunacağını seçmemizi isteyecek olan bir sihirbaz penceresi karşımıza gelmektedir.
Şekil A.6
171
172
Ek-A
Add düğmesine tıklayarak sistemimiz üzerinde bulunan uygulamamızı seçiyoruz ve Next düğmesine tıklıyoruz.
Şekil A.7
Finish düğmesine tıklıyoruz ve projeyi Build ediyoruz.
Şekil A.8
Setup paketimiz hazır. Hazırlanan yükleme dosyasını projeyi açtığımız uygulama klasörü içerisinde .msi uzantılı olarak bulabiliriz.
Şekil A.9
Ek-A
Online MSDN Üzerinden Arama
Bu bölümde internet erişiminin olduğu durumlarda Microsoft’un çevrimiçi yardım kütüphanesi
MSDN üzerinden ihtiyacımız olan herhangi bir bilgiye nasıl ulaşabileceğimiz üzerinde çalışacağız. Resimler üzerinden adım adım bir MSDN araması gerçekleştireceğiz.
Bilindiği üzere MSDN Yardım kütüphanesinin bilgisayarımız üzerinde yapılacak yükleme sonrası
kaplayacağı alan en az 3-4GB olacaktır.
Kütüphanenin boyutunun bu kadar büyük olmasının yanı sıra kütüphane çevrimdışı bir model
üzerinden çalıştığından gerekli güncellemelerinin internet üzerinden sürekli yapılması gerekmektedir.
İnternet erişiminin olduğu çevrimdışı paketi yüklemenin hiç bir gereği yoktur. Aynı sonuca “daha
güncel bir şekilde” internet üzerinden erişebiliriz.
Hızlı bir şekilde konuyu örneklendirmemiz gerekirse, Bitmap sınıfının nasıl kullanılacağı ile ilgili bir
MSDN araması gerçekleştirelim ve sonucunu birlikte değerlendirelim.
İnternet erişiminin olduğu bir ortamda tarayıcımızın adres çubuğuna Şekil A.10’daki adresi yazalım.
Şekil A.10
Sol üst köşedeki arama kutusuna Bitmap değerini yazarak Enter tuşuna basalım ve çıkan sonuçlardan ilkine tıklayalım.
Şekil A.11
173
174
Ek-A
Çıkan sayfa içerisinde sınıfın yapısını inceleyelim. Uygun olan kod bloğunu değerlendirdikten
sonra örnek kodu denemek için VS.NET içerisine açılan bir projeye kodu yapıştıralım ve uygulamayı çalıştıralım.
Şekil A.12
İlgili kod bloğunu (C#) seçerek uygulamayı deneyebiliriz.
Şekil A.13
ToString Metodu – Numerik Biçimlendirme
Tüm standart .Net numerik tipleri içerisinde bulunan ToString metodu, yapısı gereği numerik değeri çalışma zamanında string tipine dönüştürmeye yaramaktadır.
Bu dönüştürme işlemi esnasında ToString metodunun “Numeric Format String” parametresi üzerinden dönüştürme işlemi farklı ihtiyaçlar doğrultusunda kişiselleştirilebilmektedir.
Bilgilendirmeye geçmeden önce parametrenin temel kullanımını incelemek daha doğru olacaktır.
Parametrenin temel yapısı aşağıdaki gibidir:
{N:FormatString,M}
Bu noktada sembolik olarak ifade edilen değerlerden N, parametrenin indeks değerini, FormatString sayının nasıl görüntüleneceğini, M ise alanın uzunluğunu temsil etmektedir.
Aşağıdaki tabloda FormatString parametresine gelebilecek değerler ve açıklamaları listelenmiştir.
Ek-A
Tablo A.1
Kullanılan Karakter
Anlamı
C
Numerik değer, lokal sistemin kullanıyor olduğu
para birimi formatı üzerinden dönüştürmeye
sokulur.
D
Değeri decimal integer formatında görüntüler.
Belirlenen değer kadar sayının başına 0 karakteri
eklenir.
E
Değer üstel formatta görüntülenir.
F
Değer sabit-noktalı formatta görüntülenir.
G
Değer sabit-noktalı ya da tamsayı olarak
görüntülenir. Bu noktada en uygun seçim otomatik
olarak yapılmaktadır.
N
Değer virgülle ayrılarak görüntülenir.
Değer hexadecimal notasyon kullanılarak
görüntülenir.
X
Aşağıda konu ile ilgili örnek bir kullanım gösterilmiştir:
static void Main(string[] args)
{
Decimal ondalikSayi = 88.8M;
int tamSayi = 88;
Console.WriteLine(“Parasal
ToString(“C4”));
Console.WriteLine(“Decimal
ToString(“D7”));
Console.WriteLine(“Üstel
ToString(“E”));
Format:
Integer
“
+
Formatı:
Formatlama:”
ondalikSayi.
“
+
+
tamSayi.
ondalikSayi.
Console.WriteLine(“SabitNoktalıFormatlama:”+ondalikSayi.
ToString(“F5”));
Console.WriteLine(“Genel
ToString(“G”));
Formatlama:
Console.WriteLine(“Virgülle
ToString(“N”));
“
Ayrılmış:
Console.WriteLine(“Hexadecimal
ToString(“X4”));
+
ondalikSayi.
“
+
Notasyon:
“
Console.ReadLine();
}
Kod bloğu çalıştırıldığında ekrana Şekil A.14’teki görüntü gelmektedir:
ondalikSayi.
+
tamSayi.
175
176
Ek-A
Şekil A.14
IntelliSense
C# (csharp) yapısı itibariyle yazımı kolay olmayan bir dildir. Bu sebepten dolayı bu dili ilk defa
öğrenecek olanlar için hata çoğu zaman kaçınılmaz olmaktadır. Burada sözü edilen hatalar yazım (syntax) hatalarıdır. Bu hataları en aza indirmek için Visual Studio arayüzü bize IntelliSense
yazım yardımcısını sunmaktadır. Bu yardımcıyı iyi kullandığınız takdirde hataların en aza indiğini
göreceksiniz.
Kod yazarken, ilk harfe basmanızla beraber devreye giren IntelliSense yardımcı size o scope
içerisinde yazılabilecek değişken, metot, özellik gibi öğeleri listeler. Yazmak istediğiniz öğe seçili
hale geldiğinde devamını yazmanız gerekmez. Bu durumda yapmanız gereken en mantıklı adım
bir sonraki yazmak istediğiniz karakteri tuşlamak olacaktır. Örneğin TextBox kontrolünün Text
özelliğine metinsel bir değer atayan kodu yazacaksınız.
txtAd.Text = “metinsel ifade”;
t ve x harflerine basın hemen ardından txtAd’ın geldiğini göreceksiniz. Şimdi yapmanız gereken
nokta “.” ya basmak. IntelliSense burada eksik olan kısmı tamamlayacak ve noktadan sonra gelecek diğer kodları listeleyecektir. Tekrar T harfine basın
IntelliSense’ i herhangi bir scope içinde kod
TabIndex gelecek aşağı ok tuşu ile ilerleyip Text’i bulun
yazmadan aktif hale getirmek için Ctrl + Boşve eşit (=) tuşuna basıp bir boşluk verin. Bundan sonra
luk tuş kombinasyonunu kullanabilirsiniz.
çift tırnak içine “metinsel ifade” yi yazın.
Bazı durumlarda IntelliSense size cevap vermeyecektir.
Bu durumlar:

Kod yazdığınız satırda ya da üstünde hatalı kodlar olduğunda,

Komut satırlarında iken,

String bir ifadeyi yazıyor iken.
Sık Yapılan Hatalar
1. C# ta satırlar mutlaka noktalı virgül (;) ile bitmelidir.
Yanlış
string kelime = “yirmiyedi”
Doğru
string kelime = “yirmiyedi”;
Ek-A
2. Bir atama işlemi yapılıyorsa eşittir (=), karşılaştırma yapılıyorsa çift eşittir (==) kullanılmalıdır.
Yanlış
if(a = 10)
Doğru
if(a == 10)
3. Karmaşık bir aritmetik işlem yapılıyorsa parantezler ile öncelik sırası belirtmek gerekir.
Yanlış
int sonuc = 12 + 7 * 2; //sonuç=26
Doğru
int sonuc = (12 + 7) * 2; //sonuç=38
4. Metotlar aç kapa patantez () ile kullanılır. Eşit (=) ile değer veremezsiniz. Sadece parametreler aracılığı ile değer geçirebilirsiniz.
Yanlış
Math.Round = 90;
Math.Round() = 90;
Doğru
Math.Round(90);
5. Eğer bir metot geriye değer döndürecek ise mutlaka return ile uygun tipteki değer döndürülmelidir.
Yanlış
int toplam(int sayi1, int sayi2)
{
int sonuc = sayi1 + sayi2;
}
int toplam(int sayi1, int sayi2)
{
return int sonuc = sayi1 + sayi2;
}
Doğru
int toplam(int sayi1, int sayi2)
{
}
return sayi1 + sayi2;
177
178
Ek-A
6. Metotlar oluşturulurken parantezlerden sonra noktalı virgül (;) konulmaz.
Yanlış
void metod1();
{
}
string metod2(string ad);
{
}
Doğru
void metod1()
{
}
string metod2(string ad)
{
}
7. for, foreach ve while döngüleri ile if, switch deyimlerini tanımlarken noktalı virgül (;) kullanılmaz. Sadece do while döngüsünden sonra kullanılır.
Yanlış
for(int i = 0;i<=10;i++);
{
}
while(true);
{
}
Doğru
for(int i = 0;i<=10;i++)
{
}
while(true)
{
}
do
{
}while(true);

Benzer belgeler

Kontrol Ayrıntıları 1

Kontrol Ayrıntıları 1 çalışılması hem uygulamanın geliştirilmesi sürecini zorlaştıracak, hem de uygulamanın performansını olumsuz yönde etkileyecektir. Bu sebeple birden fazla sunucu üzerinde çalışan ve farklı teknoloji...

Detaylı