csharp programming version2

Upload: t0xicce

Post on 06-Jul-2015

173 views

Category:

Documents


5 download

TRANSCRIPT

BU DKMAN KAAN ASLAN TARAFINDAN C VE SSTEM PROGRAMCILARI DERNENDE VERLEN C# LE NESNE YNELML PROGRAMLAMA KURSUNDAK DERS ERSNDE TUTULAN NOTLARDAN OLUMAKTADIR. NOTLAR ZERNDE HBR DZELTME YAPILMAMITIR

.NET ORTAMININ TEMEL ZELLKLER ARAKOD SSTEM Diller Aras Entegrasyon(07.06.2007 Perembe)

.Net ortamnda, bu ortam iin yazlm derleyiciler ayn ortak arakodu retmektedir. rnein C# derleyicisi de, Visual Basic.Net derleyicisi de ayn arakodu retmektedir.Bu durumda C# da yazlm plan kodun Visual Basic.Nette ya da Visual Basic.Nette yazlm olan bir kodun C# ta kullanlmas tamamen doal yntemlerle salanm olur. Bir dilde yazlm olan kodlarn baka bir dilde kullanlmas nemli bir sorundur. Microsoft, .Net ncesinde COM denilen bir ara yzle bu sorunu zmeye almtr. Fakat bu COM sisteminin nemli dezavantajlar sz konusudur. Fakat .Nette diller aras entegrasyon zaten doal olarak arakod dzeyinde zlmtr. Microsoft, .Net ortam iin 4 programlama diline ait derleyiciyi kendi yazmtr. Bunlar C#, Visual Basic.Net, C++.Net, J# derleyicileridir. Ancak C# dnda dier diller bir takm syntax deiiklikleri ile bu ortama zorla adapte edilmitir. Bu nedenle C# bu ortamn birincil dilidir. Bir programlama dilinin .Net uyumlu olmas iin baz zellikleri barndrmas gerekir. Bu zelliklerin neler olduu ECMA 335 CLI standartlarnda belirtilmitir. Hzl Uygulama Gelitirme .Net ortam ve C# programlama dili hzl uygulama gelitirme srecini destekleyecek nitelikte tasarlanmtr. Uzun olmayan bir eitim srecinden sonra pek ou hazr olan bileenleri kullanarak uzman olmayanlarnda program yazabilmesi mmkn hale getirilmektedir. Hzl uygulama gelitirme de grsel elerin kullanlmas gerekmektedir. Ortak Snf Ktphanesi .Net ortamnda tm dillerde kullanlabilen ortak ve geni bir snf ktphanesi vardr. Pek ok ilem bu ktphaneler sayesinde kolayca yaplr. Bu ktphaneleri kullanma becerisi .Net programclnda nemli bir yer tutar. .Net ktphanesi, framework ktphanesine yeni snflar eklenerek geniletilmektedir. Bu ortak snf ktphanesinin baz blmleri zel isimlerle anlr. rnein veritaban iini yapan ksmna ADO.Net, ekranlar oluturmak iin kullanlan ksmna Forms, web sayfas oluturmak iin kullanlan ksmna ASP.Net denir. Web Tabanl alma .Net ortam Microsoftun web sunucular ile de btnletirilmitir. ASP.Net denilen sistemle etkileimli web sayfalar .Net ortam ierisinde oluturulabilmektedir. 1

Gvenlik .Net ortamnda arakod almas sayesinde gvenlik ihlalleri CLR tarafndan engellenebilmektedir. .Net ortam pek ok bakmdan daha gvenli bir alma ortam sunmaktadr. Visual Studio IDEsi .Net altnda yazlm gelitirme faaliyetlerini kolaylatrmak iin kendi ierisinde editr olan, eitli gelitirme aralar bulunan IDEler bulunmaktadr. Microsoftun .Net IDEsi Visual Studio isimli IDEdir. u anda kullanlan son srm Visual Studio 2005tir. Bu IDE eitli paketler halinde para ile satlmaktadr. En kapsaml versiyonu Team Editiondur.

.NET ORTAMI NASIL KURULUR? .Net ortamn kurmann birka deiik yolu vardr. 1- Windows Xpnin son srmleri, Windows Vistann son srmleri zaten .Net ortamn iletim sisteminin bir paras olarak iermektedir. Bu sistemlerde ayrca .Net ortamn kurmaya gerek yoktur. Microsoft bundan sonraki Windows srmlerinde .Net ortamnn tpk Internet Explorer gibi bulunacan sylemitir. 2- Visual Studio Express Edition IDEleri yklenirken .Net ortam da zaten yklenmi olur. 3- www.microsoft.com/downloads internet adresine girilerek .Net Framework 2.0 SDK indirilerek kurulur. Bu paket yaklak olarak 300mb civarndadr. .Net ortamnn yan sra komut satrndan alan eitli aralar da iermektedir. 4- Bir .Net programnn alabilmesi iin minimum kurulum .NET Framework Version 2.0 Redistributable Package isimli paketle yaplabilir.

DERLEYC VE IDE KAVRAMLARI Derleyiciler genellikle komut satrndan altrlan basit bir arayze sahip programlardr. Yaptklar i karmak olmasna karn altrlmalar ok basittir. Microsoftun C# derleyicisi csc.exe programdr. Hlbuki IDE derleme dndaki gelitirme faaliyetlerine yardmc olan programlardr. IDElerin kendi editrleri, menleri ve eitli yardmc aralar vardr. Program IDEde yazdktan sonra derleme aamasna gelindiinde IDE, komut satr derleyicisini ararak ilevini yapar(csc.exe). Aslnda en kark programlar bile Notepad gibi bir editrle yazlarak komut satrndan derlenebilir. 2

MERHABA DNYA PROGRAMI(12.06.2007 Sal)

Ekrana Merhaba Dnya yazsn kartan iskelet C# program aadaki gibi yazlabilir: namespace CSD { class App { public static void Main() { System.Console.WriteLine(Merhaba Dnya); } } } Bir snflarda ki ssl snflarn, C# program kabaca isim alanlarndan, isim alanlar snflardan, fonksiyonlardan olumaktadr. C#ta fonksiyonlara method da denir. parantez arasndaki blme blok denilmektedir. sim alanlarnn, fonksiyonlarn bloklar vardr.

Programlama dilleri ile doal diller yap olarak birbirine benzemektedir. Programlama dillerine dilbiliminde biimsel diller(Formal Languages) denir. Biimsel diller matematiksel olarak aklanabilir dillerdir. Doal diller matematiksel olarak aklamanaz. Bir dilde 3 eit kural topluluu vardr. 1-) Syntax Kurallar 2-) Semantik Kurallar 3-)Dier Kurallar Dilin tm bu kurallarna gramer denilmektedir. Syntax doru yazm kurallardr. Yani hangi yazmn doru hangi yazmn yanl olduunu gsteren kurallardr. Semantik kurallar ise yazlan eylerin ne anlama geldiine dair kurallar ierir. Ancak syntax olarak doru olan ifadeler semantik olarak yorumlanrlar. Kursumuzda syntax anlatmnda asal parantezler olmas gereken zorunlu eleri, keli parantezler [.] olup olmamas istee bal eleri ifade eder. Bir isim alan aadaki gibi bildirilir: namespace < isim > { } Snf alann genel bildirimi aadaki gibidir: class < isim > { . } 3

ATOM KAVRAMI Bir programlama dilinde yazlm kendi anlaml olan en kk blme atom(token) denilmektedir. Gerekten derleyiciler de ilk aamada kaynak kodu atomlarna ayrmaktadr. Bu ileme Lexical Analys denir. Daha sonra derleyiciler 2. aamada atomlarn dizili srasnn geerli bir program oluturup oluturmadna bakar. Buna Syntax Analys denir. 3. aamada programn ne yapmak istedii tespit edilir. Buna Semantic Analys denir. En son aamada programcnn istedii eyleri yapacak kod retilir. Buna Code Generation denir. 123456Atomlar 6 gruba ayrlr: Anahtar Szckler(Keywords): Deiken olarak isimlendirilmesi yasaklanm, dil iin zel anlam olan szcklere anahtar szck denir. Deikenler(Identifier/Variables): smini programcnn istedii gibi verebildii atomlara deiken diyoruz. Sabitler(Constants/Literals): Dorudan yazlm olan saylara sabit denir. Operatrler(Operators): Bir ileme yol aan, ilem sonrasnda bir deer retilmesini salayan atomlara operatr denir. Stringler(Strings): ki trnak iindeki yazlar trnaklar ile birlikte tek bir atomdur. Bu atomlara string denir. Ayralar(Delineters): Yukardaki gruplarn dnda kalan atomlara ({, ;) ayra denir. DERLEYCLERN HATA MESAJLARI Derleyici, atomlara ayrma ilemini yaptktan sonra programn doru yazlp yazlmadn denetlerken geersiz bir durumla karlarsa hatann kaynan aklayan bir hata mesaj verir. Sonuta derleme ilemi baarsz olur. Derleyiciler genellikle tm error mesajlarn tespit edip bir hamlede listelemektedir. Milyon satr programda bir error olsa bile program derlenemez. Error mesajlar genellikle syntax aamasnda ortaya kt iin bunlara Syntax Error denmektedir. Baz kodlamalar syntax olarak tamamen geerli olduu halde mantksal bir yanl ierebilirler. Bu tr durumlar derleyici fark ederse Warning (Uyar) mesajlar verir. Derleyicinin uyar mesaj vermesi kodun derlenmesini engellemez. Fakat eer gerekten derleyicinin szne ettii gibi bir mantk hatas varsa kod alrken istenileni yapamayacaktr. C# PROGRAMININ DERLENEREK ALITIRILMASI Komut satrndan C# derleyicisinin altrlabilmesi iin PATH evre deikeninin set edilmi olmas gerekmektedir. Komut satr iin Donatlarda deil Visual Studio 2005 Command Prompttan gemek gerekmektedir. Programlar herhangi bir text editrle (rnein Notepad) yazlabilir. Derleme ilemi yle yaplmaldr: 4

csc < proramn ismi > BOLUK KARAKTERLER (WHITE SPACE) Klavyeden boluk oluturmak iin kullanlan Space, Tab ve Enter karakterlerine boluk karakterleri denir. C#IN YAZIM KURALI C#n yazm kural 2 madde de zetlenebilir. 1- Atomlar arasnda istenildii kadar boluk karakteri kullanlabilir. 2- Atomlar istenildii kadar bitiik yazlabilir. Fakat deikenler ile anahtar szckler arasnda en az bir boluk karakteri eklemek gerekir. C# PROGRAMININ ALIMASI Bir isim alannda pek ok snf, bir snf alannda da pek ok fonksiyon bulunabilir. Fakat Main ismindeki fonksiyonun zel bir anlam vardr. C# program Main isimli fonksiyonla almaya balar Main fonksiyonu bitince programda biter. Main fonksiyonu herhangi bir snfn iinde olabilir. Fakat toplam da bir Main fonksiyonu olmaldr. Bir fonksiyonun bizim tarafmzdan yazlmasna fonksiyonun tanmlanmas (function definetion) denir. Fonksiyonun altrlmasna ise fonksiyon arma (function call) denir. Fonksiyon tanmlamann genel ekli aadaki gibidir:

[Eriim Belirleyicisi] [Static] ([Parametre Bildirimi]) { } Daha nce tanmlanm bir fonksiyonun arlma ilemi de aadaki gibi yaplr: [sim Alan smi] [.] [Snf smi] [.] ([Parametre Listesi]) ;

5

Anahtar Not Program terimi ok eskiden sylenmitir ve gnmzn gereksinimini tam karlamamaktadr. Program genellikle tek bir exeyi tanmlamak iin kullanlr. Halbuki uygulama (application) bir yada birden fazla program ieren bir projedir. Yani uygulama terimi daha geni bir anlam ifade eder. Windows uygulamalar GUI ve Konsol uygulamalar olarak ikiye ayrlr. Pencereli tip Windows uygulamalarna GUI uygulamalar diyoruz. Siyah ekranla alan uygulamalar da konsol uygulamalar diyoruz. Konsol uygulamalarnda bir imle vardr. Her zaman imleci bulunduu yere yaz yazlr, imlete yazlan miktar kadar ilerletilir. Consol snfnn Write fonksiyonu imleci sonda brakrken WriteLine fonksiyonu ekrana yazdrma ileminden sonra imleci aa satrn bana geirir.

C#TA TEMEL VER TRLER Tr(Type) bir deikenin bellekte ka byte yer kapladn ve onun ierisindeki bilgilerin hangi formatta bulunduunu anlatan bir kavramdr. Temel trler bir tablo halinde aadaki gibi ifade edilebilirler:Tr Belirten Anahtar Szckler int TAMSAYI TRLER Uint Long Ulong Short Ushort Byte sbyteGEREK SAYI TRLER

Uzunluk (Byte) 4 4 8 8 2 2 1 1 4 8 16 2 1

Yap Karl System.Int32 System.UInt32 System.Int64 System.UInt64 System.Int16 System.UInt16 System.Byte System.SByte System.Single System.Double System.Decimal System.Char System.Bool

Snr Deerler -2 31 , +2 31 0 , +4 294 967 295 -2 63 , +2 63 -32768 , +32767 0 , +65535 0 , +255 -128 , +127 Az Duyarlkl Gerek Say Duyarllk Yksek Say 28 Digit Yuvarlama Hatasz Gerek Say 0 , 65536 True , False

float double decimal char bool

int tr bir iaretli tamsay trdr. int tr her sistemde 4 byte uzunluktadr. (Cde olduu gibi derleyiciye bal deildir.) uint tr int trnn iaretsiz biimidir. Her tamsay trnn iaretsiz bir versiyonu da vardr. aretsiz trlere pozitif saylar yerletirilir. aretli versiyona gre 2 kat daha byk pozitif saylar yerletirilebilir. long tr 8 byte uzunluunda iaretli bir tamsay trdr.

6

short tr int trnn yar uzunluunda iaretli bir tamsay trdr. ushort short trnn iaretsiz trdr. byte ve sbyte trleri iaretsiz ve iaretli 1 byte uzunluunda tamsay trleridir. float tr 4 byte uzunluunda noktal bir say trdr. float trnn yuvarlama hatalarna direnci zayftr. double tr float trnden 2 kat daha fazla duyarllktadr. Dolays ile yuvarlama hatalarna direnci daha yksektir. decimal tr 28 digitli, noktal bir sayy yuvarlama hatas olmadan tam olarak tutar. Yapay bir trdr. zellikle finansal hesaplamalarda tercih edilir. Gerek say trlerinin iaretli ve iaretsiz trleri yoktur. Bu trler her zaman iaretlidir. char tr bir karakterin, karakter tablosundaki saysal karln tutmaktadr. Her sistemde 2 byte yer kaplar. Karakter tablosu Unicode tablosudur. (ASCII deil) bool tr yalnzca doru yanl bilgisini tutar. C#ta en fazla kullanlan tamsay tr int trdr. Programc ancak baka bir gereke varsa bu trn dnda bir tr denemelidir. En fazla kullanlan gerek say tr double trdr. nk yuvarlama hatalarna direnci yksektir. BLDRM LEM Kullanlmadan nce bir deikenin derleyiciye tantlmas ilemine bildirim diyoruz. Bildirim yaplmadan bir deiken kullanlamaz. Bildirim ileminin genel biimi aadaki gibidir:

< Tr Belirten Szck >

< Deiken Listesi > ;

rnein: int a; int a, b, c; double x, y, z; int a; double b;

7

C#ta bildirimler 2 yerde yaplr: 1- Fonksiyonlarn iinde 2- Fonksiyonlarn dnda fakat snf iinde Fonksiyonlarn iinde yaplan bildirimlere yerel bildirimler, snf bildirimi ierisindeki bildirimlere veri eleman bildirimi denir. Benzer biimde fonksiyon ierisindeki deikenlere yerel deikenler, snf ierisindeki deikenlere veri eleman diyoruz. Bir fonksiyonun ana blou olmak zorundadr. Fakat i ie veya ayrk blok alabilir. Yerel deikenler bloun herhangi bir yerinden bildirilebilir. Ancak bildirilme noktasndan sonra kullanlabilir. Bildirilen bir deiken tm programda kullanlmaz. Yalnzca belirli bir program aralnda kullanlabilir. Bir deikenin kullanlabildii program aralna faaliyet alan(scop) denir. Bir yerel deiken hangi blokta bildirilmise bildirim noktasndan sonra, bildirimin yapld blokta ve o bloun kapsad bloklarda kullanlabilir. Ama o blok dnda kullanlamaz. C#ta bir yerel deikenin bildirildii blokta ve o bloun kapsad bloklarda ayn isimde baka bir deiken bildirilmez. rnein: public static void Main() { int a; { long a; --> error } } Fakat ayrk bloklarda ayn isimli deikenler bildirilebilir. rnein: public static void Main() { { int a; --> Geerli } { int a; } } ie bloklarda ayn isimli deikenler bildirilemez. rnein ayn isimli bildirim nce i blokta sonra da d blokta tanmlansa da geersizdir. public static void Main() { { 8 --> Geerli

int a; } int a; } DEKENLERE LK DEER VERLMES Bir deiken bildirilir bildirilmez ierisine deer atanabilir. Bu ileme ilk deer verme denir. rnein: --> error

int a, b=10, c;

C#ta bir deikenin ierisine henz deer atanmamsa, bu deiken ierisindeki deerin kullanlaca bir ifade kullanlamaz. Kullanlrsa error oluur. rnein:

int a, b; b = a;

--> error

Yukardaki rnekte bnin kullanm geerli, ann kullanm geersizdir. rnein:

int a, b; a = 10; b = a; --> Geerli --> Geerli

Yerel deiken bildirilir bildirilmez faaliyet alanna girmi kabul edilir. rnein:

int a = 10, b = a; int a, b = a;

--> Geerli --> Error

Bir deikenin ierisindeki deer deikenin tr ne olursa olsun Console snfnn Write ve WriteLine fonksiyonlar ile yazdrlabilir.

9

SABTLER Dorudan yazlan saylara sabit denir. Yalnzca deikenlerin deil sabitlerinde bir tr vardr. yi bir C# programcsnn sayya baktnda trn tespit edebilmesi gerekmektedir. 1- Say nokta iermiyorsa ve sonunda da bir ek yoksa say int, uint, long, ulong snrlarnn hangisinin iine ilk giriyorsa sabit o trdr. 0 int 1 int 3 000 000 000 uint

Say eer ulong snrlar iine de smyorsa error oluur. 2- Say nokta iermiyorsa fakat saynn sonunda kk ya da byk L son eki varsa lon ve ulong trlerinin hangisinin ierisine ilk giriyorsa o trdr. 0L long 1L long

3- Say nokta iermiyorsa fakat saynn sonunda kk ya da byk U son eki varsa say uint ya da ulong trlerinin hangisinin iine ilk kez giriyorsa o trdr. 1U uint 2U uint 5 000 000 000 ulong

Say ulong snrlarnn iine de smyorsa error oluur. 4- Say nokta iermiyorsa fakat saynn sonunda kk ya da byk UL veya LU son eki varsa sabit ulong trdr. Sabit ulong snrna da smyorsa error oluur. 1UL ulong 5- Say nokta iermiyorsa fakat sonunda ek yoksa sabit double trdendir. rnein: 3,2 Double 7,4 Double

Say nokta iersin yada iermesin sonunda D , d son eki varsa sabit double trdendir. 6- Say nokta iersin yada iermesin sonunda F , f son eki varsa sabit float trdendir. rnein: 3F Float 3,2 Float

7- Bir karakter tek trnak ierisine alnrsa bu bir sabit belirtir. O karakterin Unicode tablodaki sra numarasn belirtmektedir. 10

C#da yazlar ve karakterler Unicode olarak tutulup saklanmaktadr. C# char tr saysal tr saysal bir trdr ve aritmetik ilemlere sokulabilir. Tek trnak ierisindeki karakterler char trdendir. Baz karakterler ekrana baslmak istendiinde grntlenmez. Grnt yerine birtakm olaylar gerekleir. rnein: Bip sesi duyulur yada cursor hareket eder. Tpk Cde olduu gibi ok kullanlan grntlenemeyen karakterler ters bl biiminde ifade edilmitir. Tek trnak ierisindeki ters bl sonra zel baz karakterler baz grntlenemeyen karakterlerin yerini tutmaktadr. Bunlarn listesi aadaki gibidir: \a \b \f \n \r \t Bip sesi kar (Alert) Cursor bir geri gider (Backspace) Printere gnderilmesi ile sayfa kts (Form Feed) Cursor aa satrn bana geer (New Line) Cursor bulunan satrn bana geer (Curriace Return) Cursor bir tab ilerler

8- Say nokta iersin ya da iermesin sonunda kk yada byk harf m varsa sabit decimal trdendir. 9- True ve false anahtar szckleri bool trden sabit belirtir. 10- C#da byte, sbyte, short, ushort trden sabit kavram yoktur. Anahtar Not: Ters bl karakterine ilikin karakter sabiti \ biiminde yazlamaz. \\ biiminde yazlmak zorundadr. Benzer biimde tek trnak karakterine ilikin karakter sabiti de biiminde deil \ biiminde yazlmak zorundadr. ATAMA LEMNDE TR UYUUMU Atama ileminde sol taraf ve sa taraf farkl trlerden olursa bu trlerin durumuna gre geersiz olabilmektedir. Bu konu ileride ele alnacaktr. Fakat o ders gelene kadar tr uyuumunu salayacaz.

11

FONKSYONLAR C#da fonksiyon terimi yerine method terimi de kullanlmaktadr. Fakat kursumuzda fonksiyon terimini tercih ediyoruz. Bir fonksiyon tanmlamann genel ekli aadaki gibidir:

[Eriim Belirleyicisi] [static] ([parametre bildirimi]) { // } Eriim belirleyicisi yalnzca u anahtar szclerden biri olabilir.

public, protected, private, internal, protected internal Eriim belirleyicisi hi yazlmayabilir. Eer yazlmamsa private yazlm gibi ilem grr. Fakat bu konu baka bir derste ele alnana kadar biz public belirleyicisini kullanacaz. Static anahtar szc belirtilebilir ya da belirtilmeyebilir. Static anahtar szc, eriim belirleyicisi anahtar szckle ayn grupta yer ald iin yer deitirmeli olarak yazlabilir. Static anahtar szc ile tanmlanm fonksiyonlara (static method) static, static anahtar szc kullanlmadan bildirilmi fonksiyonlara static olmayan (instance method) fonksiyonlar denilmektedir. Main fonksiyonu zel bir snfta bulunmak zorunda deildir. Herhangi bir snfta bulunabilir. Fakat Main fonksiyonu static olmak zorundadr. Eriim belirleyicisi public olmak zorunda deildir. C#da isim alanlar (namespace) i ie bulunabilir. Hibir isim alan iinde bulunmayan blmde bir isim alandr. Buna da global isim alan denmektedir. Global isim alanna da dorudan snf alan tanmlanabilir. Fakat iyi bir teknik deildir. Global isim alan ierisindeki system isim alan .Netin kendi snflarnn bulunduu isim alandr. .Netin tm snflar ya dorudan system isim alan ierisindedir ya da system isim alan ierisindeki isim alanlar ierisindedir. Anahtar Not: Foo ve Bar isimleri son 10 yldr yazlmnda rneklerde uydurma fonksiyon isimleri olarak kullanlmaktadr. Bu szcklerin bu balamda anlamlar yoktur. 12

Bir static fonksiyon en genel olarak nce isim alan ismi sonra snf ismi belirtilerek arlr. arma ilemi genel biimi aadaki gibidir:

[isim alan ismi] [.] ([parametre listesi]) ;

[snf

ismi]

[.]

Eer arlacak fonksiyon ayn snfn static fonksiyonu ise isim alan ismi ve snf isminin belirtilmesine gerek yoktur. Sadece fonksiyon ismi belirtilebilir. arlacak static fonksiyon ayn isim alan ierisindeki baka bir snf ierisinde ise isim alan isminin belirtilmesine gerek yoktur. Nihayet fonksiyon baka bir isim alan ierisindeki snfn fonksiyonu ise bu durumda tm nitelikleri yapmak gerekmektedir. FONKSYONLARIN GER DN DEERLER (RETURN VALUE) Fonksiyon altrldktan sonra onu aran fonksiyona ilettii deere geri dn deeri denir. Geri dn deeri bir deikene atanabilir, aritmetik ilemlerde kullanlabilir. Fonksiyonun geri dn tr herhangi bir trden olabilir. Eer geri dn trnn yerine Void anahtar szc yazlrsa bu durum fonksiyonun geri dn deerine sahip olmad anlamna gelir. Fonksiyonun geri dn deeri return anahtar szc ile belirtilir. Return anahtar szcnn genel biimi aadaki gibidir:

return [ifade] ;

Return anahtar szcnn iki ilevi vardr: 1- Fonksiyonu sonlandrr. 2- Geri dn deerini oluturur. Fonksiyonun geri dn deerinde return anahtar szcnn kullanlmas zorunludur. Programn her olas aknda derleyici return anahtar szc ile karlamak zorundadr. Void fonksiyonlarda return kullanlabilir. Fakat return anahtar szcne bir deer yazlamaz. Bu durumda return, fonksiyonu sonlandrmak iin kullanlmtr. Fonksiyonun geri dn deeri nce derleyici tarafndan yaratlan geici bir deikene atanr, oradan alnarak kullanlr. Zaten fonksiyonun geri dn deerinin tr de bu geici deikenin trdr. rnein: x = Func(); Burada aslnda aadaki gibi bir ilem sz konusudur: temp = return ifadesi; 13

x = temp; Yaratlan bu geici deiken yine derleyicinin kendisi tarafndan ilgili ifade bittiinde yok edilir. O halde aslnda return ilemi bir atama ilemidir. Geici deikene atama yaplmaktadr. Fonksiyonun geri dn deerine sahip olmas onu kullanmay zorunlu hale getirmez. Yani geri dn deeri extra bir deerdir. FADE KAVRAMI Deikenlerin, operatrlerin ve sabitlerin her bir birleimine ifade denir. rnein: x , x + 1, 10, x + 1 + 5, x + y birer ifadedir. YEREL DEKENLERN MRLER Bir deikenin bellekte kald zamana mr(duration) denir. Anahtar Not: C#da /* ve */ arasndaki yazlar derleyici tarafndan dikkate alnmaz. Programc kaynak koda ilikin aklamalar bu ekilde yazabilir. Benzer biimde //dan satr sonuna kadarki yazda dikkate alnmaz. Bir yerel deiken, programn ak tanmlama noktasna geldiinde oluturulur. Ak deikenin tanmland bloktan ktnda otomatik yok edilir. Yani bir programn yerel deikenlerinin hepsi ayn anda bellekte deildir. Yerel deikenlerin bu ekilde oluturulup yok edilmeleri ok hzl yaplmaktadr. Yerel deikenler bellein stock denilen blmnde oluturulur. Yerel bir deiken tanmland blok dnda kullanamamzn nedeni zaten o deikenin blok dna kldnda bellekte yaamyor olmasndan kaynaklanmaktadr. OPERATRLER Bir ileme yol aan ilem sonrasnda bir deer retilmesini salayan atomlara operatr denir. Operatrleri biimde snflandrabiliriz: 1. levlerine gre 2. Operant saylarna gre 3. Operatrn konumuna gre 1. levlerine Gre Snflandrma: Operatrlerin kullanldna ynelik snflandrmadr. a. Aritmetik operatrler + - * / operatrleridir. 14 hangi amala

b. Karlatrma operatrleri (Comparison veya relational operators) < > gibi operatrlerdir. c. Mantksal operatrler(Logical operators) Ve veya not tarz operatrlerdir. d. Bit operatrleri (Bit seviyesinde operatrlerdir) e. zel amal operatrler (Special purposes) 2. Operant Saylarna Gre Snflandrma: Operatrlerin soktuu ifadelere operant denir. a+b a. Tek operantl operatrler(Unary operators) a! b. ki operantl operatrler (Binary operatorler) a+b c. operantl operatrler (Ternary Operators) 3. Operatrn Konumuna Gre Snflandrma: a. nek operatrler - Prefix b. Araek operatrler - Infix c. Son ek operatrler Postix C sharpta tm iki operantl operatrler araek- infix durumundadr. Bir operatr teknik olarak aklayabilmek iin snflandrmada da operatrn nereye dtn belirtmek gerekir. rnein + operatr iki operantl, araek bir aritmetik operatrdr. OPERATRLER ARASINDAK NCELK LKS Ayn ifade ierisinde birden fazla operatr kullanldnda bu operatrler belirli bir srada yaplr. Operatrlerin arasndaki ncelik ilikisi ncelik tablosu denilen bir tablo ile gsterilir. ncelik tablosu satrlarda oluur. st satrlar alt satrlardan daha nceliklidir. ncelik Tablosu: () * + = / Soldan Saa Soldan Saa Soldan Saa Sadan Sola ileme

ncelik tablosunda her satrn sana Soldan saa veya sadan sola ifadesi yazldr. Soldan saa demek, o satrda bulunan operatrlerin ifade ierisinde hangisi soldaysa o nce yaplr demektir. Ayn satrdaki operatrler eit nceliklidir. Soldan saa veya sadan sola bu eitlikteki ncelii bildirir. Yani ncelik tablosunda, ayn satrdaki operatrler farkl srada yazlsa da ayn anlama gelir. * / + - Operatrleri: Bu operatrler, iki operantl araek aritmetik operatrlerdir. Klasik drt ilem yaparlar. % Operatr: Bu operatr de, iki operantl araek bir aritmetik operatrdr. 10 % 3 eklinde gsterilir. Bu operatr soldaki operantn sadaki operanda blmnden elde edilen kalan verir. 15

Anahtar Notlar : C ve C++da % operatrnn operantlar tam say trlerine ilikin olmak zorundadr ama C# da byle bir zorunluluk yoktur. Yani 20.2 % 3 veya -20 % 3 geerli bir mod kullanmdr. ncelik Tablosu: () * + = / % Soldan Saa Soldan Saa Soldan Saa Sadan Sola

% operatr * ve / operatrleri ile ayn dzeyde soldan saa bulunur. aret + ve aret operatrleri: Tamamen farkl operatrler ayn sembolle ifade ediliyor olabilir. rnein; - a ya da + a derken kullanlan ve + operatrleri toplama ve kartma operatrleri deildir. Bunlara iaret + ve iaret operatrleri denir. Bu operatrler tek operantl, nek operatrlerdir. operatr operantn negatif deerini elde eder. aret + operatr, srf iaret eksi operatr olduu iin btnlk salamak amacyla bulundurulmutur ve bir ilevi yoktur. Yani, operandn deerinin aynsn retir. Bu operatrler, ncelik tablosunun ikinci dzeyinde sadan sola grupta bulunur. levine gre aritmetik bir operatrdr. + () * + = { int a; a = -3; System.Console.WriteLine(a); } / % Sadan Sola(iaret + ve iaret - operatrleri) Soldan Saa Soldan Saa Soldan Saa Sadan Sola Ekran kts: 3

Anahtar Notlar Atomlara ayrma ilemi srasnda tpk C/C++ daki gibi atom olmaya aday en uzun karakter kmesi tek bir atom olarak ele alnmaktadr. Bu nedenle, iki sembolden oluan baz operatrler vardr. Bu durumda bu iki semboln bitiik yazlmas gerekir. Eer bu iki sembol ayr yazlrsa, derleyici iki ayr atom olduu fikrine kaplr ve error oluur. rnein; a>=b ifadesi a> = b olarak yazlrsa error oluur.

16

Hi phesiz derleyici, toplama ve karma operatrlerini ifade ierisindeki konumlarndan hareketle iaret + ve iaret operatrlerinden ayrmaktadr. rnein; z = x ----y; z =x --kartma aret Operatr Operatr y;

Xten sonraki ilk iareti kartma olmakla beraber dier operatrleri iaret operatrleridir. Anahtar Notlar ncelik parantezinin ierisinde ifade tanmna uyan bir atom grubunun bulunmas zorunludur. Mademki, tek bana bir operatr ifade deildir, o halde tek bana bir operatr ncelik parantezi ierisine alnamaz.

++ ve -- operatrleri : Bu operatrler, tek operantl hem nek hem de sonek biiminde kullanlabilen operatrlerdir. ++ artrma (increment) operatr, -- operatrne eksiltme (decrement) operatr denir. ++, operand olan deikenin deerini bir artrr, -- ise bir eksiltir. Bu operatrlerin nek ve sonek kullanmlar arasnda bir fark vardr. Bu operatrler, ikinci dzeyde sadan sola bulunurlar. () + * + = / ++ % -Soldan Saa Sadan Sola (iaret + ve iaret - operatrleri) Soldan Saa Soldan Saa Sadan Sola

nek kullanmnda, arttrma ve eksiltme tablodaki ncelikte yaplr ve geri kalan ileme deikeni arttrlm veya eksiltilmi hali sokulur. a = 3 b = ++a * 2 i1 = ++a => 4 i2 = i1 * 2 => 8 i3 => b = i2 = 8 Hlbuki son ek kullanmda yine artrma ve eksiltme yaplr ama geri kalan ilemlere deikenin artrlmam veya eksiltilmemi hali sokulur. a = 3 b = ++a * 2 i1 = ++a => 4 i2 = i1 * 2 => 6 i3 => b = i2 = 6 17

rnein; aadaki ifade iin int a = 3, b = 2, c; c = ++a * b -- * 2 ; //c=16 b=1 a=4 deerlerini alr. System.Console.WriteLine(a); System.Console.WriteLine(b); System.Console.WriteLine(c); rnein: int a = 3, b; b = ++a; //a =4 b = 4 rnein; int a = 3, b; b = a++; //a =4 b = 3 phesiz, bu operatrler tek balarna kullanldnda n ek ya da sonek biimler arasnda bir fark olumaz. rnein; ++a; ile a++; arasnda bir fark yoktur. nk tek balarna kullanlmlardr. ++ ve operatrlerinin operantlarnn deiken olmas gerekir. rnein; ++3; //error verir. Anahtar Notlar (Cciler iin) C/C++ da bir deiken bir ifadede ++ ya da -- ile kullanlmsa o deikenin o ifadede bir daha gzkmemesi gerekir. Aksi halde, tanmsz davran oluur. Hlbuki C# da byle bir durum sz konusu deildir. Aadaki ifade tamamen geerlidir: int a=3, b; b=++a + ++a; //b = 9 a=5

Karlatrma operatrleri: C# da alt tane karlatrma operatr vardr. , =, ==, != operatrleri aritmetik operatrlerden daha dk nceliklidir. () + ++ -Soldan Saa Sadan Sola(iaret + ve iaret - operatrleri) 18

* / % Soldan Saa + Soldan Saa = Sadan Sola , =, ==, != Soldan Saa = Sadan Sola Bu operatrlerde bool trden deer retilir. Yani sonu yalnzca bool trden deikenlere atanabilir. nerme doruysa true deerini, yanlsa false deerini retirler. int a = 3; bool b; b = a > 1; //b=True bool b; b = 1 + 1 < 2 + 3; System.Console.WriteLine(b); Ekran kts: False

Mantksal Operatrler: adet mantksal operatr vardr. ! not operatrdr. Tek operantl ve nek bir operatrdr. && yani and operatr, || yani or operatrdrler. Bu operatrler iki operantl araek operatrlerdir. ! ncelik tablosunun ikinci dzeyinde sadan sola bulunur. && ve || karlatrma operatrlerinden daha dk nceliklidir. () Soldan Saa + ++ -Sadan Sola(iaret + ve iaret - operatrleri) * / % Soldan Saa + Soldan Saa = Sadan Sola , =, ==, != Soldan Saa &&(and iareti) Soldan Saa ||(or iareti) Soldan Saa = Sadan Sola Mantksal operatrn operantlarnn bool trden olmas zorunludur. Bu operatrler, ilgili mantksal ilemi yaparlar ve sonu olarak bool trden bir rn retirler. rnein: e = a > b && c > d; Yukardaki ifade de nce a > b sonra c > d yaplr. Bu iler bool trden rn verdiine gre && operatrnn kullanm dorudur. Tabi, enin de bool trden olmas gerekir. rnein: 19

bool b; b = 3 > 2 && 2 < 8 ; System.Console.WriteLine(b); Ekran kts: True rnein: bool b; b = !Func(); System.Console.WriteLine(b); public static bool Func() { return true; } Ekran kts: False

&& ve || operatrlerinin ksa devre zellii vardr. Bu operatrler klasik ncelik kuralna uymazlar. || operatrnn sanda ne olursa olsun nce sol taraf tamamen yaplp bitirilir, eer sol tarafndaki ifade true ise sa taraf hi yaplmaz ve sonu true olarak tespit edilir. && operatrnn de nce sol taraf tamamen yaplp bitirilir. Eer sol taraf false ise sa taraf hi yaplmaz ve sonu false olarak tespit edilir. Tek | ve tek &, bit dzeyindeki or ve and operatrleridir. Her ne kadar bu operatrler bit operatrleri olsa da bool trlerle de kullanlabilir. Fakat bu operatrlerin ksa devre zellii yoktur. Yani operatrn her iki taraf da yaplmaktadr. Atama operatr: Atama operatrleri de iki operantl araek operatrlerdir. Atama operatrnn solunda bir deiken bulunmaldr. Atama operatr de bir deer retmektedir. Atama operatrnn rettii deer, deikene atanm olan deerdir. Biz bu rn, baka ilemlerde kullanabiliriz. rnek: a = b = 0 i1 = b = 0; a = i1 => 0 rnek: a = (b = 10) + 20; Burada nce bye 10 atanr. Elde edilen 10 , 20 ile toplanp aya atanr. Noktal Virgln levi: a = 10+20; 20

b = 30; ; ifadeleri sonlandrmak iin kullanlr. ki; arasndaki ifade dierlerinden farkl bir biimde nceliklendirilir ve yaplr. Eer programc ; unutursa nceki ifade ile sonraki ifade tek bir ifade olarak deerlendirilir ve error oluur. rnein; a = 10 + 20 b = 30; // bu ifade iki satrdan olumaktadr. nk st satrda; yok Programlama dillerinde, ifadeleri sonlandrmak iin kullanlan bu tr atomlara sonlandrc (terminator) denilmektedir. Basic gibi baz dillerde sonlandrc olarak \n (alt satrn bana ge) karakteri kullanlmaktadr. Bu nedenle bu dillerde her satra tek bir ifade yazlmaktadr. C#da bir ilemin sonucunun, gizli ya da ak bir deikene atanmas gerekir. rnein; a + b; ilemi anlamszdr ve error oluturur. Fakat fonksiyon armalar (fonksiyon zaten bir yan etkiye yol at iin) bu biimde deerlendirilmez. rnein; Func(); Fonksiyonun geri dn deeri kullanlmak zorunda deildir. Bu durum geerlidir. Hlbuki Func()+1; ifadesi geersizdir ve error verir. Anahtar Notlar C/C++ da bir ilemin sonucunun bir yere atanmas zorunlu deildir. Yani yukardaki rneklerde C/C++ da geerlidir ve derleyici en fazla uyar verir.

VISUAL STUDIO IDESNN TEMEL KULLANIMI Visual Studio IDEsinde bir C# programn derleyip altrmak iin nce bir proje oluturmak gerekir. Projeler ise solution denilen bir ortamda bulunmaktadr. Bir solution, bir ya da birden fazla projeyi ierebilir. O halde programcnn bir solution yaratp iine bir proje yerletirmesi gerekir. Bunun iin file/new/project mens seilir. Karmza new project isimli bir diyalog penceresi kar. Bu diyalog penceresinden proje tr olarak Visual C#/windows/empty project seilir. Normal olarak hem solution iin hem de project iin ayr bir klasr yaratlr. Yani, normal olarak yaratm ileminin sonunda bir solution klasr bir de onun iinde project klasr oluturur. 21

Solution klasrnn yaratlaca taban klasr location ksmnda belirtilir. Sonra projeye bir isim verilir. stenirse solutiona da ayr bir isim verilebilir. Bu isimler yaratlacak klasrlerin isimleri olur. Bir solution yaratldnda solution explorer isimli bir pencere de yaratlr. Bu pencere kapatlrsa view mensnden ya da ara ubuklarndan yine grntlenir. Proje yaratldktan sonra .cs uzantl bir kaynak dosyay projenin iine yerletirmek gerekir. Kaynak dosya eklemek iin project/add new item seilebilir. Ya da solution explorerda proje isminin stne sa tklanarak kan balam mensnden de seim yaplabilir. Daha sonra kan add new item diyalog penceresinden code file seilir. Kaynak dosyaya isim verilerek yaratlr. Daha sonra program dosyaya yazlr. Bu ilemlerden sonra derleme iin built/built solution seilir. Artk exe olumutur. altrma ilemi komut satrndan yaplabilir. Ya da hi komut satrna kmadan debug/start without debugging (ctrl+f5) ile yaplabilir. Eer ctrl+f5 yaplrsa zaten hem derleme hem altrma ilemi otomatik olarak gerekletirilir. Daha nce yaratlm olan bir solution file/open/projectsolution yoluyla alabilir. Programc, sln uzantl dosyay seerek solution aabilir. PARAMETRE DEKENLER Bir fonksiyonun parametre deikenleri fonksiyon tanmlanrken parametre parantezinin iinde bildirilir. Parametre parantezinin iine aralarna virgl konularak tr ve deiken isimleri verilir. Parametre deikenlerine ilk deer verilemez. rnein; public static void func (int a , int b) { //.... //.... } Parametre deikenlerinin trleri ayn olsa bile tr belirten anahtar szck her defasnda yazlmak zorundadr. rnein; public static void func (int a , b) Error verir. { //.... //.... }

Parametreli bir fonksiyon arlrken parametre deikeni says kadar ifade yazlmak zorundadr. 22

Anahtar Notlar Pek ok programlama dilinin standartlarnda parametre ve argman terimleri farkl anlamlarda kullanlmaktadr. Fonksiyon arlrken yazlan ifadelere argman (argument), fonksiyonun parametre deikenlerine parametre (parameter) denilmektedir. Halbuki kursumuzda argman yerine parametre, parametre yerine parametre deikeni kullanlmaktadr. public static void Func(int a, int b) { // } // Func(100 + 300 , 200 + 500); Parametreli bir fonksiyon arldnda srasyla unlar olur; 1. Parametrelerin deerleri hesaplanr. (100+300 gibi) 2. Fonksiyonun parametre deikenleri yaratlr. 3. Parametrelerden parametre deikenlerine karlkl atama yaplr. 4. Ak fonksiyona geirilir. Parametre deikenleri, fonksiyon arldnda fonksiyon sonlandnda da yok edilmektedir. public static void Main() { int a = 10 , b = 20 , result; result = Add(a + 1 , b + 1); System.Console.WriteLine(result); } public static int Add(int a, int b) { return a + b; } yaratlmakta ve

Grld gibi parametreli fonksiyonlarn arlmas da gizli bir atama ilemine yol amaktadr. System.Math Snf: Math snfnn temel matematiksel ilemleri yapan pek ok faydal fonksiyonu vardr. sqrt fonksiyonu double bir parametre alr ve geri dn deeri de double trdendir. Parametresi ile ald deerin karekkn geri dner. public static void Main() { Double a = 100 , result; Result = System.Math.Sqrt(a); 23

System.Console.WriteLine(result); } Pow fonksiyonu birinci parametresi ile belirtilen deerin ikinci parametresi ile belirtilen kuvvetini alr ve bu deeri geri dner. Sin, cos, tan, asin, acos, atan fonksiyonlar trigonometrik ilemler yapar. Parametre olan alar radyan cinsindendir. Abs fonksiyonlar (absolute value) mutlak deer almakta kullanlr.

Deyimler(statement): Bir C# program kabaca isim alanlarndan , isim alanlar snflardan, snflar veri elemanlar ve fonksiyonlardan, fonksiyonlar da deyimlerden oluur. Fonksiyonlar deyimlerden oluur, deyimler doal dillerdeki cmleler gibidir. Deyimler, aadaki gibi snflandrlabilir; 1. Yaln Deyimler (Simple Statement): Bir ifadenin sonuna ; konulursa bu ifade deyim olur. Byle deyimlere basit deyim denir. rnein; a=b+c; grld gibi ifade kavram ; iermez. 2. Bileik Deyimler (Compound statement): bir blok ierisine yerletirilmi 0 ya da daha fazla deyime bileik deyim denir. Yani bloklar bileik deyim belirtmektedir. rnek: { X=10; { Y=20; Z=30; } }

Burada bloun tamam tek bir deyimdir. Bu birleik deyim tek bir deyim iermektedir. Grld gibi, bir deyim baka deyimleri ierebilir. 3. Bildirim Deyimleri (Declaration statement): Bildirim yapmakta kullandmz ifadeler de bir deyim oluturur. rnein; int a, b; 4. Kontrol Deyimleri(Control Statement) : Programn ak zerinde etkili olan if, for, while gibi anahtar szcklerle oluturulan cmleler de birer deyimdir. 5. Bo deyim (null statement) : Sonunda bir ifade olmadan kullanlan ;lere bo deyim denir. rnein: x=10;;; (en sondaki iki adet ; bo deyimdir) bo deyimin karsnda derleyici bir ey yapmaz. Fakat bo deyim de bir deyim olarak deerlendirilir. IF Deyimi : If deyiminin genel biimi yledir; if ( [else ] 24

Derleyici, if anahtar szcnden sonra parantezler ierisinde bool trden bir ifade bekler. If deyiminin doruysa ve yanlsa ksmnda tek bir deyim bulunmak zorundadr. Eer doruysa ve yanlsa ksmnda birden fazla deyim varsa programc bloklama yaparak bunlar tek deyim haline getirmek zorundadr. Anahtar Notlar C/C++da if parantezi ierisindeki ifade herhangi bir trden olabilir. If deyimi yle alr: Derleyici if parantezi ierisindeki ifadenin deerini hesaplar. Bu deer true ise if deyiminin doruysa ksmndaki deyimi altrr, yanlsa ksmn atlar. False ise yanlsa ksmndaki deeri altrr. Anahtar Notlar Klavyeden T trnden bir bilgi okumak iin aadaki ifade kullanlabilir: T.Parse(System.Console.Readline())

puclic static void Main() { int val; val = int.Parse(System.Console.ReadLine()); System.Console.WriteLine(val); }

puclic static void Main() { int val; val = int.Parse(System.Console.ReadLine()); if(val > 10) System.Console.WriteLine(Evet); else System.Console.WriteLine(Hayr); }

If deyiminin else ksm bulunmak zorunda deildir. Derleyici, if deyiminin doruysa ksmndan sonra else anahtar szcnn gelip gelmediine bakar. Eer else anahtar szc, gelmemise if deyiminin bittiini dnr. If deyiminin yanllkla ; ile kapatlmas hatas ile karlalmaktadr. rnein; 25

if (ifade1); ifade2; Burada artk if deyiminin doruysa ksmnda bo deyim Dolaysyla, ifade2; if deyiminin dndadr. vardr.

ie if deyimleri: f deyiminin tamam, doruysa ve yanlsa ksm ile birlikte tek bir deyimdir. rnein; if ifade1 if ifade2 { ifade1; ifade 2; } else { ifade3; ifade 4; } else ifade7; ifade8; ki ife karlk tek bir elsein bulunduu aadaki durumda elsein iteki ife ilikin olduu kabul edilmektedir. f(ifade1) if(ifade2) ifade3; else ifade4; Yani bu if cmlesi, u anlama gelmektedir.

if(ifade1) if (ifade2) { fade3; } Else fade4;

Eer else ksmnn dtaki ife ilikin olmas isteniyorsa bilinli olarak bloklama yaplmas gerekir. if(ifade1) { if (ifade2) 26

ifade3; } else ifade4;

Bir karlatrma doruyken dierinin doru olma olasl yoksa bu iki karlatrmaya ayrk (discreet ) karlatrmalar denir. rnein; a > 10 a < 0 Karlatrmalar ayrktr. rnein; a == 1 a == 2 Karlatrmalar ayrktr. Fakat a > 0 a > 10 Karlatrmalar ayrk deildir. Ayrk karlatrmalarn ayrk if deyimleri ile ifade edilmesi kt bir tekniktir. rnein; if(a > 10) ifade1; if(a < 0) ifade2; Ayrk karlatrmalarn else if biiminde ifade edilmesi gerekir.

if(a > 10) ifade1; else if a(a < 0) ifade2; Bazen ayrk karlatrmalarn says fazla olduu iin bir else-if merdiveni sz konusu olabilir. rnein; if(a == 1) fade1; else if (a == 2) ifade2; else if(a == 3) ifade3; else if (a == 4) 27

ifade4; System.Char isimli snfn char bir deeri parametre olarak alp onu test eden eitli isXXX (is ile balayan) fonksiyonlar vardr. Bu fonksiyonlarn geri dn deeri bool trndendir. IsUpper; byk harf mi testini, IsLower; kk harf mi testini, IsDigit; saysal bir karakter mi testini, IsLetter; harf mi testini, IsWhiteSpace; boluk karakterlerinden biri mi testini yapar. public static void Main() { char ch; ch = char.Parse(System.Console.ReadLine()); if(System.Char.IsUpper(ch)) System.Console.WriteLine(Byk Harf); else if(System.Char.IsLower(ch)) System.Console.WriteLine(Kk Harf); else if(System.Char.IsDigit(ch)) System.Console.WriteLine(Digit); else if(System.Char.IsWhiteSpace(ch)) System.Console.WriteLine(Boluk Karakteri); else System.Console.WriteLine(Dier); } If deyiminin doruysa ksm olmak zorundadr. Yalnzca yanlsa ksm olan bir if yapay olarak yle salanabilir; if (ifade) ; else ifade1; Bunun yerine, soru ifadesini aadaki gibi deitirmek daha uygundur. if (!ifade) ifade1; Dng Deyimleri: Bir program parasnn yinelemeli (literatif) olarak altrlmasn salayan deyimlere dng deyimleri denir. C#da tr deyim vardr. 1- While dngleri a- Kontroln bata yapld while dngleri b- Kontroln sonda yapld while dngleri 28

2- For dngleri 3- For Each dngleri

Anahtar Notlar C/C++da for each dngs yoktur. For each dngleri diziler konusundan sonra ele alnacaktr. Kontroln Bata Yapld While Dngleri: While dngleri bir koulun doru olduu srece yinelenen dnglerdir. Genel biimi yledir; While() while anahtar szcnden sonra parantezlerin iinde bool trden bir ifade bulunmak zorundadr. Dngnn iinde tek bir deyim vardr. Eer birden fazla deyimin dng ierisinde bulundurulmas isteniyorsa bloklanmas lazmdr. while dngs yle alr: while parantezi ierisindeki ifadenin deeri hesaplanr eer bu deer true ise dng deyimi altrlr ve baa dnlr, false ise programn ak dng dndaki ilk deyimle devam eder. public static void Main() { int i = 0; Ekran kts: 0 1 2 while (i < 10) 3 { 4 5 System.Console.WriteLine(i); 6 ++i; 7 } 8 9

}

While parantezinin ierisinde son ek olarak bir ++ ya da -- varsa deikenin artrlmam ya da eksiltilmemi hali test ilemine girer. while (i++ < 10) { System.Console.WriteLine (i); } while (i >= 0) { System.Console.WriteLine(i); --i; }

29

Dnglerin yanllkla bo karlalmaktadr. rnein;

deyimle

kapatlmas

durumuyla

sk

int i = 0; while (i < 10) ; { System.Console.WriteLine(i); ++i; } Burada dng bo deyimle olumaktadr ve dolaysyla sonsuz dng oluur. Krmz ile iaretli olan bo deyimdir ve o gerekletirilir. Sonsuz dng yle kurulabilir; while (true) { // ..... }

Kontroln sonda Yapld While Dngleri: Bu dnglere do-while dngleri de denilmektedir. Genel biimi: Do While (); Buradaki ; iareti bir bo deyim deil syntaxn bir parasdr. rnek: int=0; do { System.Console.WriteLine(i); ++i; } while (i10; ++i) { } Birinci ve nc ksm olmayan for dngs while dngs ile edeerdir. rnein; for (; ifade;) { //... } ile while (ifade) { //... } edeerdir. For dngsnn ikinci ksm yazlmazsa koulun her zaman saland kabul edilir. Yani sonsuz dng oluur. rnein;

for (i = 0 ; ; ++i) //sonsuz dng { //... } ile for (i = 0 ; true ; ++i) //sonsuz dng { //... } ayndr. Nihayet for dngsnn hibir ksm olmayabilir. Fakat ; n her zaman bulunmas gerekir. rnein; for ( ; ; ) // sonsuz dng { //... } 32

For dngsnn birinci ksmnda (fakat dier ksmlarnda deil) bildirim yaplabilir. rnein; for (int i = 0 ; i < 100;++i) { //.. } For dngsnn birinci ksmnda belirtilen deikenlerin faaliyet alan sadece dng blounun ierisini kapsar. Yani; for (int i = 0 ; i < 100 ; ++i) { // } leminin edeeri; int i; for (i = 0 ; i < 100 ; ++i) { //.. } biimindedir. Bu edeerlikten hareketle, ayn blok ierisinde aadaki gibi iki for dngsnn bulunmas soruna yol amaz. for (int i = 0 ; i < 100 ; ++i) { //... } for (int i = 0 ; i < 100 ; ++i) { //... } For dngsnn en ok kullanld kalp yledir; for (ilk deer ; koul ; artrm) { //... } Fakat dngnn blmleri bu biimde bir kalp izlemek zorunda deildir.for (System.Console.Writeline(Bir) ; i ? < ifade2 > : < ifade3 >

42

Koul operatr adeta if deyimi gibi alan bir operatrdr. Ancak koul operatr bir deer retmektedir. Koul operatrnn birinci operant bool trden olmak zorundadr. nce ? nin solundaki ifadenin deeri hesaplanr. Eer deer true ise ? ile : arasndaki ifade yaplr, false ise : nin sandaki ifade yaplr. Koul operatr duruma gre ? ile : arasndaki yada : nin sandaki ifadenin deerini retir. phesiz koul operatr ile yaplan her ey aslnda if deyimi ile de yaplabilir. Koul operatr if deyimi gibi kullanlmamaldr. Bir karlatrma sonrasnda elde edilen deerin ileme sokulaca durumlarda tercih edilmelidir. int val , result; System.Consol.Write(Say Giriniz: ); val = int.Parse(System.Console.ReadLine());kalb

Klavyeden bilgi okuma

result = val > 10 ? 100 : 200; System.Console.Write(result) Koul operatrnn kullanlmasnn salk verildii tipik durumlar unlardr: 1- Karlatrma srasnda elde edilen deerin bir deikene atand durumlar. rnein: total = 0; for (int i = 1900 ; i < 2007 ; ++i) total += System.DateTime:IsLeapYear(i) ? 366 : 365; Burada 1900 ylndan 2007 ylna kadar toplam geen gn says hesaplanmtr. Ayn ekilde if ile de u ekilde yaplr: total = 0; for (int i = 1900 ; i < 2007 ; ++i) if (System.DateTime:IsLeapYear(i)) total += 366; else total += 365; 2- Koul operatr return ileminde de gzel bir biimde kullanlabilir. rnein: public static int GetMAx(int a, int b) { return a > b ? a : b; } 43

Burada a ile bden hangisi bykse o deer ile geri dnlmektedir. Ayn ilem yle de yaplabilir:

public static int GetMAx(int a, int b) { if (a > b) return a; else return b; } 3- Fonksiyon arma ileminde koul operatr kullanlabilir. rnein:

Func (a > b ? a : b); Burada fonksiyonun tek bir parametre deikeni vardr.lem aadaki ile edeerdir: if (a > b); Func(a); else Func(b); Parantezler kullanlarak baz operatrler koul operatrnn operant olmaktan karlabilir. rnein: int a = 100 , b; b = (a > 0 ? 100 : 200) + 300; Burada nce parantez ii yaplr. Koul doru da olsa yanl da olsa 300 ile toplama yaplr. ADRES KAVRAMI(17.07.2007 Sal)

Bellek kaytlarda olumutur. Bellekteki her byte ilk byte 0 olmak zere ardk bir sayya karlk getirilmitir. Bu sayya ilgili bytein adresi denmektedir. Tanmladmz tm deikenler bir yer kaplamaktadr. Onlarn bir adresi vardr. rnein: byte = a; a 1011001 Burada ann adresi 1011001dir. Bir byte uzunluunda olan deikenlerin adresleri onlarn en dk adresleri ile ifade edilir. rnein: 44

int = x; 50500 50501 x 50502 50503 Burada x deikenin adresi 50500dr. SINIFLARIN VER ELEMANLARI Fonksiyonlarn dnda fakat snf bildirimleri deikenlere snfn veri elemanlar(field) denmektedir. ierisinde bildirilen

Snfn veri elemanlar da static olabilir ya da olmayabilir. Snfn veri elemanlarnda da eriim belirleyicisi anahtar szckler kullanlabilir. Bu anahtar szcklerden hibiri kullanlmasayd private kullanlm gibi varsaylmaktadr.(Daha nceden de belirtildii gibi static anahtar szc ya da eriim belirleyicisi yerel deikenlerde kullanlamaz) Her snf ayn zamanda bir tr belirtir. Snf trlerinde deiken tanmlayabiliriz. DEER TRLER VE REFERANS TRLER Trler kategori olarak 2ye ayrlmaktadr: 1- Deer Trleri(Value Types) 2- Referans Trleri(Reference Types) Bugne kadar grdmz int, long trleri kategori olarak deer trleridir. Deer trlerine ilikin bir deiken, deerin kendisini tutar. Oysa referans trlerine ilikin bir deiken, deerin kendisini tutmaz. Deerin kendisi bellekte baka bir yerdedir, deiken onun bellekteki adresinin tutar. Yani referans trlerine ilikin bir deiken adres tutmaktadr. Deerin kendisi referansn tuttuu adrestedir. Snf trleri kategori olarak referans trlerine ilikindir. Yani bir snf trnden deiken tanmlandnda bu deikenin ierisine bir adres yerletirilebilir. SINIF TRLERNDEN NESNELERN YARATILMASI Snf trlerinde deikenlere referansta denir. rnein Sample bir snf olsun: Sample s; Burada s nesnenin kendisi deildir. Nesnenin adresini tutacak bir adrestir. Nesnenin kendisi new operatr ile yaratlr. New operatrnn kullanm u ekildedir: new < snf ismi > ()

45

rnein: new Sample() new operatr ile tahsisat yapldnda derleyici snfn static olmayan veri elemanlar iin ardk bir biimde bellein heap denilen blmnde tahsisat yapmaktadr. Snflar bileik trlerdir. Yani paralardan olumaktadr. Bir snf nesnesinin paralar static olmayan veri elemanlardr. Snfn fonksiyonlar new ile tahsis edilen alanda yer kaplamaz. Snfn static veri elemanlar new ile tahsis edilen alanda yer kaplamaz. Yalnzca snfn static olmayan veri elemanlar yer kaplar. Bir bileik nesnenin adresi onun ilk bytenn adresi ile belirtilmektedir. new operatr heapte tahsisat yaptktan sonra yaratlan birleik nesnenin adresini verir. new operatr ile tahsis edilen nesnenin adresi ayn snf trnden referansa atanmaldr. Bylece referans artk tahsis edilmi snf nesnesini gsterir duruma gelmitir. Heap a Sample Snf b Nesnesi

Sample s; s = new Sample();

5000000 5000004 5000008

Yerel deikenler ister referans olsun isterse deer trlerine ilikin olsun stackte yer kaplar. Fakat new operatr ile tahsis edilen snf nesneleri heapte yer kaplamaktadr. rnein:

Sample s; s = new Sample(); stack s heap a b

Sample Nesnesi

NOKTA OPERATR Nokta operatr iki operantl araek bir operatrdr. Nokta operatrnn solundaki operant, bir snf alan ismi, bir snf ismi olabilecei gibi bir snf trnden referansta olabilir. Nokta operatrnn solunda snf referans varsa sanda o snfn static olmayan bir eleman olmak zorundadr.

46

r bir snf trnden referans a bu snfn static olmayan bir veri eleman olmak zere r.a ifadesi r referansnn gsterdii yerdeki nesnenin a parasn gsterir. Sample s; s = new Sample(); s.a = 10; s.b = 20; stack s Burada s.a ve s.b int trdendir. Genel rnek: class App { public static void Main() { Sample s; s = new Sample(); s.a = 10; s.b = 20; System.Console.WriteLine(s.a); System.Console.WriteLine(s.b); } } class Sample { public int a; public int b; public int static int c; public void Foo() { // } public static void Bar() { // } } Ayn trden iki snf referans birbirine atanabilmektedir. ki referans birbirine atandnda referansn iindeki adresler atanmaktadr. Bu durumda referanslar ayn nesneyi gsterir durumdadr. a b heap 10 20

47

Sample s; s = new Sample(); Sample k; k = s; stack s k heap 10 20

a b

G.rnek: public static void Main() { Sample s; s = new Sample(); s.a = 10; s.b = 20; Sample k = s; System.Console.WriteLine(k.a); System.Console.WriteLine(k.b); } Her new ilemi heapte yeni bir snf nesnesi yaratlmasna neden olmaktadr. P TOPLAYICI KAVRAMI CLR(Common Language Runtime) her nesnenin belli bir anda ka referans tarafndan gsterildiinin kaydn tutmaktadr. Buna nesnenin referans sayac denmektedir. rnein: {1

2

3 4 5 6

Sample x = new Sample(); { Sample y; y = x; { Sample z; z = new Sample(); } }

}

48

Her new ayr bir nesnenin yaratlmasna neden olmaktadr. Burada ak 1 noktasna geldiinde heapte yaratlan 1.nesneyi tek bir referans gsteriyor. Yani bu nesnenin referans sayac 1dir. Ak 2 noktasna geldiinde 1.nesneyi 2 referans gsteriyor durumdadr. Ak 3 numaral noktaya geldiinde 1.nesneyi 2 referans, 2.nesneyi 1 referans gsteriyor durumdadr. Her nesnenin referans sayac ayndr. Ak 4 noktasna geldiinde 1.nesneyi 2 referans, 2.nesneyi 0 referans gsteriyor durumdadr.(Bloktan kld iin). Ak 5 noktasna geldiinde 1.nesneyi 1 referans, 2.nesneyi 0 referans gsteriyor durumdadr. Nihayet ak 6 noktasna geldiinde her iki nesneyi de 0 referans gsteriyor durumdadr. (Bloklardan kldka stacktaki nesneler yok olmaktadr). CLR heapteki yaratlan her nesnenin referans sayac srekli izlenmektedir. Nesnenin referans sayac 0a dtnde artk nesneyi hibir referans gstermiyor durumdadr. te CLR referans sayac 0a dm nesneleri heapten otomatik olarak silmektedir. CLRnin bu ii yapan ksmna kavramsal olarak p toplayc(Garbage Collector) denmektedir. Referans sayac 0a dm olan nesneler p toplayc iin seilebilir durumdadr. Fakat .Net standartlar nesne seilebilir duruma geldikten ne kadar sre sonra p toplaycnn bu nesneyi silecei konusunda bir belirlemede bulunmamtr. Yani nesne seilebilir duruma gelir gelmez silinmek zorunda deildir. Fakat silinmeye aday bir durumdadr. Belli bir sre sonra p toplayc tarafnda silinecektir. yi bir p toplaycdan nesne seilebilir duruma geldikten sonra nesneyi silmesi beklenir. Bazen eitli nedenlerden dolay nesnenin silinmesi gecikebilir. Nesne silinmeden program bile sonlanabilir. Grld gibi stacktaki deikenler programn ak deikenin yaratld bloktan kldnda otomatik olarak yok edilmektedir. Bu yok edilme ok hzl yaplr. Halbuki new operatr ile heapte tahsis edilen nesneler p toplayc tarafndan greceli olarak yava bir biimde silinmektedir. SINIFIN STATIC ELEMANLARI19.07.2007 Perembe

Snfn static veri elemanlar nesne yaratldnda nesnenin ierisinde yer kaplamaz. Bunlarda toplamda tek bir kopya vardr. Snfn static veri elemanlarndan toplamda tek kopya bulunduu iin bunlara referanslarla deil snf isimleri ile eriilmektedir. rnein Sample bir snf ismi c de bunun static bir veri eleman olsun. Eriim Sapmle.c ifadesi ile yaplmaktadr. Snfn static veri elemanlar o snfn trnden nesne yaratlsa da kullanlabilir. rnein: G.. public static void Main() 49

{ Sample.c = 10; System.Console.WriteLine(Sample.c); } SINIFIN STATC OLMAYAN FONKSYONLARI Anmsanaca gibi snfn static fonksiyonlar eer baka bir isim alan ierisindeki snfa ait ise isim alan ismi ve snf ismi belirtilerek, eer ayn isim alanndaki snfa ait ise yalnz snf ismi belirtilerek, eer ayn snfa aitse yalnzca fonksiyon ismi yazlarak eriilir. Snfn static olmayan fonksiyonlar o snf trnden bir referans ile nokta operatr kullanlarak arlr. rnein: r bir snf trnden referans Func ise bu snfn static olmayan bir fonksiyonu olsun. arma r.Func(..) ifadesi ile yaplmaktadr. Snfn static olmayan veri elemanlar static olmayan fonksiyonlar ierisinde dorudan kullanlabilir. Fakat static fonksiyonlar ierisinde dorudan kullanlamazlar. rnein: class Sample { public int a; public static int b; public static void Foo() { a = 10; error } public void Bar() { a = 10; geerli } } Snfn static olmayan bir fonksiyonu arldnda bu fonksiyonun kulland static olmayan veri elemanlar fonksiyon hangi referansla arlmsa o referansn gsterdii yerdeki nesnenin veri elemanlardr. rnein: class Sample { public int a; public int b; public void Func(int x, int y) { a = x b = y 50

} public void Disp() { System.Console.WriteLine(a); System.Console.WriteLine(b); } } (Main snf olabilir) Sample s = new Sample(); s.Func(10,20); s.Disp(); Ekran kts 10,20 Sample k = new Sample(); k.Func(30,40); k.Disp(); Ekran kts 30,40 k = s; k.Disp(); Ekran kts 10,20

Static olmayan fonksiyonun bir referans ile arlmas bu fonksiyon ierisinde kullanlan static olmayan veri elemanlarnn hangi nesnenin veri elemanlar olduunun tespit edilmesi iin gerekmektedir. Static fonksiyonlar ierisinde snfn static olmayan veri elemanlar kullanlmadna gre static fonksiyonlar snf ismi ile arlmas uygun grlmtr. Snfn static olmayan bir fonksiyonu baka bir static olmayan fonksiyonu dorudan arabilir. (Ayn snf iinde). Bu durumda bu armann arlan fonksiyonda hangi referans kullanlmsa o referansla yapld varsaylr. Yani baka bir deyile arlan fonksiyonda aran fonksiyon ile ayn nesnenin veri elemanlarn kullanmaktadr. rnein: namespace CSD { class App { public static void Main() { Sample s = new Sample(); s.Func(10,20); } } class Sample { public int a; public int b; public void Func(int x, int y) { a = x; 51

s.Disp(); gibi } public void Disp() { System.Console.WriteLine(a); System.Console.WriteLine(b); } } } Snfn static olmayan bir fonksiyonu snfn static veri elemanlarn dorudan kullanabilir. Bu durumda static veri elemannn snf ismi ile kullanld varsaylr. Snfn static olmayan fonksiyonu snfn static bir bir fonksiyonunu da dorudan arabilir. Bu durumda armann da snf ismi ile yapld varsaylr. Fakat snfn static olan bir fonksiyonu static olmayan veri elemanlarn dorudan kullanamaz ve static olmayan fonksiyonlarn dorudan aramaz. Yukarda anlatlanlarn zeti yledir: 1- Snfn static olmayan fonksiyonlar, snfn hem static olmayan veri elemanlarn hem de static veri elemanlarn dorudan kullanabilir. 2- Snfn static fonksiyonlar, snfn static olmayan veri elemanlarn dorudan kullanamazlar.Fakat static veri elemanlarn dorudan kullanabilirler. 3- Snfn static olmayan bir fonksiyonu, static olmayan baka bir fonksiyonu ve static olan bir fonksiyonu dorudan arabilir. 4- Snfn static fonksiyonlar, snfn static olmayan fonksiyonlarn dorudan aramaz. Fakat static fonksiyonlarn dorudan arabilir. Yukardaki 4 madde de yle zetlenebilir: 1- Snfn static olmayan fonksiyonlar, snfn static olmayan elemanlarn ve static olan elemanlarn dorudan arabilir. 2- Snfn static kullanabilir. fonksiyonlar, yalnzca snfn static elemanlarn

a = y; Disp();

RASGELE SAYI RETM .Nette rasgele say retmek iin snf kullanlr. Random snfnn static fonksiyonu her arldnda 0 ile n-1 say belirliyoruz. rnein 1 ile 100 yledir: System isim alan ierisindeki Random olmayan int parametreli Next isimli arasnda dzgn dalm rasgele bir arasnda rasgele 10 saynn retimi

52

namespace CSD { class App { public static void Main() { System.Random r = new System.Random(); for(int i = 0; i < 10; ++i) System.Console.WriteLine(r.Next(100)); } } } Snf almas: Bir grupta Ali, Veli, Selami, Aye ve Fatma isminde be kii vardr. Rasgele bir kiinin ismini ekrana yazdran program yaznz. zm: namespace CSD { class App { public static void Main() { System.Random r = new System.Random(); switch(r.Next(5)) { Case 0: System.Console.WriteLine(Ali); Break; Case 1: System.Console.WriteLine(Veli); Break; Case 2: System.Console.WriteLine(Selami); Break; Case 3: System.Console.WriteLine(Aye); Break; Case 4: System.Console.WriteLine(Fatma); Break; } } } } 53

Snf almas: 0 ile 1 arasnda ok sayda rastsal say retiniz. 0 yaz, 1 tura anlamna gelsin. Deney says ok arttrldnda yaz ve tura gelme olaslnn 0,5 yaknsadn gsteriniz. zm: namespace CSD { class App { public static void Main() { System.Random r = new System.Random(); int head = 0, tail = 0; for(int i = 0; i < 1000000; ++i) { if (r.Next(2) == 0) ++tail; else ++head; } System.Console.WriteLine((double)head / 1000000); System.Console.WriteLine((double)tail / 1000000); } } } System.String SINIFI System isim alanndaki String snf yazlarla ilgili faydal ilemler yapmak iin kullanlmaktadr. System.String snf ok fazla kullanld iin bu snf string (kk harfle) anahtar szc ile de temsil edilmitir. Yani System.String demekle string demek tamamen ayn anlamdadr. String snfnn amac yaz tutmaktr. Yaz heapte tahsis edilmi olan nesnenin ierisinde bulunmaktadr. String nesnesi klasik olarak new operatr ile yaratlmaz. C#ta ne zaman ift trnak ierisinde bir yaz yazlsa derleyici bu yazy grdnde heapte kendisi bir string nesnesi tahsis eder ve ift trnak ierisindeki yazy bu nesnenin ierisine yerletirir. ift trnak ifadesi yerine heapte tahsis ettii nesnenin balang adresi yani referans yerletirilir. Yani C#ta ift trnak ifadeleri bir string nesnesi tahsis et, ierisine bu yazy yerletir ve nesnenin referansn elde et anlamna gelmektedir. Heapte yaratlan bu string nesnesi yine p toplayc sistem tarafndan nesne seilebilir duruma geldiinde geldiin de otomatik olarak silinecektir. 54

System isim alanndaki Console snfnn Write ve WriteLine fonksiyonlarna bir string referans verilirse bu fonksiyonlar string nesnesi ierisindeki yazy yazarlar. rnein: public static void Main() { string s; s = Ankara; System.Console.WriteLine(s); }24.07.2007 Sal

ki string referans + operatr ile toplama ilemine sokulabilir. Bu durumda yeni bir string nesnesi yaratlr. Yeni string nesnesinin ierisindeki yaz, iki referansta belirtilen nesnelerin ierisindeki yaznn birleiminden oluturulur. rnein: string a = Ankara; string b = zmir; string c = a + b; System.Console.WriteLine(c) rnein: public static void Main() { string a, b, c, d; a = Ankara; b = zmir; c = Adana; d = a + b + c; System.Console.WriteLine(d) } Ekran kts Ankarazmir

Ekran kts AnkarazmirAdana

Burada nce a + b ilemi yaplacak, bu ilem sonunda yeni bir string nesnesi yaratlacak, sonra yaratlan nesne c string nesnesi ile toplanacaktr. Bu ilem de yeni bir nesnenin yaratlmasna yol aacaktr. a + b ilemi sonucunda yaratlm olan string nesnesi ilemden sonra hemen p toplayc tarafndan seilebilir bir duruma gelecektir. Anahtar Notlar: .Net dnyasnda assembly terimi .exe ve .dll uzantl dosyalar iin kullanlmaktadr. Buradaki assembly teriminin sembolik makine dili anlamna gelen assembly terimi ile bir ilgisi yoktur. C# standartlarna gre ayn assembly ierisindeki tamamen zde karakterlerden olumu stringler iin yeniden yerler tahsis edilmez. Bunlar iin 55

toplamda tek bir nesne tahsis edilir. Bu zde stringlerin hepsi ayn nesneye ilikin referans belirtir. rnein: a = Ankara; b = Ankara; stack a b Bo string kullanmak geerlidir. Bu durumda derleyici yine bir string nesnesi yaratr. Fakat stringin tuttuu bir yaz yoktur. rnein: string a = ; geerli heap Ankara

ki string referans == ve != operatrleri ile karlatrlabilir. Bu durumda referanslarn ayn nesneyi gsterip gstermedii deil referansn gsterdikleri nesnenin iindeki yazlarn ayn olup olmad sorgulanmaktadr. Bir string nesnesinin tuttuu yaznn herhangi bir karakterine [] operatr ile eriebiliriz. S string trnden bir referans olmak zere s[ifade] ifadesi bu referansn gsterdii yerdeki string nesnesinin ilgili indeksteki karakterini belirtir. fade char trdendir. C#ta bir string nesnesi yaratldktan sonra bir daha nesnen tuttuu yaznn herhangi bir karakteri deitirilemez. rnein: string a = Ankara; a[2] = x; error String snfnn Length isimli int trden read only, property eleman, stringin tuttuu yaznn karakter uzunluunu vermektedir. System isim alanndaki Console snfnn ReadLine isimli static fonksiyonu, klavyeden bir yaz girilip enter tuuna baslana kadar bekler. Girilen yazy yaratt bir string nesnesinin ierisine yerletirir. O string nesnesinin referans ile geri dner. Fonksiyonun parametrik yaps yledir(Kaynak MSDN): public static string Readline() rnein: public static void Main() { string s; System.Console.Write(Bir yaz giriniz: ); s = System.Console.ReadLine(); System.Console.WriteLine(s); } 56

String snfnn static olmayan ToLower fonksiyonu, yazy kk harfe dntrmek iin kullanlr. Fonksiyon yeni bir string nesnesi oluturur. Bu string nesnesi ierisine yaznn kk harfe dntrlm biimini yerletirir. rnein: string a = ANKARA; string b; b = a.ToLower(); System.Console.WriteLine(b); Snfn byk harfe dntrme yapan ToUpper fonksiyonu da vardr.(Dntrme ilemi default olarak Windows iletim sistemindeki blgesel ayarlarda belirtilen lkenin diline gre yaplmaktadr) String snfnn Substring isimli static olmayan fonksiyonu nesnenin belirttii yaznn belli bir indeksinden belli bir uzunluk kadarn alp bundan yeni bir string nesnesi yaratarak bu yeni nesnenin referansn geri dnmektedir. Parametrik yaps yledir: public string Substring (int StartIndex , int Length) rnein: public static void Main() { string a = ARI DAI OK YKSEK; string b; b = a.Substring(10 , 3) (kanc karakterden , ka tane System.Console.WriteLine(b); kt : OK } String snfnn static olmayan Insert isimli fonksiyonu nesnenin belirttii yaznn belli bir indeksine yeni bir yaz ekler. Tabi string nesnesinin karakterleri zerinde deiiklik yaplamayacana gre fonksiyon yeni bir string nesnesi yaratp onunla geri dnmektedir. Fonksiyonun parametrik yaps yledir: public string Insert (int StartIndex , string value) rnein: public static void Main() { string a = Bugn hava scak; string b; b = a.Insert(10 ,ok); (kanc karakterden , ka tane karakter)karakter)

57

System.Console.WriteLine(b); }

kt : Bugn hava ok scak

Eer indeks deeri yaz uzunluundan bykse exception oluur. String snfnn Trim isimli fonksiyonu yaznn bandaki ve sonundaki boluk karakterlerinin atlmasnda kullanlr. Daha nce de belirtildii gibi switch parantezi ierisinde ve case ifadelerinde string kullanlabilir. String snfnn static olmayan Remove isimli fonksiyonu, nesnenin belirttii yaznn belirli bir indeksinden itibaren belirli bir miktar karakteri silerek, bu karakterler silinmi yeni bir string nesnesinin referans ile geri dner. Parametrik yaps yledir: public string Remove (int StartIndex , int Count) rnein: string s= EskiehirHisar; string 0 result; result = s.Remove(4 , 5); System.Console.WriteLine(result) kt : EskiHisar

Stringler tek satr zerinde yazlmak zorundadr. rnein: string s; s = Bugn hava ok scak; geersiz

Eer yaz ok uzunsa + operatr kullanlarak byle bir blme yaplabilir. rnein: string s; s = Bugn hava + ok scak; geerli

ift trnak ierisinde ters bl karakterleri kullanlabilir. Bunlar tekbir karakter belirtmektedir. rnein: string = Ali\tVeli; \t karakteri ierisinde tab anlamnda

Eer bir stringin banda bitiik bir biimde @ karakteri varsa byle stringlere dayankl (verbatim) stringler denir. rnein: @Ankara; Dayankl string 58

Dayankl stringler birden fazla satra blnebilir. Dayankl stringler ierisindeki ters bl karakterleri zel anlam ifade etmez. Normal ters bl karakteri olarak ele alnr. rnein: string path = c:\\windows\\temp; ifadesi ile string path : @c:\windows\temp; ifadesi ayn anlamdadr. String snfnn static Compare isimli fonksiyonu iki yazy karlatrmada kullanlmaktadr. Parametrik yaps yledir: public static int Compare (string StrA , string StrB) Fonksiyon 1. yaz 2. yazdan bykse pozitif herhangi bir deere, 2. yaz 1. yazdan bykse negatif bir deere, yazlar eitse sfra geri dner. rnein: string a , b; System.Console.Write(ki yaz giriniz: ); a = System.Console.ReadLine(); b = System.Console.ReadLine(); int result; result = string.Compare(a , b); if(result > 0) System.Console.Write(a > b); else if(result < 0) System.Console.Write(a < b); else System.Console.Write(a = b);

SM ALANLARI26.07.2007 Perembe

sim alan bildirimi yle yaplr: namespace < isim alan ismi > { // } sim alanlar i ie yada ayrk bir biimde bildirilebilir. rnein: namespace A { namespace B { 59

// } } namespace C { // } Hibir isim alan ierisinde olmayan blgeye global isim alan denmektedir. Bir snf, herhangi bir isim alan ierisinde yada global isim alannda tanmlanabilir. ie isim alanlar araya nokta konularak tek hamlede bildirilebilir. rnein: namespace A.B { // } ile namespace A.B { namespace A.B { // } }

Yukardaki iki ifade tamamen ayn ifadelerdir. sim alanlar paral bir biimde bildirilebilir. Baka bir deyile bir isim alannn ikinci kez bildirilmesi ncekine ekleme yapld anlamna gelmektedir. rnein: namespace A { class x { // } } namespace A { class y { // } }

Yukarda A isim alan ierisinde hem x hem de y vardr. Farkl isim alanlarnn ierisinde ayn isimli trler bulunabilir.Fakat ayn isim alan ierisinde ayn isimli birden fazla tr bulunamaz. .Netin tm snflar System isim alan ierisinde yada System isim alan ierisindeki isim alanlarnn ierisinde bulunmaktadr. Programcnn bu isim alanna baka bir eleman yerletirmesi tavsiye edilmez. DNAMK KTPHANELERN KULLANIMI Uzants .dll biiminde olan dosyalara dinamik ktphane dosyalar denmektedir. .Net ortamnda bamsz olarak yklenebilen .exe ve .dll uzantl dosyalara assembly denmektedir. Teknik anlamda .exe ve .dll dosyalara arasnda bir format farkll yoktur. 60

Anahtar Notlar: .exe ve .dll dosyalar doal kod yad arakod ierebilir. Baka bir deyile bu dosyalarn yalnzca ismine bakarak bunlarn .Net ortam iin yazlp yazlmadn anlayamayz. Eer bir .exe yada .dll .Net ortamnda kullanlan bir assembly dosyas ise PE format bakmndan ek baz sectionlara sahiptir. rnein; Bir .Net .exe yada .dll dosyasnda assembly manifest ve meta data sectionlar vardr. Bir exe dosyas altrlmak istediinde iletim sistemi PE formatn inceleyerek bunun bir .Net program olup olmadna bakar. Eer bunun bir .Net ortamnda oluturulmu exe ise arakod iermektedir ve CLR tarafndan altrlr. Deilse doal yolla altrlr. dll dosyalar ktphane amal kullanlmaktadr. Yani bunlarn ierisinde snflar vardr. Programc bu snflar kendi yazm gibi kullanabilir. rnein; br x firmas bir grup yaral snf yazm olsun bizde bu snflar kullanmak istiyoruz. Firma bu snflar bir .dll ierisine yerletirir ve bize dll olarak verir. phesiz dll ierisindeki bu snflar derlenmi bir biimde bulunmaktadr. .Netin kendi snflar da fiziksel olarak dll dosyalar ierisindedir. phesiz bir dllnin ierisinde tek bir isim alanna ilikin snflar bulunmak zorunda deildir. Bir dllnin ierisinde ok farkl isim alanlar bulunabilir. Yani isim alan kavram ile dll kavram arasnda bir balant yoktur. DLL DOSYALARININ OLUTURULMASI Csc komut satr derleyicisinde dll oluturmak iin /target:library seenei kullanlmaldr. (/target yerine /t de kullanlabilir.) rnein: csc /target:library test.cs Aslnda /target seeneinde 4 belirleme yaplabilmektedir: 1- /target:exe Anahtar Notlar: Bir exe dosya y bir konsol yada bir GUI uygulamasdr. Konsol uygulamas, iletim sistemi program altrrken eer komut satrnda deilsek konsol ekran denilen siyah ekran aar. Fakat GUI uygulamalarnda bu tr siyah ekran bulunmamaktadr. /target:exe seenei default durumdadr. Yani /target seenei hi belirtilmezse konsol exesi yaratlr. 2- /target:winexe Bu seenek GUI exe dosyas oluturmaktadr. Yani byle bir exe altrldnda konsol ekran gzkmez. 3- /target:library dll doyas oluturmak iin kullanlr. 61 Bu seenek bir konsol exe oluturmaktadr.

4- /target:module

Modl dosyas oluturmak iin kullanlr.

IDE kullanarak dll yapmak iin bo bir proje yaratlr. Sonra proje properties mensne gelinir. Output Types blmnden Class Library olarak seilir. Bu durumda exe yerine dll oluturulur. DLL DOSYALARININ KULLANILMASI Bir dll dosyasn kullanmak iin onu referans etmek gerekir. Referans etme ilemi komut satrnda /reference:dll dosya ismi seenei ile yaplabilir. /reference yerine /r de kullanlabilir. rnein: csc /r:test.dll Sample.cs Burada Sample.cs derlenerek Sample.exe yaplmak istenmitir. Program ierisinde test.dll de bulunan bir takm snflar kullanld iin test.dllye de referans edilmitir. phesiz birden fazla dll ye referans edilebilir. rnein: csc /r:a.dll /r:b.dll /t:winexe Sample.cs Burada programc Sample.cs ierisinde hem a.dll hem de b.dll ierisindeki snflar kullanmtr. Bu nedenle bu dll dosyalarn referans etmitir. Buradan rn olarak bir GUI exe elde edilecektir. Derleme ilemi srasnda referans edilen dlllerin ayrca programn alma zamannda da exe dosyas ile ayn klasrde bulundurulmas gerekir. Bir exe dosya altrlrken o exe dosyann referans ettii dlller de alma srasnda btnsel bir biimde yklenmektedir. Yani bizim yazdmz program baka bir makineye kuracaksak exe ile birlikte o exenin referans ettii dllleri de o makineya gtrmemiz gerekir. IDE den bir dllye referans edebilmek iin Solution Explorerde References zerine gelinir. Farenin sa tuuna baslr ve Add Reference seilir. Add Reference dialog penceresinde Browse tabna geilir ve dllnin yeri bulunarak ekleme yaplr. BU biimde referans etme ilemi yapldnda IDE referans edilen dllyi zaten exeyi oluturaca klasre kopyalamaktadr. Snf almas: IDE kullanlarak bir dll dosyas oluturunuz. dllye bir tane snf ve bir static fonksiyon yerletiriniz. Sonra bir exe projesi oluturarak bu dllyi referans edip sz konusu snf ve fonksiyonu kullannz. zm: dll projesi namespace CSD { public class Sample { public static void Func() { System.Console.WriteLine(Ben dll dosyasym); } 62

} } exe projesi namespace CSD { class App { public static void Main() { Sample.Func(); referans } } }

yaplyor.

Bir snf bildiriminin nne public yada internal belirleyicilerinde bir getirilebilir. Eer hibir belirleyici kullanlmamsa internal belirleyicisi kullanlm gibi varsaylr. Public belirleyicisi snfn baka bir assemblyden (rnein bir exeden) kullanlabileceini belirtmektedir. Halbuki internal snflar yalnzca assembly iinde kullanlabilir. zetle bir dll ierisindeki snfn darda kullanlabilmesi iin snfn public belirleyicisi ile belirtilmesi gerekir. .NETN SINIFLARINA LKN DLL DOSYALARI .Netin kendi snflar da eitli dll dosyalar ierisine yerletirilmitir. Yani programcnn bu snflar kullanabilmesi iin o snflar hangi dlller ierisinde ise o dllye referans etmesi gerekir. .Netin bu dllleri frameworkun bir paras kabul edilir ve framework kurulumu yaplrken kurulum srasnda hedef makineye ekilmektedir. Bu dlller Global Assembly Cache ierisindedir. Bu nedenle exe ile ayn klasrde olmak zorunda deildir. Csc derleyicisi hi belirtilmese bile mscorlip.dll isimli dllye zaten otomatik referans etmektedir. .Netin eitli isim alanlarndaki en ok kullanlan snflar mscorlip.dll ierisindedir. Bu durumda bir .Net snf eer mscorlip.dll ierisinde ise onu kullanmak iin bir referans ilemine gerek yoktur. Fakat mscorlip.dll ierisinde olmayan snflarn hangi dll ierisinde bulunduu belirlenmeli ve o dllye referans edilmelidir. Bir .Net snf kullanlacaksa 2 eyin bilinmesi gerekir: 1- Snf hangi dll dosyas ierisindedir? 2- Snf hangi isim alan ierisindedir? SM ARAMA LEM Bir deikenin kullanldn gren derleyici o deikene ilikin bildirimi belirlemeye alr. Bu belirleme srasnda deikenin bildirimini eitli faaliyet alanlarnda arar. Eer deiken bildirimi ile karlarsa arama ilemini 63

durdurur, eer deikenin bildirimi ile hi karlamazsa ilem error ile sonlanr. Bu ileme isim aramas(name look up) denmektedir. sim aramas her trl isme uygulanmaktadr. rnein yerel deiken isimleri, snf isimleri, isim alan isimleri bu arama ilemine sokulmaktadr. sim arama ilemi 2 ye ayrlr: 1- Niteliksiz sim Arama: . operatr kullanlmadan dorudan yazlm isimlerin aranmasna denilmektedir. 2- Nitelikli sim Arama: . operatrnn sanda isimlerin aranmasna denilmektedir. rnein; X.Y ileminde X niteliksiz olarak Yde nitelikli olarak aranmaktadr. Niteliksiz sim Aramas: Nokta operatr kullanlmadan dorudan yazlan isimler iin niteliksiz arama kurallar uygulanr. Niteliksiz arama ilemi u admlarla gerekletirilir: 123Derleyici ismin kullanld yerden yukarya doru alan ierisinde fonksiyonun yerel bloklarnda ismin bildirimini arar. sim snf bildiriminin her yerinde aranr. sim kullanld snfn iinde, bulunduu isim alannn her yerinde aranr.

Anahtar Notlar Sample s; gibi bir bildirim ileminde s isimi bildirilmektedir. Bu nedenle bu isim aranmaz. Fakat Sample ismi niteliksiz arama ilemine sokulacaktr. 4sim kullanld snfn iinde, bulunduu isim alanlarnda iten da doru bu isim alanlarnn her yerinde aranr. rnein; farkl isim alanlarnda ayn isimli snflar bulunabilir. Eer kapsayan ve kapsanan isim alanlarnda ayn isimli snflar varsa arama iten da doru yapldndan iteki isim alanndaki snf bulunur. sim nihayet global isim alann her yerinde aranr.

5-

Nitelikli sim Aramas: Nokta operatrnn sandaki isimlerin aranmasnda nitelikli isim arama kurallar uygulanr. Nokta operatrnn sol tarafndaki operand bir isim alan ismi, tr ismi ya da bir snf trnden deiken olabilir. 1- Nokta operatrnn solundaki isim bir isim alan ismi ise sandaki isim yalnzca o isim alannn her yerinde aranr. Kapsayan isim alanlarnda aranmaz. 2- Nokta operatrnn solunda bir snf ya da yap ismi varsa sandaki isim o snf ya da yap bildiriminin her yerinde aranr. Fakat Kapsayan isim alanlarnda aranmaz.

64

3- Nokta operatrnn solunda bir snf trnden referans ya da bir yap deikeni varsa sandaki isim o referansn ya da deikenin ilikin olduu snf ya da yap bildiriminin her yerinde aranr. Kapsayan isim alanlarna baklmaz. A.B.C gibi birden fazla . operatr ile bir isim belirtilmi olsun. Bu durumda A niteliksiz olarak aranr, B ve C nitelikli olarak aranr. (Yani kabaca nce Ann bulunmas gerekir. B A ierisinde Cde A.B ierisinde aranr) sim arams karlalan her isim iin yaplmaktadr. rnein: Sample s = new Sample(); Burada s bildirilmitir aranmayacaktr. Fakat iki Sample ismi niteliksiz olarak aranacaktr. namespace A { namespace B { class App { public static void Main() { Sample s = new Sample(); s.Func(); } } } } namespace A { namespace B { class Sample { public void Func() { // } } } } Referans edilen dlller ierisindeki bildirilmi isimler sanki programc kendisi yazm gibi arama ilemine sokulmaktadr. rnein; System.Console.WriteLine gibi bir isim alan kullanlm olsun. Burada System niteliksiz olarak aranacaktr. Fakat bu arama ilemi yalnzca kaynak kod la deil referans edilmi olan dlllerle de yaplacaktr. System isim alan en azndan mscorlib.dll ierisinde bulunacaktr. 65

Framework 1.1aadaki gibi bir durumda yaplacak bir ey yoktu: namespace CSD { namespace System { class App { public static void Main() { System.Console.WriteLine(Test); } } } }

error

Buradaki System isim alan .Netin global isim alan altndaki System isim alan deildir. Anahtar Notlar Anmsanaca gibi bir isim alannn iki kez bildirimi yapldnda bu durum ekleme anlamna gelmektedir. Farkl isim alanlarnn altnda bulunan ayn isimli isim alanlar gerekte farkl isim alanlardr.rnein: namespace A { namespace x { // } } namespace B { namespace x { // } } Burada x isim alanlar birletirilmez. nk ayn isim alan deildir. rneimizde System isim alan niteliksiz olarak arandn da CSDnin altndaki isim alan olarak bulunacaktr. Bundan sonra artk Console ismi CSDnin System isim alannda bulunacandan bulunamayacaktr. Framework 2.0da bu sorun yeni eklenen global:: operatr ile zlmtr. global:: operatrnn sandaki isimler yalnzca global isim alannda aranmaktadr. O halde sorun yle zlebilir:

66

namespace CSD { namespace System { class App { public static void Main() { global::System.Console.WriteLine(Test); } } } }

using DREKTF using direktifi nokta operatr ile nitelendirme ilemini kolaylatrmak iin dnlmtr. using direktifinin genel biimi yledir: using < isim alan ismi > rnein: using A; using X.Y; using direktifi isim alanlarnn bana yerletirilmek zorundadr. Baka bir deyile using direktiflerinden nce baka bildirimler bulunamaz. rnein: namespace CSD { using A; using B; class x; { // } using C; } Using direktifi global isim alanna da yerletirilebilir. Global isim alannn ba kaynak dosyann tepesidir. Using direktifinde bir direktifin yerletirildii isim alan, bir de direktifte belirtilen isim alan vardr. rnein

doru kullanm doru kullanm

yanl kullanm

namespace CSD { 67

using System; // } Burada direktifin yerletirildii isim alan CSD, direktifte belirtilen isim alan System isim alandr. Direktifte belirtilen isim alan nokta operatryle kombine edilmi olabilir. Bu durumda direktifte belirtilen isim alannn bulunmas iin yine daha nce grlen isim arama kurallar uygulanr. rnein: namespace CSD { using A.B.C; // } Burada belirtilen isim alan A.B ierisindeki C isim alandr. Niteliksiz isim arama srasnda isim using direktifinin yerletirildii isim alannda bulunamasayd, isim using direktifi ile belirtilen isim alanlarnda da aranr. rnein; Console ismi niteliksiz aranrken CSD isim alannda bulunamayacaktr. Bu durumda direktifte belirtilen System isim alanna da baklacaktr ve orada bulunacaktr. rnein. namespace CSD { using System; // Console.WriteLine(Test); } sim using direktifinde belirtilen isim alannda arandktan sonra baka bir isim alanna baklmaz. Yani kapsayan isim alanlarna baklmaz. rnein: namespace CSD { using B; // X a; } namespace A { class X { // } namespace B; { 68 X bulunamaz

// } } X ismi A.Bde aranmayacaktr. aranacaktr. Fakat kapsayan isim alan olan Ada

Using direktifi geili deildir. Yani isim using direktifi ile belirtilen isim alannda bulunamadnda o isim alanna yerletirilmi using direktifleri dikkate alnmaz. rnein: namespace CSD { using B; X a; X bulunamayacaktr. } namespace A { class X { // } } namespace B { using A; // } Using direktifi, isim direktifinin yerletirildii isim alannda bulunamazsa etkili olmaktadr. sim bulunursa using direktifi de dikkate alnmaz. rnein: namespace CSD { using A; // X a; X CSD isim alannda bulunmutur. class X; { // } } namespace A { class X { // } }

69

sim using direktiflerinin yerletirildii isim alannda bulunamam olsun. Fakat ismin birden fazla using direktifinde belirtilen isim alannda belirtilen isim alannda bulunduunu varsayalm. Bu durum error oluturur. rnein: namespace CSD { using A; using B; X a; error hem A hem de Bde bulunuyor } Yukarda biz hem A firmasnn hem de B firmasnn yazm olduu snflar kullanmak istiyoruz. A firmas snflarn A isim alannda, B firmas da B isim alannda bildirmi olsun. Burada gereksiz niteliklendirmeyi engellemek iin hem A hem de B isim alanlarna using direktifi uygulanmtr. Fakat grld gibi tesadfen X ismi her iki isim alannda da bulunmaktadr. te bu tr durumlarda artk X isminin A.X ya da B.X biiminde nitelikli olarak kullanlmas gerekir. Grld gibi isim alanlar ierisindeki isimler akmadktan sonra using direktifi kolaylk salamaktadr. Fakat akma sz konusu ise nitelendirme yaplmak zorundadr. Using direktifi nitelikli aramalarda etkili olmaz. rnein: namespace CSD { // A.X c; // } namespace A { using B; // } namespace B { class X { // } } Bir isim using direktifinin yerletirildii isim alannda bulunamam olsun. Eer isim using direktifi ile belirtilen isim alannda bir isim alan ismi olarak bulunursa bu bulma ilemi dikkate alnmamaktadr. Baka bir deyile isim 70 namespace A; { class X { // } } namespace B; { class X { // } }

X nitelikli arand iin A ierisindeki using direktifi dikkate alnmaz.

using direktifinde belirtilen isim alannda aranrken o isim alanndaki isim alan isimleri dikkate alnmamaktadr. rnein: namespace CSD { using A; // B.X k; // } namespace A { namespace B; { class X { // } } } Burada sorunu zmek iin A.B isim alanna using direktifi uygunmaldr: namespace CSD { using A.B; // X k; geerli // } namespace A { namespace B; { class X { // } } } Burada artk X ismi A.B ierisinde bir snf ismi olduu iin bulunacaktr. Bu kuraldan dolay C# programlarnda aadaki gibi bir using merdiveni ile karlalr: using System; using System.Windows; using System.Windows.Forms;

error B ismi Ann ierisinde bir isim alan ismi olduu iin bulunamayacak

71

Bundan sonra mmkn olduunca using direktifi kullanlarak rneklerde daha az nitelendirme yaplacaktr. DZLER [Arrays] Birden fazla deikenin (datann) oluturduu toplulua veri yaps denilmektedir. rnein; tek bana int trden a veri yaps deildir. Oysa bir snf bir veri yapsdr. nk snf denildiinde bir grup eleman anlalmaktadr. Elemanlar ayn trden olan ve bir index yardmyla eriilebilen veri yaplarna dizi(array) denilmektedir. C# ta T tr iin T[] ile temsil edilen bir dizi tr vardr. rnein: int a; int [] b; Burada a int trdendir, b ise int trden bir dizidir. bnin tr int[] ile belirtilir. C# ta diziler kategori olarak referans trlerine ilikindir. rnein: int [] a; Burada a yalnzca bir referanstr. Dizi nesnesi henz tahsis edilmemitir. C# ta diziler bir eit snftr. Dizi elemanlar da bu snf nesnesinin ierisinde kabul edilmektedir. Dizi nesneleri tpk snf nesnelerinde olduu gibi new operatr ile heap ta tahsis edilir. New operatr ile dizi tahsis etmenin genel biimi yledir: new < tr > < [uzunluk] > rnein: int [] a; a = new int [10]; Bu ilemin sonucunda heap ta bir dizi nesnesi yaratlmtr. Bu dizi nesnesi 10 tane int tutmaktadr. Dizile new operatr ile yaratlrken [] ierisine uzunluk ifadesinin tamsay trlerine ilikin olmas zorunludur. Bu uzunluk ifadesi sabit ifadesi olmak zorunda deildir. rnein: // int [] a; int size; size = int.Parse(Console.ReadLine()); a = new int [size * 2]; // 72

Ayn trden iki dizi referans birbirine atanabilir. Bu durumda tpk snflarda olduu gibi iki referansta ayn nesneyi gsterir durumdadr. rnein: int [] a = new int [10]; int [] b; b b = a; r, T trnden bir dizi referans olmak zere r[ifade] ifadesi referansnn gsterdii yerdeki dizi nesnesinin ifade ile belirtilen indexteki elemann temsil eder. Dizinin ilk eleman 0. indexteki elemandr. Bu durumda n elemanl bir dizinin son eleman n-1. indexteki elemandr. Dizinin her eleman bamsz bir deiken gibi kullanlabilir. Dizinin en nemli kullanm nedeni bir dng ierisinde bir indis yardmyla dizinin tm elemanlarnn gzden geirilebilmesidir. rnein: int [] a = new int [10]; // for (int i = 0; i < 10; ++i) a[i] = i; r T[] trnden bir dizi referans olsun. Bu durumda r[ifade] trndendir. using System; namespace CSD { class App { public static void Main() { int [] a = new int[100]; for (int i = 0; i < 100; ++i) a[i] = i; int [] b = a; for (int i = 0; i < 100; ++i) Console.WriteLine(b[i]); } } } ki dizi referansnn birbirine atanabilmesi iin trlerinin tamamen ayn olmas gerekmektedir. rnein; int trnn long trne dorudan atabilmesi, 73 T a

int trden bir dizi referansnn long trnden bir dizi referansna atanaca anlamna gelmez. Dizi elemanlarna eriirken [] ierisindeki ifade tamsay trlerine ilikin olmak zorundadr. Bir dizinin pozitif ya da negatif bakmdan olmayan bir elemanna erimeye almak exception olumasna neden olmaktadr. Anahtar Notlar Exception, program hatasz olarak derlendikten sonra alma zaman srasnda oluan bir hatadr. Yani exception derleme zamanna deil alma zamanna ait bir deyimdir. Her dizinin Lenght isimli int trden bir property eleman vardr. Bu property eleman dizinin uzunluunu belirtmektedir. Yani biz r bir dizi referans olmak zere r.Lenght ifadesi ile bu dizinin uzunluunu bulabiliriz. Lenght property eleman read only bir elemandr. Yani bu eleman kullanabiliriz. Fakat bir deer atamamayz. i < 100 ifadesi ile i < a.Lenght ayn trdendir.

DZLERN FONKSYONLARA PARAMETRE OLARAK AKTARILMASI Bir diziyi fonksiyona geirmek olduka kolaydr. Fonksiyonun parametre deikeni dizi trnden referans olur. Fonksiyon da ayn trden bir dizi referans ile arlr. rnein: using System; namespace CSD { class App { public static void Main() { int [] a = new int[100]; for (int i = 0; i < a.Lenght; ++i) a[i] = i; Disp(a); } public static void Disp(int[] r) { for (int i = 0; i < r.Lenght; ++i) Console.WriteLine(r[i]); } } } C# ta bir dizi nesnesi new operatr ile yaratldnda new operatr nesneyi yarattktan sonra dizinin tm elemanlarn sfrlamaktadr. Eer dizi bir 74

referans dizisi ise sfrlama dizinin her elemanna null deerinin atanmas anlamna gelmektedir. Bylece dizi yaratldktan sonra elemanlarna bir deer atanmam olsa bile elemanlarn ierisinde 0 deer olacaktr. new operatr ile bir dizi nesnesi yaratlrken dizi elemanlarna ayn zamanda ilk deer verilebilir. []den sonra hemen kme parantezi alarak ilk deerler belirtilir. rnein: int [] a; a = new int [5] {1, 2, 3, 4, 5,}; Bir diziye new operatr ile ilk deer verilirken {} ierisindeki dizi uzunluunun sabit ifadesi olmas zorunludur. Ayn zamanda verilen ilk deerlerin tam olarak belirtilen uzunluk kadar olmas gerekir. rnein: a = new int[size] {1, 2, 3}; error Yukarda diziye ilk deer verilmitir. Fakat uzunluk sabit ifadesi eklinde verilmemitir. Fakat rnein: a = new int[1 + 1 + 1] {1, 2, 3}; geerli Yukarda ilk deer verme ilemi geerlidir. a = new int[5] {1, 2, 3}; error Yukarda verilen ilk deerle dizi uzunluu uyumamaktadr. Diziye ilk deer verilirken [] parantezlerinin ii bo braklabilir. Bu durumda derleyici verilen ilk deerleri sayar ve sanki [] parantez ierisine o deer yazlm gibi ilem yapar. rnein: a = new int[] {1, 2, 3, 4, 5}; bo Bu ilem tamamen aadaki ile edeerdir. a = new int[5] {1, 2, 3, 4, 5}; geerli

75

C# ta diziye ilk deer verilirken [] ierisine ilk deerler sabit ifadesi ile oluturulmak zorunda deildir. rnein: int x = 1; int [] a; a = new int [] {x, x + 1, x + 2, x + 3}; geerli Bir dizi referans [] ierisinde bir deer listesi ile ilk deer verilerek tanmlanabilir. rnein: int [] a = {1, 2, 3}; geerli

Fakat phesiz ayn ilem ilk deer verme haricinde geerli deildir. rnein: int [] a; a = {1, 2, 3}; error

Dizi referansna bu biimde ilk deer verildii zaman derleyici verilen ilk deerleri sayar ve new operatrn kendisi uygulayarak dizi nesnesini bu uzunlukta yaratr. Bu ilk deerleri de dizi elemanlarna yerletirir. Yani: int [] a = {1, 2, 3}; ile int [] a = new int[3] {1, 2, 3}; tamamen edeerdir. Grld gibi bu biimde ilk deer verme tamamen kolaylk salama amac ile dnlmtr. Yoksa yine new ilemi uygulanmaktadr. Fonksiyonun geri dn deeri bir dizi trnden olabilir. BU durumda geri dn deerinin ayn trden bir dizi referansna atanmas gerekir. rnein: // public static void Main() { int [] r; r = Func(); for (int i = 0; i < r.Lenght; ++i) Console.WriteLine(r[i]); } public static int[] Func() { int [] a = new int [] {1, 2, 3, 4, 5}; return a; } //

76

imdiye kadar verdiimiz rneklerde hep temel trlere ilikin diziler oluturduk. Halbuki referans trlerine ilikin diziler de olabilir. rnein; x bir snf olmak zere x [] a = new x [10] ilemi ile 10 elemanl x trnden bir referans dizisi oluturulmutur. Yani burada dizinin 10 eleman da bir referanstr ve henz bunlar iin bir tahsisat yaplmamtr. Sample bir snf olmak zere aada yeni bir dizi yaratm olalm: Sample [] a; a = new Sample [10]; Burada dizi elemanlar olan a[i] ler Sample trndendir. Yani a[i] ler aslnda birer referanstr. Bir dizi yaratldnda dizi temel trlere ilikinse tm elemanlarnn ierisinde 0, referans trlerine ilikinse null deeri bulunur. Referans dizisini tahsis ettikten sonra bu referanslar iin gerek nesnelerin de tahsis edilmesi gerekir. Sample [] a; a = new Sample [10]; for (int i = 0; i < a.Lenght; ++i) a[i] = new Sample; Bu durum aadaki gibi gsterilebilir: a a[0] a[1] a[2] a[3] a[4] Sample trnden nesne

phesiz bir referans dizisi de new operatr ile yaratlrken ilk deer verilebilir. Bu durumda verilen ilk deerlerin ayn trden snf referanslar olmas gerekir. rnein: Sample [] a; a = new Sample [] {new Sample(), new Sample(),new Sample()}; string bir snf olduuna gre ve iki trnak ifadeleri iin string nesneleri derleyici tarafndan yaratldna gre aadaki gibi bir string dizisi oluturabiliriz: string [] a; a = new string [] {Ali, Veli, Selami, Aye, Fatma}; 77

Durum ekilsel olarak yle gsterilebilir: a a[0] a[1] a[2] a[3] a[4] Ali VeliSelami

Aye Fatma

public static void Main() { string [] a; a = new string [] {Ali, Veli, Selami, Aye, Fatma}; for (int i = 0; i < a.Lenght; ++i) Console.WriteLine(a[i]); } public static void Main() { string [] names; names = GetNames(); for (int i = 0; i < names.Lenght; ++i) Console.WriteLine(names[i]); } public static string [] GetNames() { return new string [] {Ali, Veli, Selami, Aye, Fatma}; } System.IO isim alanndaki Directory isimli snfn static GetFiles fonksiyonunun parametrik yaps yledir: public static string [] GetFiles {string path}; Directory snf mscorlip.dll ierisinde olduu iin bir dll referans etmeye gerek yoktur. GetFiles fonksiyonu bir klasrn yol ifadesini referans olarak alr