C# E Kitap Downloadx

Embed Size (px)

Citation preview

Her Ynyle ilk C# Programmz

Her Ynyle ilk C# ProgrammzC# dili ortaya kal daha hi birey yapmayan varsa ya da bireyler yapp da ne yaptndan emin olmayan varsa ite bu yaz tam size gre. Bu yazmzda klasik Merhaba Dnya programmz yazacaz.Ama programmz yazarken her eyi adm adm reneceiz. Unutmayn amacmz burada Merhaba Dnya yazmak deil. :) O halde aadaki program iyice inceleyin nce, yle bir szn program yukardan aaya, fazla detaylara inmeden yazmz okumaya devam edin;

//dosya ad : Merhaba.cs

using System;namespace MerhabaDunya{class Snf1{static void Main(string args[]){Console.WriteLine("Merhaba Dnya");}}}

Yukardaki ilk programmz incelediinize gre aklamalarmza geebiliriz. Eer nceden C++ ve Java ile ilgilenmi arkadalar varsa yukardaki kodlar tandk gelebilir. Nitekim, her ne kadarMicrosoft firmas ilk balarda bunu kabul etmese de C# dili Java ve C++ dillerinin harmanlanmasndan olumu bir dildir. Bugn bunu kabul etmeyen yoktur sanrm.

Yukardaki ilk programmzn kodunu ben Notepad ile yazdm. Ama kodu derleyip altrmak iin bir C# derleyicisine ihtiyacmz olacak. C# derleyicisi Visual Studio.NET ile kurulabilecei gibi www.microsoft.com web sitesinden .NET Framework yazlmn indirerek de kurulabilir. Eer Visual Studio ortamnda alyorsanz yukardaki kodlar Visual Studio .NET ' in sunduu hazr proje ablonlarndan rahatlkla oluturabilirsiniz. Visual Studio programn altrdktan sonra Project->New mensnden dil olarak Visual C# ve proje ablonu olarak da "Console Application" seerseniz, main ilevi iindeki kodlar dndaki yap otomatikmen oluturulacaktr.Eer .NET Framework yapsn kurduysanz Console Ekranndan C# derleyicisini altrmalsnz. Komut ekrann yazarak kaynak kodumuzu derleyebilirsiniz.

imdi kodlarmz inceleyelim. lk satrdaki ifadesi System adl bir isim alannn kullanlacan belirtiyor.Peki nedir bu isim alan(Namespace).simalan kavram son yllarda program modllerinin ok sayda artmasndan dolay popler hale gelmitir. Kolay ve hzl programlama yapmamz salayan bir takm hazr ktphaneler her ne kadar iimizi kolaylatrsa da eer isimalanlar olmasayd kullanacamz her ktphane bizim iin iin iinden klmaz bir hale gelebilirdi. Dnn ki iki ayr firma iki ayr snf ktphaneleri oluturdu ve bu ktphanelerin iinde ayn isimli birden ok snf yaps var. Eer biz programc olarak iki firmann da ktphanesini kullanmak istiyorsak her ikisini ayn kod iinde kullanamayz. nk ayn isimli snflar derleme aamasnda hata verecektir. Bu durumda yaplmas gereken tek ey ya da en etkili yntem isimalanlarn kullanmaktr. Yani bir snfa(class) ulaabilmek iin onun isim alanyla armak. sim alanlar hiyerarik yapda olabilir. Mesela System isim alannn altnda baka bir isim alan onun altnda bakalar vs. te .NET isimalan(namespace) hiyerarisinin en tepesinde bulunan isim alan System adl isimalandr. En temel ilemlerimiz iin bile bu isim alann kullanmalyz. Aksi halde programmz almayacaktr. simalanlarn kullanmak iin isimalannn bana using szc getirilir.

Soru: System isim alannn iinde Data isimalannda bulunan bir cs adl snf kullanabilmek iin kaynak kodumuza ne eklememiz gerekir.

Cevap : Kaynak kodumuzun en bana aadaki ifadeyi yazmamz gerekir.

using System.Data;

Bildiiniz gibi C# dili %100 nesne tabanl bir dildir. Yaptmz herey bir snf nesnesidir C# dilinde. Nesne olmayan hibirey yoktur. C++ dilindeki main ilevini hatrlarsnz ounuz. Programmz c++ dilinde main ilevinden balar ama main ilevi hi bir zaman bir snf iinde olmamtr.C# dilinde herey snflarla temsil edildii iin main ilevi de bizim belirlediimiz bir snfn ilevi olmak zorundadr. Yukardaki programmzda ifadesi ile programmzda bir snf nesnesi oluturuyoruz. Snf1 snfnn bir ilevi olan main'in elbette eskiden de olduu gibi zel bir anlam vardr. Biliyorsunuz ki derleyiciler programn nerden alacan bilmek isterler, aksi halde derleme ileminden sonra "programnz iin balama noktas bulunamad" hatas alrz. Bu yzden main ilevi bizim iin eskiden de olduu gibi programmzn balang noktasdr. Yani biz programda yapmak istediklerimizi main ilevi iinde gerekletireceiz. Snf tanmlamalarmz ise istediimiz noktada yapabiliriz. Daha ncede dediimiz gibi isimalanlar birok snfn veya tek bir snfn oluturduu kmedir. Bizim ana programmz da bir snf olduuna gre Class1 snfn istediimiz isimli bir isimalanna sokabiliriz. Yukarda yazarak isimalann balatyoruz.

imdi main ilevinin iine bakalm, System isimalannda bulunan Console snfnn bir metodu olan WriteLine() ile ekrana bir string ifadesi yazdryoruz. Biz burda iki trnak ifadesi iinde yazmz belirtmemize ramen fonksiyonun kullanm bununla snrl deildir. C# dilindeki fonksiyon ar ykleme (function overloading)kullanlarak fonksiyonu birok parametrik yapda kullanabilmemiz salanmtr. Fonksiyon ar ykleme konusuna bundan sonraki yazlarmzda deineceimizi belirtelim. WriteLine() ilevinin adndan da anlalaca gibi ekrana basmak istediimiz yazdan sonra satr atlama ilemi yapar.Bunu test etmek iin bir tane "Merhaba Dnya" da siz yazdrn. Greceksiniz ki siz belirtmemenize ramen alt alta iki tane "Merhaba Dnya" yazs kacak.

Eer bu program yazp derlediyeseniz ne mutlu size ki C# dnyasna gzel bir adm attnz.

Visual C# ile Windows Menleri HazrlamaMerhaba, bu makalemizde, hemen hemen tm Windows uygulamalarnn temel yap ta olan Windows menlerinin nasl hazrlandn ve basit bir uygulamasn adm adm greceiz. Bildiiniz gibi Windows menlerini imdiye kadar Visual Basic ortamnda ok basit bir ekilde yapmak mmknd. Ama artk Visual C# ile men hazrlamak hem daha kolay hem de daha elenceli. Bu makalede yapacamz uygulamadaki amacmz, File ve Edit blmnden oluan Windows mensn tek bir Windows butonuyla aktif ya da pasif duruma getirmek.

imdi uygulamamzn ilk adm olan yeni proje oluturma sayfasn aalm. File->New -> Project mensn kullanarak aadaki gibi yeni bir proje oluturalm.Proje tipi olarak Visual C# Project, template olarak da Windows Application setikten sonra projemize uygun isim verip OK butonuna tklayalm.

Projemizi oluturduumuzda Visual C# IDE 'sinin bizim iin bir balang formu oluturduunu grrz. Bu form doal olarak u anda botur. Toolbox mensn kullanarak Form zerine istediimiz kontrolleri srkle brak yntemiyle yerletirebiliriz. Ya da istediimiz kontrol ift tklayarak da ayn ilevi gerekletirebiliriz. Eer toolbox mensn gremiyorsanz ekrann sol alt kesinde bulunan

ToolBox ikonuna tklayn. imdi formumuza basit bir MainMenu kontrolu ekleyelim. Yine ToolBox mensnden aadaki ikona ekline benzeyen ksma ift tklayn. Eer ilem baarlysa formunuzun en st ksmnda edit edilmek zere bir men oluacaktr.

MainMenu zerine fare ile gelerek istediiniz men elemanlarn ekleyin.Ben nce File elemann sonra Edit elemann ve Edit elemannn iinde de Copy ve Paste men elemanlarn aadaki gibi oluturdum.

imdi men elemanlarmza Properties penceresinden isim verelim. Aada grdnz pencereden form design penceresinden setiiniz elemanla ilgili zelliklere ulaabilirsiniz.imdi Edit men elamanna tklayarak Properties ekranndaki name zelliine "menuEdit" yazalm. Burda menu elemanna verdiimiz ismi daha sonra kod yazarken kullanacamz iin aklmzda kalacak bir isim vermemiz dzenli kod yazmak iin nemli bir sebeptir. Men elemanlaryla iimiz bittiine gre sra meny kontrol edeceimiz butonu yerletirmeye geldi. ToolBox penceresinden "Buton" a ift tklayarak forma bir buton yerletirelim .Daha sonra butona tklayp Properties penceresinden buton ismi (Name) olarak "BizimButon " yazalm. BizimButon ' un text zelliine ise "MENU PASF ET" yazsn yazalm. Bu yazy yazmamzn sebebi ise udur: Mene elemanlar varsaylan olarak aktif durumdadrlar. Bu yzden meny pasif hale getirmek iin bu yazy setik.

Evet,Form tasarm ilemi bitti. imdi sra geldi BizimButon ile menye aktif ve pasif durumlar arasnda gei yaptrmak. Tabi asl ite imdi balyor.Form zerindeki butona ift tklayarak kod yazma ekranna gelelim.

Grdnz gibi Visual C# bizim iin bir takm kodlar oluturdu. Biraz bu hazr kodlar ana hatlaryla inceleyelim.

using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;Yukardaki kodlarla programmzn kullanaca bir takm sistemler derleyiciye bildiriliyor.

public class Form1 : System.Windows.Forms.FormSystem.Windows.Froms.Form snfndan yeni bir Form1(bizim form) snf tretilerek bu form iindeki elemanlar tanmlanyor.private System.Windows.Forms.MainMenu mainMenu1;private System.Windows.Forms.MenuItem menuFile;private System.Windows.Forms.MenuItem menuEdit;private System.Windows.Forms.MenuItem menuItem3;private System.Windows.Forms.MenuItem menuItem4;private System.Windows.Forms.Button BizimButon;private System.ComponentModel.Container components = null;private void InitializeComponent() ilevi ile Form1 snf iindeki elemanlarla ilgili ilk ilemler yaplyor. Elemanlarn form zerindeki yeri ve elemanlara ait Properties penceresinden tanmladmz btn zellikleri bu ilev ile yerine getirilir.

static void Main() {Application.Run(new Form1());}Uygulamamzn Form1 zerinden gerekletirileceini belirtir.te bu da bizim kodumuz : private void BizimButon_Click(object sender, System.EventArgs e){if (menuEdit.Enabled){menuEdit.Enabled=false;BizimButon.Text="MENU AKTIF ET";}else {menuEdit.Enabled=true;BizimButon.Text="MENU PASIF ET";}}Bu kodu yazabilmek iin form design penceresinden BizimButon ift tklayarak BizimButon_click() ilevinin iine geelim. Yukardaki kodda eer menuEdit aktifse pasif duruma getiriyoruz ve BizimButon 'a da "MENU AKTIF ET" yazyoruz. Eer menuEdit zaten pasifse Menuyu aktif hale getirip BizimButon yazsn da "MENU PASIF ET" yapyoruz. Aada her iki durum iin programmzn kts mevcuttur.

C ve C++ bak asyla C# dili

Bildiimiz gibi bilgisayarlar programlamak iin programlama dillerine ihtiya duyulur.Bu dillerden en poplerleri Basic,C,C++,Pascal,Java ve Assembler 'dr.Makina dili ise donanm kontrol etmek iin donanm reten firma tarafndan tanmlanan komutlar kmesidir. Baz programlama dilleri derleyicilere ihtiya duymasna karn bazlar ise yorumlayclara ihtiya duyarlar, mesela bir c++ programn altrabilmek iin C++ derleyicisine ihtiyacmz varken, Perl ile yazlm bir CGI scripti iin komut yorumlaycsna ihtiyacmz vardr. Derleyiciler program altrmadan nce kodlar makina komutlarna evirirler fakat yorumlayclar bir grup kodu satr satr ya da bloklar halinde yorumlayarak altrrlar.

Aslnda derleyiciler de, komut yorumlayclar da birer bilgisayar programndan baka birey deildirler.Yani c ve c++ dilleri bir giri bekleyen ve k veren birer bilgisayar programlar gibi dnlebilir.Giri olarak kaynak kodu veren bu programlar k olarak ise makina kodu retirler.

C ve C++ dillerine ksa bir bak:

C dili en popler yapsal programlama dilidir.C dili Dennis Ritchie tarafndan, Martin Richards ve Ken Thompson tarafndan gelitirilen BCBL ve B dillerinin temelleri zerine kuruldu.

C dili "The C Programming Language by Brian Kernighan and Dennis Ritchie" kitabyla bymtr.C dili iin, 1983 ylnn byk nemi vardr.nk 1983 ylnda ANSI standartlar komitesi C standartlar iin toplanmtr.Bu standartlama sreci tam 6 yl srmtr.Ve tabi ki u anki standartlarn oluumuna katkda bulunan ANSI 99 standartlar da dier nemli bir gelimedir.

C programclar tarafndan herhangi bir tr program gelitirmek iin yazlm genel amal bir dildir. C ile bir dk seviyeli sistem iin program yazabileceimiz gibi, yksek seviyeli bir GUI(Grafik Arabirimi) tasarlamamz da mmkndr.Ve elbette kendi ktphanemizi de C ile oluturabiliriz.C dilinin ortaya kmasndan bunca yl gemesine ramen poplaritesini hibir zaman kaybetmemitir. Gnmz programclar eitli amalar iin programlarn gelitirirken C dili ile yazlm kaynak kodlarn kullanrlar.

Bjarne Stroustrup 1980 yllnda C++ dilini ortaya karmtr. C++ dili C temelli ve C nin bir st kmesi olarak dnlebilir. C++ en popler nesne temelli programlama dilidir. C++ dilinin ilk ismi "C with Classes"(C ile snflar) idi. C++ dili C diline nazaran daha etkili ve gldr.Ve en nemli zelli ise C 'den farkl olarak nesne temelli bir dildir.u anda C++ dili ANSI ve ISO kurulular tarafndan standartlatrlmtr. Bu standartlarn son versiyonu 1997 ylnda yaynlanmtr.

C# diline ksa bir bak:

C#, gl, modern, nesne tabanl ve ayn zaman type-safe(tip-gvenli) bir programlama dilidir.Ayn zamanda C#, C++ dilinin glln ve Visual Basic' in ise kolayln salar.Byk olaslkla C# dilinin kmas Java dilinin kmasndan bu yana programclk adna yaplan en byk gelimedir. C#, C++ 'n gcnden , Visual Basic 'in kolaylndan ve Java 'nn da zelliklerinden faydalanarak tasarlanm bir dildir. Fakat unu da sylemeliyiz ki, Delphi ve C++ Builder 'daki baz zellikler imdi C# 'da var. Ama Delphi ya da C++ Builder hibir zaman Visual C++ ya da Visual Basic 'in poplaritesini yakalayamamtr.

C ve C++ programclar iin en byk sorun, sanrm hzl gelitirememedir. nk C ve C++ programclar ok alt seviye ile ilgilenirler.st seviyeye kmak istediklerinde ise zorlanrlar.Ama C# ile artk byle bir dert kalmad.Ayn ortamda ister alt seviyede isterseniz de yksek seviyede program gelitirebilirsiniz.C# dili Microsoft tarafndan gelitirilen .NET paltformunun en temel ve resmi dili olarak lanse edilmitir.C# dili Turbo Pascal derleyicisini ve Delphi 'yi oluturan takmn lideri olan Anders Heljsberg ve Microsoft'da Visual J++ takmnda alan Scott Wiltamuth tarafndan gelitirilmitir.

.NET framework'nde bulunan CLR (Common Language Runtime), JVM (Java Virtual Machine)' ye, garbage collection, gvenilirlik ve JIT (Just in Time Compilation) bakmndan ok benzer.

CLR, .NET Framework yapsnn servis salama ve alma zamannn kod organizasyonu yapan ortamdr. CLR, ECMA standartlarn destekler.

Ksacas C# kullanmak iin CLR ve .NET Framework snf ktphanesine ihtiyacmz vardr. Bu da demek oluyor ki C#, JAVA, VB ya da C++ deildir. C,C++ ve JAVA 'nn gzel zelliklerini barndran yeni bir programlama dilidir. Sonu olarak C# ile kod yazmak hem daha avantajl hem daha kolay hem de etkileyicidir.

Bir baka yazda bulumak midiyle ...

C#'da fadeler, Tipler ve Deikenler

Bu derste C# dilindeki ifadeler,tipler ve deikenler anlatlacaktr.

Dersimizin hedefleri : Deiken kavramnn anlalmas.

C# dilinde bulunan basit tiplerin renilmesi.

C# dilindeki ifadelerin temel olarak anlalmas.

String veri tipinin renilmesi.

Deikenleri en sabit ekilde verilerin depoland yerler olarak tanmlayabiliriz. Deikenlerin iine verilerimizi koyabilirirz veya deikenlerimizin iindeki verileri C# programndaki ilemlerimiz iin kullanabilliriz. Deikelerin tipini belirleyen faktr, onlarn ierdikleri verilerin eitleridir.

C# dilinde kullanacamz her deikenin bir tipi olmak zorundadr ( Vbscript ve JavaScript gibi dillerde deiken tanmlarken onun tipini de ayrca belirtmeye gerek yoktur.) Bir deiken zerinde yaplan tm ilemler de onun hangi tipte bir deiken olduu gz nne alnarak yaplr. Bylece programda btnlk ve gvenlik korunmu olur.

Boolean ( doru/yanl ), ve saysal veri tipi; integer( tamsay ), floating point (ondalkl say ) ve decimal( muhasebe ve finansal ilemler iin) C# dilinin en basit veri tipleri olarak saylabilir.

Kod 1 :Boolean deerlerin grntlenmesi : Boolean.cs

using System;class Booleans {public static void Main() {bool content = true;bool noContent = false;Console.WriteLine("It is {0} that C# Station provides C# programming language content.", content);Console.WriteLine("The statement above is not {0}.", noContent);}}Yukardaki Kod 1de de grlecei gibi boolean deikenler ya true(doru) veya false(yanl) deerlerini alabilirler. Programn kts yle olacaktr.

>It is True that C# Station provides C# programming language content. >The statement above is not False.

Aadaki tablo tamsay tiplerini, boyutlarn ve alabilecekleri deer aralklarn gstermektedir.

Type ( Tip )Size (in bits)(boyut )Range (aralk)sbyte8-128 to 127byte 870 to 255 short16-32768 to 32767 ushort160 to 65535int32-2147483648 to 2147483647uint320 to 4294967295long64-9223372036854775808 to 9223372036854775807ulong64 0 to 18446744073709551615char160 to 65535Tamsay tipleri ksuratsz ilemler iin ok elverilidirler. Fakat char( karakter) tipi Unicode standartlarna uygun olarak bir karakteri temsil eder. Yukardaki tablodan da greceiniz gibi elimizde ok sayda tamsay tipimiz vardr. Bunlardan istedikleriminizi ihitiyalarmza gre rahata kullanabiliriz.

Bir sonraki tablo ise ondalk (floating point ) ve decimal veri tiplerini,boyutlarn, hassasiyetlerini ve geerli olduklar aralklar listeler.

Type ( Tip )Size (in bits)(boyut )Precision Rangefloat327 digits 1.5 x 10-45 to 3.4 x 1038 Double6415-16 digits 5.0 x 10-324 to 1.7 x 10308Decimal12828-29 decimal places 1.0 x 10-28 to 7.9 x 1028Ondalkl saylar ksuratl ilemlerde kullanmak iyi olur. Bunun yannda muhasebe ve finansal ilemler iin decimal veri tipi daha uygun olacak ekilde tasarlanmtr.

Bilgisayar programlar ilemleri yaparken ifadeleri kullanrlar ve sonu ortaya kartrlar. Programlarda yer alan ifadeler deikenler ve ilelerden ( operatr) oluurular. Bir sonraki tabloda ileleri, ilelerin ilem sralarn ve ileme ynlerini grebilirsiniz.

Category ( kategori)Operator(s) (ile/ileler)Associativity(ieme yn)Primary(x) x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked left Unary + - ! ~ ++x --x (T)x leftMultiplicative * / %leftAdditive+ -leftShift >leftRelational< > = isleftEquality == !=rightLogical AND&leftLogical XOR^ leftLogical OR|left Conditional AND&& leftConditional OR || leftConditional ?: rightAssignment= *= /= %= += -= = &= ^= |=rightSol ileme yn demek ilemlerin soldan saa doru yaplddr. Sa ileme yn demek ilemlerin sadan sola doru yaplddr. Mesala atama ilelerinin hepsinde nce sa tarafn sonucu bulunur ve bu sonu sol tarafa aktarlr.

Kod 2 : Unary Operators: Unary.cs

using System;class Unary { public static void Main(){ int unary = 0;int preIncrement;int preDecrement; int postIncrement; int postDecrement; int positive; int negative; sbyte bitNot;bool logNot;preIncrement = ++unary; Console.WriteLine("Pre-Increment: {0}", preIncrement); preDecrement = --unary;Console.WriteLine("Pre-Decrement: {0}", preDecrement); postDecrement = unary--; Console.WriteLine("Post-Decrement: {0}", postDecrement); postIncrement = unary++; Console.WriteLine("Post-Increment: {0}", postIncrement);Console.WriteLine("Final Value of Unary: {0}", unary); positive = -postIncrement; Console.WriteLine("Positive: {0}", positive); negative = +postIncrement; Console.WriteLine("Negative: {0}", negative); logNot = false;logNot = !logNot;Console.WriteLine("Logical Not: {0}", logNot); }}

fadeler ilemler yaplrken arka-artrma ve arka-azaltma ileleri nce deikenin deerini dndrr sonra deiken zerinde artrma veya azaltma ilemini yapar. Dier taraftan, n-artrma ve n-azaltma ileleri nce deiken zerinde artrma veya azaltma ilemini yapar sonra deikenin son halini dndrr.

Kod 2de unary (tek) deiken nce sfr olarak atanyor. n-artrma (pre-increment) ileci uygulandnda, unary deikenin deeri 1e kyor ve preIncrement deikenine atanyor. Hemen arkasnda n-azaltma(pred-decrement) ileci sayesinde unary deikenimiz tekrar sfr deerini alyor preDecrement deikenine bu deer atanyor.

Arka-azaltma (post-decrement) ileci unary deikenimize uygularsak bu deikenimizin deeri deiiyor ama nce deikenin ilk deeri postDecrement deikenine atanyor. Sonra ise arka-artrma (post-increment) ilecini uygularsak unary deikenimizin deeri azalyor fakat postIncrement deikenin deeri unary deikenimizin ilk deeri olarak kalyor.

Mantksal deil iareti, doru ifadeyi yanl, yanl ifadeyi ise doru olarak deitirir. Kod 2inin kts yle olacaktr :

>Pre-Increment: 1 >Pre-Decrement 0 >Post-Decrement: 0 >Post-Increment -1 >Final Value of Unary: 0 >Positive: 1 >Negative: -1 >Logical Not: True

Kod 3. Binary Operators: Binary.cs

using System;class Binary { public static void Main() {int x, y, result; float floatResult; x = 7; y = 5;result = x+y;Console.WriteLine("x+y: {0}", result);result = x-y; Console.WriteLine("x-y: {0}", result);result = x*y; Console.WriteLine("x*y: {0}", result); result = x/y;Console.WriteLine("x/y: {0}", result); floatResult = (float)x/(float)y; Console.WriteLine("x/y: {0}", floatResult); result = x%y;Console.WriteLine("x%y: {0}", result);result += x;Console.WriteLine("result+=x: {0}", result);}}Kod 3: te birok aritmetik ilemler yaplyor. Bu ilemlerin sonucunu da sizler tahmin edebilirsiniz...

floatResult deikenin tipi ondalkl say tipi olduu ve x ve y deikenlerimiz tamsay tiplerinde olduklar onlar ak biimde ondalkl say tipine evirdik ( explicitly cast ) ve bu ekilde ilem yaptk.

Yukardaki kod parasnda bir de kalan (remainder % ) ilecinin kullanlna dair rnek verdik. Bu ile, iki saynn blmnnden kalan sayy sonu olarak dndrr.

Son olarak yazdmz ifadede yeralan atama ileci de (+=) C/C++ ve C# programclarnn sklkla kullandklar bir atama ve ilem yapma trdr. Bu ifade aslnda u ifadenin ksa yoludur : result = result + x.

imdiye kadar burada ska grdnz dier veri tipi ise string ( karakter dizisi veya karakter katar)dir. String veri tipi Unicode karakter tiplerinin bir listesini ierirler ve tek ift trnak iaretleri arasnda yazlrlar.

C# Kontrol yaplar ve seme ilemleri

Bu derste C# dilindeki ifadeler,tipler ve deikenler anlatlacaktr. C# dilinde kullanlan seme veya kontrol ifadelerini reneceksiniz.

Dersimizin hedefleri : "f" (eer) ifadesinin kullanm "

"switch" (oktan-se) ifadesini kullanm "

"break" ifadesinin "switch" ifadesi ierisinde nasl kullanld

" "goto" ifadesinin yerinde ve etkili kullanlmas

nceki derslerimizde, her program belirli ifadeleri srasyla altrp bitiyordu. Program iinde inputlara veya program iinde yaplan hesaplara gre deiik ilemler yaplmyordu. Bu derste rendiklerimiz de programlarmzn belirli artlara gre deiik ekillerde almasn salayacaktr. lk seme ifademiz "if". "if" kontrol yapsnn 3 temel formu vardr.

Kod 1 : IF yapsnn deiik formlarda kullanm : IfSelection.cs using System;class IfSelect{ public static void Main() { string myInput; int myInt; Console.Write("Please enter a number: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput); // Single Decision and Action with brackets if (myInt > 0) { Console.WriteLine("Your number {0} is greater than zero.", myInt); }// Single Decision and Action without brackets if (myInt < 0)Console.WriteLine("Your number {0} is less than zero.", myInt); // Either/Or Decision if (myInt != 0) { Console.WriteLine("Your number {0} is not equal to zero.", myInt); }else { Console.WriteLine("Your number {0} is equal to zero.", myInt); } // Multiple Case Decision if (myInt < 0 || myInt == 0) { Console.WriteLine("Your number {0} is less than or equal to zero.", myInt);}else if (myInt > 0 && myInt < = 10) { Console.WriteLine("Your number {0} is between 1 and 10.", myInt);} else if (myInt > 10 && myInt < = 20){ Console.WriteLine("Your number {0} is between 11 and 20.", myInt);}else if (myInt > 20 && myInt < = 30) { Console.WriteLine("Your number {0} is between 21 and 30.", myInt); } else { Console.WriteLine("Your number {0} is greater than 30.", myInt); }}}Kod 1'de tm program boyunca tek bir deikeni kullanyoruz, "myInt". Kullancdan etkileimli olarak veri almak iin nce "Ltfen bir say giriniz :" iletisini konsula yazdryoruz. "Console.Readline()" ifadesi ile program kullancdan bir deer girmesini bekler. Bir rakam yazlnca ve enter tuuna baslnca program yazlan deeri nce string tipinde olan myInput deikenine atanyor. String olarak alnan veriyi program tamsay tipinde bir deiken olarak kullanmak istedii iin "myInput" tamsay tipine dntrlmeli. Bu dnm iin "Int32.Parse(myInput)" komutunu kullandk ( tip dnmleri ve Int32 gibi veri tipleri ileriki derslerde incelenecektir.) Daha sonra, dnmn sonucu "myInt" isimli deikene aktarlyor.

Artk istediimiz tipte bir veriye sahibiz ve bunu "if" ifadesi iinde ileyebiliriz. "if" ifade blounun ilk formu u ekildedir : if(mantksal ifade) { "mantksal ifade"nin doru olas durumunda yaplmas gerekenler }. ncelikle "if" anahtar kelimesi ile balamalyz. Sonras parantezler arasndaki mantksal ifade. Bu mantksal ifadenin doru veya yanl olmas bulunur. Biz programmzda kullancdan aldmz saynn sfrdan byk olup olmadn kontrol ediyoruz">0" ile. Eer say sfrdan bykse, mantksal ifadenin sonucu dorudur ve { } parantezleri arasndaki kod blou altrlr. Eer mantksal ifade yanl bir sonu retirse { } arasndaki kon blou altrlmadan bloktan sonraki ifadelere geer.

kinci "if" ifadesi aslnda birincisi ile ayndr, ikincisi sadece blok iinde deildir. Eer boolean ifade doru sonu retirse, bu ifadeden hemen sonraki alr. Boolena ifadenin yanl olmas durumunda ise bu ifadeden hemen sonraki ifade altrlmadan bir sonraki ifadeye geilir ve o ifade altrlr. Bu ekildeki "if" yapsn, boolean ifadenin doru olmasnda sadece bir tane ifade altrlacaksa yeterlidir. Buna karn "if" ifadesinin sonucuna gre birden fazla ifade ileme konulacaksa blok olarak { } parentezleri arasnda yazlr. Benim kiisel nerim "if" den sonra altrlacak ifade saysna bakmadan, bu ifade(leri) her durumda blok olarak yazmaktr. leride yeni programn okunmasnda ve yeni ilevler eklenmesinde size hatalardan kamanza yardm eder.

Birok zaman size eer/deilse trnde alacak bir "if" yaps gerekebilir. nc tip "if" ifadesi eer doru deer retirse unlar yap, doru deilse "else" anahtar szcnden sonraki kodlar altr trnde bir yaps olarak yazlmaldr.

Birden fazla mantksal ifadeyi ilememiz gerektiinde ise, if/else if/else tipinde bir "if" yapsn kullanmak gerekir. Drdnc rneimizde bu tip bir if yapsn grebilirsiniz. Bu tip yap yine "if" ve boolean ifadesi ile balar. Boolean ifade doru ise hemen alttaki bloktaki kodlar altrlr. Bunun yannda, boolean ifadenin deiik durumlarna gre "else if" i yaps kullanlr. "else if" de ayn if gibi bir boolean ifadeyi alr ve sonucu doru hemen sonraki bloktaki kodlar altrr.

Boolean ifadenin alabilecei tm ihtimallere gre bu ekilde "else if" ifadeleri sralanabilir fakat en sonda bir "else" ile yukardaki tm artlarn yanl olmas durumunda altrlacak kodlar belirleriz. Bu drdnc "if" yapsnda da yine sadece bir tane if/else blok yaps altrlr.

"switch" yaps da "if/else if/else" yapsna ok benzer.

Kod 2 : Switch ifadeleri : SwitchSelection.cs using System;class SwitchSelect { public static void Main(){ tring myInput; int myInt;begin:Console.Write("Please enter a number between 1 and 3: "); myInput = Console.ReadLine(); myInt = Int32.Parse(myInput);// switch with integer typeswitch (myInt) { case 1: Console.WriteLine("Your number is {0}.", myInt);break; case 2: Console.WriteLine("Your number is {0}.", myInt);break; case 3: Console.WriteLine("Your number is {0}.", myInt);break;default: Console.WriteLine("Your number {0} is not between 1 and 3.", myInt); break; } decide: Console.Write("Type \"continue\" to go on or \"quit\" to stop: "); myInput = Console.ReadLine(); // switch with string type switch (myInput) { case "continue": goto begin;case "quit": Console.WriteLine("Bye."); break; default: Console.WriteLine("Your input {0} is incorrect.", myInput); goto decide; } }} Kod 2'de birka tane "switch" yaps rneimiz var. "switch" yaps yine "switch" anahtar kelimesi ile balar ve snanacak deikeni parantez iinde belirtiriz. Switch yapsnn almas iin u veri tiplerinden bir tanesini kullanmak gerekir : sbyte,short,ushort,int, long, ulong, char, string, or enum ( enum daha sonraki bir derste ilenecektir.)

Birinci rneimizdeki "switch" yaps int tipinde bir deer almaktadr. Tamsay deikenimizin alabilecei deerlere gre deiik ilemler yapabiliriz. "myInt" deikenimizin herbir ihtimalini deerlendirirken "case" anahtar kelimesini, muhtemel deerini ve iki nokta st ste ":" yapsnda bir snama yapyoruz. rneimizde, "case 1 :", "case 2: ", ve "case 3:" eklinde yazdk. Snama sonularndan uygun olann hemen altnda kod bloku yer alr. Bu kod blokundan sonra ise "break" veya "goto" ifadelerini kullanmamz gerekir.

sterseniz "default" seeneini de "switch" ifadesi ile birlikte kullanabilirsiniz. "default" ifadesinin altndaki kod bloku, "defult"'tan nceki "case"'lerin hibiri snamay geemedii zaman alr ve tm "case"'lerden sonra gelir.

Her "case" 'den sonra "break" ifadesinin zorunlu olduunu tekrar hatrlatalm. "break" ifadesi "switch" yapsndan dar kmay ve alttaki kodlara gememizi salar. "default" anahtar kelimesinin kod blokundan hemen sonra "break" koymak programcnn isteine kalmtr. Switch ifadesinde iki tane dikkat edilmesi gereken husus vardr.

Birincisi, farkl durumlar (case'leri) ard arda aralarna hi kod yazmadan sralamaktr. Aslnda burada yaplan i, deikenimizin birden fazla deeri iin tek bir "case" kod bloku oluturmaktr. Bir case ve hemen arkasna baka bir case yazdmzda program otomatik olarak bir sonraki "case" 'e geer. Aadaki kodu incelediimizde, "myInt" deikeni 1,2, veya 3 deerlerinden herhangi birini alrsa kendi deerini ekrana yazdryoruz. Dier durumda ise deikenimizin deerinin 1 ve 3 arasnda olmadn ekrana yazdryoruz.

switch (myInt){case 1:case 2:case 3:Console.WriteLine("Your number is {0}.", myInt);break;default:Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);break;}Kod 2'de yer alan ikinci "switch" yaps ise "goto" ifadesinin nasl kullanlacan gstermek amacyla yazlmtr. "goto" , programn belirli bir ksmnda yer alan, zel etiket (label) ile belirtilmi ksmna atlamasna ve oradan itibaren almaya devam etmesine yarar. Programmzda kullanc "continue" yazarsa "begin" olarak belirlenmi etikete gider ve oradan almaya devam eder. Aslnda bu ekilde "goto" kullanmak etkili bir dng olur. Eer kullanc "end" yazarsa program "bye" yazar ve dngden programmz kar.

Aka grlyor ki "goto" kelimesini kullanmak bize programda belirli artlar altnda g kazandrr. Yine de "goto" ifadesini programda sk bir ekilde kullanmak "sipagetti" kod olarak adlandrlan programlamaya yol aabilir ki, bu tr kodlama program hem okurken hem de hatalar ayklarken byk sorunlara sebep olabilir.

C# ile Temel Windows Formlar Oluturma

Bu yazmzda Windows programlamann temel elemanlarndan olan windows formlarnn nasl oluturulduunu ve nasl kullanldn greceiz, windows formlarn aklarken basit bir drt ilem yapan hesap makinas oluturacaz.Windows formlar derken neyi kastediyoruz? Textbox, label, button gibi nemli elemanlarn hepsi birer windows formudur. Bu windows formlarna ulamak iin System.Windows.Forms isimalann kullanyoruz. Ve tabi ki programmzn aktif bir windows uygulamas olarak almas iin de aadaki isimalanlarn projemize ekliyoruz.using System.Drawing;using System.Collections;using System.ComponentModel;

Programmz yazmaya balamadan nce programmzn kodlarn ierecek bir isim alan oluturalm. Ben buna CsHesapMakinasi adi verdim.(Makaleyi okurken kaynak kodu incelemenizi tavsiye ederim) Siz istediiniz baka bir isim kullanabilirsiniz.

Daha nceki makalelerimizde belirttiimiz gibi programmzn almas iin derleyiciye programn balang noktasn bildirmemiz gerekirdi.Bu balang noktas da genelde main() fonksiyonu oluyordu. Kodumuzu yle ayarlayacaz ki main() fonksiyonu icra edildiinde altrmak istediimiz windows formu ekranda grnsn. Bunun iin main iine aadaki kodu yazyoruz. Application.Run(new Form1()); // Yeni bir Form1 nesnesi oluturularak uygulama olarak balatlyor.

u an iin Form1 hakknda en ufak bir bilgiye sahip deiliz.Peki bu Form1 nasl oluturulacak. Yukarda dabahsettiimiz gibi Form1 snfndan bir nesne oluturmak iin System.Windows.Forms isimalann kullanmalyz. Bu yzden bu isim alannn altnda bulunan Form snfndan yeni bir Form1 snf tretmemiz gerekecek, bu tretme ilemi aadaki gibidir. Form1 snfn trettikten sonra Form1' iinde bulunacak elemanlar tanmlyoruz.4 ilemi yapmak iin 4 buton, ileme giren deerler iin 2 textbox ve 2 tane de label formu tanmlyoruz.Tanmlama ilemi aadaki gibidir.public class Form1 : System.Windows.Forms.Form{private System.Windows.Forms.Button button1;private System.Windows.Forms.Button button2;private System.Windows.Forms.Button button3;private System.Windows.Forms.Button button4;private System.Windows.Forms.Label label2;private System.Windows.Forms.TextBox deger1;private System.Windows.Forms.TextBox deger2;private System.Windows.Forms.TextBox sonuc;private System.Windows.Forms.Label isaret;} imdi bu windows formunun ekrana nasl basldn inceleyelim.Main() ilevi iinde yeni bir Form1 nesnesi yaratldnda Form1 nesnesine ait kurucu ilev olan Form1() ilevi arlr.(Kaynak kodu inceleyin). Form1() kurucu ilevinde ise InitializeComponent(); adl bir fonksiyon arlarak Form1 nesnesine ait olan ye elemanlarla (button,label,textbox vs) ilgili ilk ilemler yaplr.From1 ald zaman Form1 iinde bulunan elemanlarla iligili yapmak istediimiz ilk zellikleri InitializeComponent() fonksiyonu iinde yapyoruz.private void InitializeComponent(){// form1 iinde yer alacak elemanlar yaratlyor(kaynak kodu inceleyin)this.deger2 = new System.Windows.Forms.TextBox();this.sonuc = new System.Windows.Forms.TextBox();this.button2 = new System.Windows.Forms.Button();this.isaret = new System.Windows.Forms.Label();this.label2 = new System.Windows.Forms.Label();this.SuspendLayout();// // elemanlarla ilgili balang zellikleri veriliyor.// this.deger1.Location = new System.Drawing.Point(16, 8);//deger1 adl textbox iin yer bildirimithis.deger1.Name = "deger1";this.deger1.TabIndex = 0;this.deger1.Text = "0";this.name="Form1";//Form1 nesnesinin kendisi iin this anahtar szcn kullanyoruzthis.text = "Hesap Makinas ";this.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(255)), ((System.Byte)(128)), ((System.Byte)(0)));this.ClientSize = new System.Drawing.Size(400, 149);

}imdi sra elemanlarla ilgili olaylarn birbirleri ile ilikisine.Mesela bir buton formunun click olaynn form tarafndan yakalanabilmesi iin aadaki satrlar yazmalyz.

this.button4.Click += new System.EventHandler(this.button4_Click);private void button4_Click(object sender, System.EventArgs e){isaret.Text="/";sonuc.Text=System.Convert.ToString(System.Convert.ToInt32(deger1.Text)/ System.Convert.ToInt32(deger2.Text));}

buton4_Click() ilevinde, alma zamannda bir nesnenin zelliklerinin nasl deitirildiini gryoruz.button4 blme ilemi yaptndan isaret.Text="/"; yazdk. sonuc adl textbox formunun Text zellii bir string ifadesi olduu iin ilemlerimizi yaptktan sonra sonuc.text ifadesine atama yapabilmek iin System.Convert isimalannda bulunan ToString ilevini kullanarak ifadeyi String trne dntryoruz. Ayn ekilde String olarak aldmz trler iin aritmetik ilem yapabilmek iin yine ayn isimalannda bulunan ToInt32 ilevi ile String trn int32 formatna dntryoruz. Btn bu ilemleri 4 butonumuz iin yaptmzda drt ilem yapabilen basit ve bol bol bug ieren (unutmayn amacmz sadece formlarn kullanmn renmek) bir hesap makinamz olacak..NET Teknolojilerine Giri

Gnmzde bilgisayar dnyasnda internet olmazsa olmaz derecede nemli bir yer edinmeye balad. Artk insanlar ev ve iyerlerinde kullandklar uygulamalarna da internet zerinden eriip kullanmak istiyorlar. Bu internetin getirdii zgrln kanlmaz bir sonucudur.Peki yazlm dnyas buna hazrmyd? Gelitirilen her program kolayca internet ormannda da altrabilirmiydik? Bu sorularn cevaplar bir sene ncesine kadar hayr, olamaz veya u andaki sistemler bu denli zgrl bize salamyor trndendi.

Microsoft'un ASP'si ile veya PHP ile yaplan uygulamalar tam olarak insanlarn isteklerine cevap veremiyordu. Her ne kadar iyi ve gelimi web uygulamalarn bir yere kadar yapabiliyorduksa da belirli bir noktadan sonra C++,Delphi veya VB ile gelitirdiimiz modlleri web uygulamamza ekleyerek sorunlarmz halletmeye alyorduk. Tabi bu tr yntemler programn gelime sresini uzatyordu. Zamann giderek nem kazand bir devirde haliyle programlarmz da hzl bir ekilde gelitirmemiz gerekiyor(du). Hzl uygulama gelitirme(Rapid Application Development- RAD) geleneksel programlama aralaryla ve prgramcnn yetenekleriyle zm bulunacak bir mesele deil. Artk programlama dilleri, dille birlikte gelen ktphaneler ve bunlar hakkndaki dokmantasyonlar ile birlikte deerlendiriliyor.

.NET ile birlikte programcnn hizmetine sunulan 3400'den fazla snf, modern anlamda ok gzel bir gelitirme ortam sunuyor. Bu sayede programlamlar daha hzl bir ekilde gelitirme imkanna sahip bulunuyoruz. .NET kullanarak yazdmz ASP.NET, Windows Forms veya mobil cihazlar iin gelitirdiimiz bir uygulamay birinden dierine dntrmek ii ok kolay bir ekilde yaplabiliniyor. Bu sayede ayn anda hem windows hem de web uygulamalar gelitirmek ok hounuza gidecektir :-).

.NET framework'unun bize sunduu dier gzel bir zellik ise platform bamszldr. Artk yazdnz Windows uygulamalar sadece Windows ykl sistemlerde deil, .NET framework'unun kurulu olduu tm platformlarda alabilecektir. Her ne kadar imdilik bu alt yapnn sadece Windows versiyonuna sahip olsak da Linux gruplar tarafndan bu alt yapnn Linux versiyonunu kartma ynndeki abalar uzun bir sredir devam etmektedir.

Peki bunca ho zellikleri bize salayan .NET alt yapsnda program yazarken hangi dili veya dilleri kullanmak zorundayz? Bu konuda Microsoft ok radikal bir karar alarak gelecek iin hazrlanm yeni alt yapda Common Language Runtime (CLR) ile uyumlu her .NET dilini kullanmamza olanak salyor. .NET ile gelen SDK'da C#,VB.NET ve Js.NET kullanarak program yazabiliyoruz. Dier taraftan 30'un zerinde programlama diliyle .NET uygulamas gelitirebilirsiniz.

CLR denen ey tam olarak nedir? .NET altyapsnda programlarn almasn kontrol eden ve iletim sistemi ile programmz arasnda yer alan arabirimdir. Normalde yazdmz programlar derlenirken makine diline evrilirdi ve program bu ekilde iletim sistemi ile direkt balant kurarak alrd. Fakat platform bamsz bir gelitirme ve yrtme ortam istiyorsanz ne olacak? te tam bu anda CLR devreye girer ve .NET programlarn farkl platformlarda makineye ve iletim sistemine gre programmz altrr. Normalde bir Windows, Linux veya MACOS kurulu sistemler ayn programn kodunu altramazlar. Bu platformlar iin programn ayr ayr yazlp, onlara gre hazrlanm derleyicilerde derlenmesi gerekir. Dnyada ok sayda yaygn platform olduunu dnrsek, bunlarn herbiri iin ayr ayr derleme ilemini tek bir iletim sisteminde yapmamz imkansz gibidir. Bu durumda zm, ortak bir aradil kullanmak ve herbir platform iin bu aradile evrilmi programn kodunu altracak altyaplar hazrlamaktr.

imdi u soruya sra geldi: "yi de .NET hangi aradili kullanyor?" Sorumuzun cevab MSIL(Microsoft intermediate Language) .NET platfomunda hangi dili kullanrsak kullanalm yazdmz programn kodu direkt olarak makine diline deil de MSIL'e evrilir. Bu sadece program altrdmz sistemde kurulu olan CLR alma annda MSIL kodlarn evirerek programmz altrr, alma annda derleme ilemini ise JIT derleyicileri (Just in Time compilers) stlenir.

Gelecek makalemizde JIT'ler, MSIL language, CTS (Common Type System) gibi daha teknik konular detayl olarak ele almay dnyorum. Sizlere kolaylklar dilerim.

.NET'in CLR, CTS ve JIT derleyicileri

nceki yazmzda "dot NET" platformu konusuna giri yapmtk.(Yazy okumak iin tklayn) Burada ise daha detayl olarak .NET kavramlarn inceleyeceiz ve .NET'le Java'nn karlatrld bir testin sonularna yer vereceiz.

.NET platformunda istediimiz programlama dili ile program yazabileceimizi nceki yazmzda sylemitik. Bunun iin tek art, kullandmz dilin .NET iin yazlm olan bir derleyicisine ihtiyacmz olduudur. .NET uyumlu programlama dili olutururken belirli standartlara uyulmas gerekir. Bu standartlar CLS (Common Language Specifications - Dillerin ortak zellikleri) ile belirlenmitir. CTS(Common Type System) ise veri tipleri, nesneler, arayzler ve programlama dillerine ait zellikleri tanmlar ve CLS'in bir paras olarak karmza kar. CLS'de tanmlanm kurallara uymak art ile istersek kendi programlama dilimizi dahi gelitirebiliriz veya herhangi bir dili .NET platformunda uygulama gelitirmek zere deitirebiliriz.

CLR ,programlarmz deiik ekilde derleyebilir. Varsaylan derleme tr JIT(Just IN TIME- alam annda derleme) 'dr. Program alrken daha nce derlenmemi bir parasna gelince hemen o ksm da derler ve bunu hafzda chach'e koyar. Tekrar ayn program parasn altrmak gerekirse buray hafzadan altrr. Eer RAM 'imizi yeteri kadar bykse, programn tamam derlenmi ve hafzada depolanm durumda olabilir. Bu durumda programmz ok hzl alr.

Hafzamzn yeteri kadar byk olmad durumlarda EconoJIT (Ekonomik JIT) derleyicisini kullanabiliriz. Bu derleyici ile programn derlenmi ksmlar hafzada depolanmaz ve her seferinde ayn program paras derlenir. Tabi ki bu derleyici normal JIT'e gre programlarmz daha yava altrr. Ama RAM 'imizi ok daha az kullanr.

CLR ile gelen nc derleyicimiz PreJIT(n JIT derleyicisi) ise derleme iini program almadan nce yapar ve tm makine kodlarn bir yerde saklar. alma annda ok hzl olan programmz dier JIT derleyicileriyle derlenmi olanlara nazaran ok hzl alr.

Kolayca grebileceimiz birka noktaya da parmak basmak istiyorum. .NET ile yazdnz programlar dierlerine gre yava alr. nk iki defa derleme aamasndan geerler, program kodu MSIL'ye, MSIL ise makine koduna evrilir. Dier taraftan .NET ile programlarmz platform bamsz olacak, .NET uyumlu herhangi bir dil ile program gelitirebileceiz ve programmz CLR altnda daha gvenli bir ekilde alacaktr.

.NET perfromans testi linkindeki sonulara gre : Genelde C# Java'dan 3.30 kat daha hzl. C# Visual C++ 6.0'dan ise 3.11 kat daha hzl alyor. Hatta VB.NET kodu VB 6.0'a nazaran 46.45 kat daha hzl alyor. :-)

Visual C# ile Programlamaya Giri

Visual C#, Visual Studio ailesinin yeni yesidir, bu yeni dil c ve c++ temelleri zerine kurulmasna ramen komponent temelli programlama tekniini gelitirmek iin birtakm yeni zellikler eklenmitir. C# dilinin sentaks C ve C++ programclarna ok tandk gelecektir. Bundan pheniz olmasn.

Genel Aklamalar

Bu yazda greceimiz basit uygulamada QuickSort algoritmasn kullanarak nasl basit bir C# projesinin oluturulduunu greceiz. Bu uygulamada bir c# programnda en sk kullanlan yaplardan olan dosyaya ve console ekranna okuma/yazma, fonksiyon oluturma ve basit dizilerin kullanm aklanacaktr.

Bu yaz kesinlikle C# dilinin tm zelliklerinin anlatld yaz deildir. Bu yaz C# dilini renmek iin sizlere bir balang noktas sunar.

nerilen Kaynaklar

Visual Studio.NET (Beta 2 veya sonras) rnek kaynak kodu derlemeniz iin gereklidir. C/C++ bilgisi size bu yazy anlamanzda yardmc olabilir ama gerekli deildir.

Adm 1. Projeye BalamaVisual Studio ile program gelitirme organizasyonu solution(zm) alma alanlar zerindendir. Solution dediimiz ortam bir veya daha fazla projeyi ierebilir. Bu makale iin tek bir C# projesi ieren bir solution oluturacaz.

Yeni bir proje oluturmak

1. Visual Studio.NET ortamndan, File | New | Project menlerini sein.

2. Soldan(Project Types) Visual C#, sadan(Templates) ise Console Application butonlarn sein.

3. Projenizin adn belirleyin ve projenizin hangi klasrde saklanacan belirleyin.Bu klasr Visual Studio tarafndan otomatik oluturulur.Proje ad olarak ben quicksort yazyorum.Siz istediiniz ad verebilirsiniz.

4. OK tuuna basalm ve yola koyulalm.

"Visual C# Solution" ortammz

Visual Studio.NET iinde bir Visual C# projesi bulunan bir solution oluturdu. Proje assemblyinfo.cs ve class1.cs adl iki tane dosya iermektedir.

Bundan sonraki admlarda projemizi nasl derleyeceimizi ve bu iki dosya hakknda detayl bilgiyi reneceiz.

Adm 2. Hello, World!Kusura bakmayn ama gelenei bozmadan ilk defa C programlama dili ile yazlm olan "Hello, World!" programn c# ile yazacaz. Bu bir gelenektir ve her yeni bir dili renmeye baladnzda bunu siz de greceksiniz.

Kaynak Kodu Deitirme

1. Solution Explorer 'da bulunan 'class1.cs'dosyasna ift tklayn. Solution Explorer ' gremiyorsanz, view mensn kullanarak grnr hale getirebilirsiniz.

2. ablonla oluturulmu koda aada krmz ile yazlm ksm ekleyin (class1.cs).

using System;

namespace quicksort{ /// /// Summary description for Class1. /// class Class1 { static void Main(string[] args) { // // TODO: Add code to start application here // Console.WriteLine ("Hello, C#.NET World!"); } }}

3. Dikkat edin siz kodunuzu yazdka Visual Studio size snflar ve fonksiyon adlar hakknda bilgi verir, nk .NET Framework tip bilgisini yaynlamaktadr.

Uygulamamz Derleyelim

1. Programmzda deiiklik yaptmza gre artk Build mensnden Build ' seerek programmz derleyebiliriz.

2. Hata ve mesajlar en altta bulunan "Output Window" denilen pencerede grnr. Eer herhangi bir hata yoksa uygulamamz Debug mens altnda bulunan 'Start without Debugging' mensne tklayarak altrabiliriz.

Programmzn kts

Aada programmzn Visual C# iinden altrlarak oluturulmu ktsnn ekran grnts mevcuttur.

Deiiklikleri Anlamak

System.Console snfna ait WriteLine() fonksiyonu kendisine argman olarak gnderilen dizgeyi sonuna satr sonu karakteri de ekleyerek ekrana yazar.Bu fonksiyon integer ve floating-point gibi dier veri tiplerini de argman olarak alabilir.

Program bellee yklendiinde programn kontrolu Main() fonksiyonuna gelir.WriteLine() fonksiyonunu oraya yazmamzn sebebi budur.Adm 3. Programn Yapsimdi basit bir Hello World uygulamas gelitirmi olduk, imdi de bir Visual C# uygulamasnn basit componentlerini inceleyelim.

Kaynak Kod Yorumlar

// karakterlerinden sonra gelen ve satrn sonuna kadar olan szckler yorum satrlardr ve C# derleyicisi tarafndan grnmezler. Ayn zamanda birden fazla satra yorum eklemek istiyorsak /* */ karakterleri arasna yorum yazarz.

// Bu satr derleyici tarafndan grlmez/* Ayn zamanda bu blok daderleyici tarafndan grnmez*/

Using Komutu

.NET Framework gelitiricilere yzlerce yararl snflar sunar. Mesela, Console snf, console ekranna ait girdi ve ktlar iler. Bu snflar hiyerarik bir aa iinde organize edilmitir. Aslnda Console snfnn tam ismi System.Console ' dur. Dier snflar ise System.IO.FileStream ve System.Collections.Queue. iindedirler.

using komutu bize snfn ismini namespace(isim alan) kullanmadan kullanabilmemizi salar.Aada krmz ile yazlan yazlar using komutunun uygulamasnn sonucudur.

using System; class Class1{ static void Main(string[] args) { System.Console.WriteLine ("Hello, C#.NET World!"); Console.WriteLine ("Hello, C#.NET World!"); }}

Snf Bildirimi

C++ ve Visual Basic 'den farkl olarak C# 'da btn fonksiyonlar bir snf ierisinde olmaldr. C# 'da bir snf tanmlamak iin class anahtar szc kullanlr.Bu durumda bizim uygulamamzda, Class1 snf Main() adnda bir fonksiyon ierir. Eer snf bildirimini bir isim alan bloklar iine alrsak snflarmz CSharp.QuickSortApp eklinde bir hiyerari iine alabiliriz.

Snflar hakknda ok derin bir bilgi vermeyi dnmyorum.Fakat bizim rneimizin neden bir paras olduunu aklamakta fayda grdm.

Main() Fonksiyonu

Program bellee yklendiinde Main() fonksiyonu programn kontroln eline alr, bu yzden balang kodlarmz daima Main() fonksiyonu iinde yazmalyz. Komut satr argmanlar ise bir string dizisi olan args dizisine aktarlr.(mesela: delete x ) Burada programmzn ad delete ise x bir komut satr argmandr.

Adm 4. Console Giriiimdi ilemlerimize bir QuickSrot uygulamas gelitirerek devam edelim. lk yapmamz gereken kullancya hedef ve kaynak dosyasnn isimlerini sormak olacaktr.

Source Code Modifications

1. class1.cs dosyasna aada krmz ile yazlanlar yazn. Burada snf ismi ve isimalan ismi bizim iin ok nemli deildir.

// namespaces ekleme using System;

// namespace tanmlamanamespace MsdnAA{ // uygulama snf tanmlama class QuickSortApp { // uygulama oluturma static void Main (string[] szArgs) { // Programn hakknda Console.WriteLine ("QuickSort C#.NET Sample Application\n");

// kullancdan bilgi alma Console.Write ("Source: "); string szSrcFile = Console.ReadLine (); Console.Write ("Output: "); string szDestFile = Console.ReadLine (); } }}

Console'dan Okuma

Console snfnn ReadLine() metodu kullancya bir giri ekran sunar ve geriye kullancnn girdii dizgeyi(string) geri dndrr.Bu metod bellek tahsisatn otomatik olarak kendi iinde yapmaktadr ve .NET garbage collector mekanizmas sayesinde iade etmeniz gereken herhangi bir alan yoktur.

Program kts

Program Debug | Start Without Debugging menlerini kullanarak altrn.Aada programmzn son halinin ktsn gryorsunuz.

Adm 5. Dizilerin Kullanm

Programmz sralama yapmadan nce giriten satrlar alarak bir dizi iinde saklamas gerekir. imdi .NET temel snflarndan olan ArrayList snfn inceleyeceiz.

Kaynak Kod Deiiklii

1. class1.cs dosyas iinde aada krmz ile gsterilen yerleri ekleyin.

// isim alan ekleme using System;using System.Collections;

// isimalan tanmlamanamespace c#nedircom{ // uygulama snf tanmlama class QuickSortApp { // uygulama balangc static void Main (string[] szArgs) { Console.WriteLine ("QuickSort C#.NET Sample Application\n");

// Dosya isimlerini almak iin komut yaz Console.Write ("Source: "); string szSrcFile = Console.ReadLine (); Console.Write ("Output: "); string szDestFile = Console.ReadLine ();

// TODO: Read contents of source file ArrayList szContents = new ArrayList (); } }}

ArrayList snfnn kullanm

ArrayList snfna direkt ulaabilmek iin System.Collections isimalann projemize using komutuyla ekliyoruz. Bu snf dinamik olarak byyp klebilen nesne dizileri iin kullanlr. Yeni bir eleman eklemek iin basit bir ekilde Add() metodunu kullanabilirsiniz. Bu diziye eklenen yeni eleman orijinal nesne iin referans olarak kullanlr, ve garbage collector alan iadesi iin hazr olacaktr.

string szElement = "insert-me";ArrayList szArray = new ArrayList ();szArray.Add (szElement);

Dizinin var olan bir elemanna ulaabilmek iin, diziye ait Item() metoduna ulamak istediimiz elemann sra(index) numarasn geebiliriz.Ksaca [] operatrlerini kullanarak da istediimiz elemana Item() metodunu kullanmadan da ulaabiliriz.

Console.WriteLine (szArray[2]);Console.WriteLine (szArray.Item (2));

ArrayList snfnn daha birok metodu vardr, ancak biz bu uygulamada sadece ekleme ve okuma yapacaz. ArrayList snfna ait tm metod ve zellikleri renmek iin MSDN kitaplna bavurabilirsiniz.

Adm 6. File Girdi/kt(Input/Output)imdi isterseniz dosyadan okuma ve dosyaya yazma ilemlerini gerekletirelim. Dosyadaki her satr okuyup, bir string dizisinin her elemann bir satr gelecek ekilde ekleyeceiz.Sonraki aamada ise QuickSort algoritmasn kullanarak diziyi sral bir ekilde yazacaz.

Kaynak Kod Deiiklii

1. class1.cs dosyasna aada krmz ile yazlanlar yazn. Burada snf ismi ve isimalan ismi bizim iin ok nemli deildir.

// isimalan ekleme using System;using System.Collections;using System.IO;

namespace MsdnAA{

class QuickSortApp {

static void Main (string[] szArgs) { string szSrcLine; ArrayList szContents = new ArrayList (); FileStream fsInput = new FileStream (szSrcFile, FileMode.Open,FileAccess.Read); StreamReader srInput = new StreamReader (fsInput); while ((szSrcLine = srInput.ReadLine ()) != null) { // dizinin sonuna ekleme szContents.Add (szSrcLine); } srInput.Close (); fsInput.Close ();

// TODO: Buraya QuickSort fonksiyonu gelecek

// sralar satrlar yazma FileStream fsOutput = new FileStream (szDestFile,FileMode.Create, FileAccess.Write); StreamWriter srOutput = new StreamWriter (fsOutput); for (int nIndex = 0; nIndex < szContents.Count; nIndex++) { // hedef dosyaya satr yazma srOutput.WriteLine (szContents[nIndex]); } srOutput.Close (); fsOutput.Close ();

// baary kullancya bildirme Console.WriteLine ("\nThe sorted lines have been written.\n\n"); } }}

Kaynak Dosyadan Okuma

Kaynak dosyay amak iin FileStream snfn ve StreamReader snfn kullanarak ReadLine() metodu ile dosyay okuyoruz. ReadLine() metodunu dosyann sonunu ifade eden NULL deerine geri dnene kadar aryoruz.Dng iinde okunan satrlar dizinin iine ekliyoruz ve sonrada tm nesneleri kapatyoruz.

Hedef Dosyaya Yazma

Dosyaya yazarken dizinin sralanm olduunu varsaydk ve yle devam ettik. Ayn eklide FileStream nesnesini ve StreamWriter snfn kullanarak hedef dosyaya yazma ilemini yaptk.

Adm 7. Fonksiyon YaratmaSon aamada diziyi QuickSort algoritmas ile sralayan fonksiyonu yazmaya geldi. Bu fonksiyonu uygulamamzn ana snfnn iine koyacaz.

Kaynak Kod Deiiklii

1. class1.cs dosyasna aada krmz ile yazlanlar yazn. Burada snf ismi ve isimalan ismi bizim iin ok nemli deildir.

// isim alan eklemeusing System;using System.Collections;using System.IO;

namespace c#nedircom{

class QuickSortApp {

static void Main (string[] szArgs) { ... ... ...

// QuickSort fonksiyonuna parametrelerin geii QuickSort (szContents, 0, szContents.Count - 1);

... ... ... }

// QuickSort fonksiyonu static void QuickSort (ArrayList szArray, int nLower, int nUpper) {

if (nLower < nUpper) { // Ayrma ve sralama ilemi int nSplit = Partition (szArray, nLower, nUpper); QuickSort (szArray, nLower, nSplit - 1); QuickSort (szArray, nSplit + 1, nUpper); } }

// QuickSort blmelere ayrma static int Partition (ArrayList szArray, int nLower, int nUpper) { // lk eleman bulma int nLeft = nLower + 1; string szPivot = (string) szArray[nLower]; int nRight = nUpper;

// Dizi elemanlarn blme string szSwap; while (nLeft Open mensn kullanarak grntlemek istediiniz Assembly dosyasn sein.(Aada grdnz ekran grntleri Assembly2.exe'nin grntleridir.) Bir assembly'deki trler, snflar, fonksiyonlar eitli sembollerle temsil edilmitir. Hangi sembollerin ne anlama geldiini MSDN kitaplndan bulabilirsiniz.

imdi de alacak pencereden Main blmne tklayn, ve aadaki grnty elde edin. Buradaki btn kodlar IL kodudur.

Dier blmlerde tklayarak IL kodlarn inceleyebilirsiniz.

Yukarda bahsettiimiz gibi Assembly'ler private ve shared olmak zere ikiye ayrlr. Normal olarak gelitirilen Assembly'ler private Assembly olarak adlandrlr. Bu tr assembly'ler uygulama ile ayn dizinde ya da alt dizinlerde bulunur. Versiyon ve isim uyumazl sorunu bu tr assembly'lerde olmamaktadr. Shared assembly'ler ise daha ok byk projelerde mesela bir projenin bir firmaya ait farkl ofislerinde gerekletirildii durumlarda kullanlr. Bu durumda assembly'lerin uymas gereken baz kurallar vardr. Bunlardan en nemlisi strong name dediimiz tekil bir isme sahip olmasdr. Bu sayede shared assembly'ler tekil olduu iin bir sistemde global dzeyde ilem grrler. Yani farkl farkl uygulamalardan ayn anda shared assembly'lere ulalabilir. imdi shared assembly kavramn biraz aalm.

Shared Assembly

Assembly'ler varsaylan olarak private'tr. Bu yzden bu tr Assembly'ler sadece bulunduklar dizin ierisindeki uygulamalar tarafndan grlr ve altrlrlar. Oysa ki baz durumlarda btn programlar tarafndan o Assembly'ye birbirlerinden bamsz olarak eriilmesini isteriz. Bunu salamak iin Global Assembly Cache denilen bir sistemden faydalanacaz. .NET 'in ykl olduu btn sistemlerde Assembly Cache mekanizmas vardr. Bu Assembly Cache'ye ykl olan Assembly'ler btn uygulamalar tarafndan kullanlabilir. Bir assembly'yi GAC'a(Global Assembly Cache) yklemek iin 3 yntem kullanlr:

- Assembly'leri Windows Installer 2.0 ile yklemek- Gacutil.exe isimli .NET ile gelen arac kullanmak- /assembly 'ye Assembly dosyasn kopyalamak (C:\winnt\assembly\)

imdi adm adm bir shared assembly oluturmay grelim. Bunun iin ikinci yntemi kullanacam. Balang olarak gacutil.exe program hakknda bilgi vermek istiyorum. Gacutil(global assembly cache utility) program .NET ile birlikte gelir. Assembly cache'ye yeni assembly yklemek varolan assembly'leri listelemek ve silmek iin kullanlr. Komut satrndan aadaki parametrelerle bu program altrabiliriz.

* gacutil /l ---> GAC 'da bulunan btn assembly'leri listeler.* gacutil /i assemblydll---> assemblydll adl shared assembly'yi GAC 'a ykler.* gacutil /u assemblydll---> assemblydll adl shared assembly GAC 'dan siler.

lk adm olarak btn shared assembly'lere strong name dediimiz bir isim vermeliyiz. GAC 'da bulunan btn assembly'lerin farkl bir ad vardr. COM teknolojisindeki globally unique identifier(GUID) 'e benzetebiliriz bu isimleri. Peki bu strong name 'leri nasl oluturacaz? Bu i iin yine .NET ile birlikte gelen sn.exe adl arac kullanacaz. sn program aadaki gibi kullanlarak bir tekil isim oluturulur ve anahtar.snk adl dosyaya yazlr.

sn -k anahtar.snk

anahtar.snk dosyasn oluturduktan sonra bu anahtar ismi projemizdeki AssemblyInfo.cs dosyasndaki manifeset blmne ekliyoruz. Yani AssemblyKeyFile zelliini anahtar.snk olarak deitiriyoruz. Sonu olarak AssemblyInfo.cs dosyas aadaki gibi olacaktr.

...............[assembly AssemblyDelaySign(false)] [assembly AssemblyKeyFile("../../anahtar.snk")][assembly AssemblyKeyName("")] ...............

Bu ilemleri yaptktan sonra projeyi "Build" edip oluan Assembly dosyasn gacutil.exe yardmyla GAC 'a ekliyoruz. Bu ilemi komut satrndan aadaki gibi yapmalyz.

gacutil /i Assembly1.dll

Bu ilemi yaptktan sonra shared olan bu assembly'ye istediimiz .NET projesinden ulaabiliriz. Tabiproject->Add reference mensnden shared assembly'ye referans verdikten sonra yapabiliriz bunu. Shared assembly olduu iin yeni bir projede bu assembly kullandmz da lokal bir kopyas oluturulmaz dolaysyla GAC zerinden eriilir.

Kaynaklar

C# Primer (A Practical Approach) - Stanley LipmanMSDN Ktphanesi Kaynak Dosyalarnn Kullanm(Resource Files)

Bir uygulamann iindeki kaynaklar neler olabilir; resimler, mzikler ve yazlar(string). Bu makalede bu tr kaynaklarn, harici olarak programmza nasl ekleneceini reneceiz. Derlenmi bir program ierisinde bir yazy deitirmek ok zordur. Bu yzden sonradan deime ihtimali bulunan kaynaklar ynetmek iin .NET platformu bizim iin byk kolaylklar salamtr. Baz durumlarda da programmzn farkl dillerdeki versiyonlar olabilir. Bu durumda her dil iin bir string kaynak dosyas(resource file) hazrlamamz yetecektir.

Bu makalede, .NET ile birlikte gelen ve kaynak dosyalar oluturmada kullanlan resgen.exe adl program, System.Resources isimalannda bulunan ResourceWriter isimli snf, ve bu oluturulan kaynak dosyalar kullanmak iin yine System.Resources isimalannda bulunan ResourceManager adl snflarnn kullanmn greceiz. Ve tabiki bunlar anlatrken basit bir uygulama zerinden anlatacam.

Yukarda da bahsettiim gibi kaynak dosyalarda resim ve yazlar bulunabilir.lk admda basit bir .txt dosyasna istediimiz yazlar alt alta yazalm. Resgen.exe yardmyla bu txt dosyasndan .NET platformu iin zel bir kaynak dosyas oluturacaz. Yalnz dikkat etmemiz gereken nokta u : bu ekilde hazrlanacak bir kaynak dosyasna resimleri ekleyemiyoruz. Eer kaynaklarmz sadece yazlar ise bu yntemi kullanyoruz. Eer kaynak olarak resim eklemek istiyorsak birazdan anlatacam ResourceWriter snfn kullanarak basit bir program yazacaz. imdi aadaki terimler.txt dosyasn oluturun.Pointer = GstericiFunction = FonksiyonArray = DiziTemplate = ablon

yazilar.txt

imdi resgen.exe yardmyla yazilar.txt den yazilar.resources adl kaynak dosyay oluturalm. resgen.exe yi altrmak iin Start-> Programs -> Microsft Visual Studio.NET -> Visual Studio.NET Tools -> Visual Studio.NET Command Prompt yolunu kullanabilirsiniz. Konsol ekranna

resgen yazilar.txt

yazarak yazilar.resources dosyasnn olumasn salayan. yazilar.resources dosyasn bu ekilde kullanabileceimiz gibi XML formatnda bir kaynak dosyas da oluturabiliriz. Bunun iinde konsol ekranna aadaki komutu yazn.

resgen yazilar.resources yazilar.resx

Kaynak dosyalarnn nasl kullanldna gemeden nce resimlerin de eklenebilecei bir kaynak dosyas hazrlayan bir program yazalm. Bu programda yukarda da dediim gibi System.Resources isimalan altnda bulunan ResourceWriter snfn kullanacaz. Bunun iin aadaki program yazyorum.

using System;using System.Drawing;using System.Resources; class Class1{static void Main(string[] args){ResourceWriter resw = new ResourceWriter("yazilar2.resources");Image resim = Image.FromFile("logo.gif");

string anahtar,deger;for(int i=0 ; i karmaList'in elemanlar ve trleri "+ yigin1.Equals(yigin2));//yigin2'yi kopyalamak iin yeni bir dizi oluturalm:Array arr = new Array[5];// yeni oluturduumuz diziye yigin2'yi kopyalayalm:arr = yigin2.ToArray();// arr nesnesinin elemanlar:Console.WriteLine( "\n\n arr nesnesinin elemanlar:\n"+ "\n\t"+arr.GetValue(0)+ "\n\t"+arr.GetValue(1)+ "\n\t"+arr.GetValue(2)+"\n\t"+arr.GetValue(3)+"\n\t"+arr.GetValue(4) );Console.ReadLine();}public static void ElemanlariYaz(Stack yigin){object obj = new Object();Stack yeniYigin = (Stack)yigin.Clone();if(yigin.Count!=0){ while(yeniYigin.Count>0){obj = yeniYigin.Pop();Console.WriteLine("\t"+ obj.ToString());}} else Console.WriteLine("Yn bo...!");}}

Yazmzda bilgisayar programlama alannda en nemli veri yaplarndan biri olan ynlarn (Stack) nasl altklarn ve .NET snf ktphanesinde bulunan Stack snfn ve metodlarnn nasl iimize yarayacak ekilde kullanabileceimizi rendik. Umarm bu yaznn size gerek manada yarar olur.C#'ta Gsterici(Pointer) Kullanmak I

Gstericiler(Pointer) alt seviye programlama iin olmazsa olmaz yaplardr. Gstericiler nesnelerin bellekte tutulduklar adresleri saklayan veri yaplardr. Bu makalede C#'ta kullanm ok fazla gerekli olmayan gstericilerin nasl kulanldklarn inceleyeceiz. Bu yaz gstericiler hakknda temel bilgilere sahip olduunuzu varsaymaktadr.

.NET' in altyapsnda gsterici kavram sklkla kullanlrken gstericilerin akca kullanm programclar iin gizlenmitir. Bunun nedeni gsterici kullanmnn programlardaki grlemeyen hatalara ska yol aabilmesidir. zellikle dili yeni renenler iin gsterici hatalar iinden klmaz bir hale gelebilmektedir. C#'ta gstericiler yerine referans deikenleri mevcuttur. Referanslar heap bellek blgesindeki nesnelerin balang adresini tutar. Ancak bu adresin deerine kesinlikle ulaamayz. Oysa C ve C++ dillerinde stack blgesindeki deikenlerin de adreslerine eribilmemiz mmkndr. stelik deikenlerin adreslerini rnein 0x965474 eklinde elde etmemiz bile mmkndr. C ve C++ programclarna pek yabanc gelmeyecektir bunlar, ancak programlama dnyasna C# ile giren biri iin gstericilere neden ihtiya duyabileceimiz pek anlaml gelmeyebilir. unu da syeleyelim ki ok istisnai durumlar dnda gstericilere ihtiyacmz olmayacak, peki bu istisna durumlar nelerdir? Geriye Uyumluluk(Backward Compatibility) : COM ve WinAPI'deki fonksiyonlar gibi sk sk gsterici kullanan fonksiyonlar C# ile programlarmzdan arabilmek iin parametre olarak gsterici alan fonksiyonlara gsterici gndermemiz gerekebilir. Eer C# ta gsterici kullanmna izin verilmemi olsayd tr uyumsuzluu yznden gsterici kullanan eski COM ve DLL'lere eriebilmemiz mmkn olamazd. Performans : C ve C++ dillerinin gnmze kadar ok popler olmasnn altnda yatan nedenlerden biri de bellee direkt eriimi salad iinperformansn inanlmaz derecede ykselmesidir. Bizim iin performansn ok nemli olduu yerlerde gsterici kullanmamzdan daha doal birey olamaz. Alt Seviye lemler : Donanm arayzleri ile direkt bir iliki ierisinde olacak programlarda gstericilerin kullanm mecburi gibidir. Bazen de bellee kullanclarn direkt eriebilmesi gereken programlar olabilir. Bu durumlarda da gstericilerden faydalanabiliriz.

Btn bunlarn yannda gsterici kullanmann bir ok skntyda beraberinde getirecei kesindir. ncelikle kullanmnn zor olmas ve kestirilmesi zor olan hatalara yol aabilmesi bu skntlarn en banda gelenidir. Zaten C#'ta gsterici kullanacamz zaman kodu unsafe(gvensiz) anahtar szc ile iaretlememiz gerekir. Aksi halde program derlenemeyecektir. Normal bir metot iinde gsterici kullanm yasaklanmtr.

imdi de unsafe anahtar szcnn kullanmna rnekler verelim.

1-) unsafe olarak iaretlenen snflarn btn metotlarnda gsterici kullanabiliriz. unsafe class Snf{

}

2-) Normal bir metot iinde herhangi bir blou unsafe olarak aadaki gibi iaretleyip dilediimiz gibi gsterici kullanabiliriz. unsafe bloklarnn dnda ise gsterici kullanamayz.int NormalMetot(int a, string str){unsafe{

}}

3-) Normal bir metodu unsafe olarak iaretleyip sadece o metodun iinde de gsterici kullanabiliriz.unsafe int NormalMetot(int a, string str){

}

4-) Bir snfn ye deikenlerinden biri unsafe olarak iaretlenip gsterici olarak bildirilebilir. Ancak bir metot ierisinde yerel bir gsterici tanmlanamaz. Yerel bir gsterici tanmlamak iin unsafe olarak iaretlenmi metod yada blok kullanlr.class Snf{unsafe char *ptr;}

Gsterici Tanmlama ve Gsterici Operatrleri

Gstericiler aadaki gibi tanmlanabilir.

char* ptr1, ptr2; int* ptr3;

ptr1 ve ptr2 char trden bir gsterici iken ptr3 int trden bir gstericdir. Bir gstericide iki bileen vardr. Bu bileenlerden birincisi adres bileenidir. Adres bileeni nesnenin bellekte bulunduu balang adresidir. kinci bileen ise tr bileenidir. Bu bileen ise ilgili adresteki nesneye ulamak istediimizde bellekten ne kadarlk bilgili okunacan salar. rnein int trden bir adresteki bilgiyi okumak istediimizde 4 byte'lk bir bilgi okunacaktr, ayn ekilde char trden bir gsterici ise 2 byte'lk bir bilgi okunacaktr.

& operatr

Adres operatr olarak bilinen bu operatr deikenlerin veya nesnelerin bellekte bulunduklar adresleri elde etmek iin kullanlr. Bu operatr hangi tr deikenle kullunlrsa o trden bir gsterici retilir.

* operatr

erik operatr olan *, bir adresteki bilgileri elde etmek iin kullanlr. Aadaki programda bu iki operatrn kullanmna bir rnek verilmitir.

using System;class Class1{unsafe static void Main(){int* ptr1;char* ptr2;

int a = 50;ptr1 = &a;int Adres = (int)ptr1;Console.WriteLine("{0:X}",Adres);char ch = 'A';ptr2 = &ch;*ptr2 = 'B';Console.WriteLine(ch);}}

Bu program derleyebilmek iin komut satr derleyicisene programn iinde unsafe blounun olduunu belirtmemiz gerekir. Bunun iin komut satrna

csc /unsafe KaynakKod.cs

yada

csc -unsafe KaynakKod.cs

yazarak program derleyebilirsiniz. Eer Visual Studio.NET kullanyorsanz projeye sa tklayp proje zelliklerine gelip Build ksmndan "Allow unsafe code blocks" ksmn true olacak ekilde deitirin.

Program altrdnzda ekrana a deikeninin adresi ve B karekteri yazlacaktr. Adres bilgisini ekrana yazdrmadan nce gstericide tutulan adresi normal bir tre nasl dntrdmze dikkat edin. Bunu yapmamzn sebebi Consol.WriteLine() metodunun gsterici parametres alan versiyonunun olmamasdr.

C#'ta tr gvenliinin ne kadar nemli olduunu vurgulamak iin aadaki deyimleri rnek verebiliriz.

int* ptr1;*ptr1 = 50;

Bu deyimleri ieren bir program derlenemeyecektir. nk ptr1 gstericisinde hangi adresin tutulduu belli deildir. Bu yzden adresi belli olmayan bellek blgesine bir deer yerletirmek imkanszdr. C ve C++ dillerinde bu kullanm tamamen geerlidir. Ama gelin bir de bunun sakncasna bir gz atalm. ptr1 gstericisi tanmlandnda ptr1 de rastgele bir adres deeri bulunmaktadr. Bu adreste rastgele bir adres olduu iin o an bellekte alan kendi programmzdaki bir deikenin adresi bile olabilir. Yada sistemde alan baka bir prosesteki elemanlarn adresleri olabilir. Kaynan bilmediimiz bir adresteki deeri * operatr ile deitirdiimizde hi tahmin edemeyeceimiz alma zaman hatalar alabiliriz. in kts adresler rastgele olduu iin programmzn test aamasnda bu hatalar olumayabilir. Adresler nasl rastgele ise hatalarn olumas da rastgeledir. Programmz piyasada iken byle bir hatann farkna varlmas i maliyetlerini ne kadar artrdn siz tahmin edin artk. Btn bu dezavantajlar gstericilerin asla gereksiz olduu anlamna gelmemelidir. Sadece gstericileri kullanrken daha dikkatli davranmamz gerektiinin gstergesidir.

Gstericiler arasnda tr dnmleri mmkndr. rnein int trden bir gsterici char trden bir gstericiye aadaki gibi dntrlebilir.

char* ptr1int* ptr2;

ptr1 = (char*)ptr2

Ayn ekilde bir gsterici de tamsay trlerine dntrlebilir. Adresler tam say trnden birer say olduklar iin bunu yapabilmemiz son derece normal bir durumdur. Bir nceki alan programda da Console.WriteLine() metodu ile ekrana yazmak istediimiz nesnenin adresini tamsay trlerinden birini evirdiimizi hatrlayn. rnein aadaki deyimleri ieren bir program derlenemeyecektir.

char* ptr1char ch = 'A';ptr1 = ch;

Console.WriteLine(ptr1)

Gstericilerle ilgili dier nemli yap ise void gstericilerdir. void olan gstericilerde tr bilgisi saklanmamaktadr. void gstericilere herhangi bir trden gsterici atanabilir. void gstericiler daha ok eskiden yazlm API fonksiyonlarnda void parametre alan fonksiyolar programlarmz ierisinden armak iin kullanlr. void gstericilerin kullanmna aada bir rnek verilmitir.

int* ptr1;void * x;x = ptr1;

sizeof operatr

sizeof operatr temel trlerin ve yaplarn bellekte ne kadar alan kapladklarn verir. rnein sizeof(int) = 4, sizeof(char) = 2 ' dir. sizeof operatrn snflar iin kullanamayz ancak tanmlayacamz yaplar iin kullanabiliriz.

Bu yaznn sonuna geldik. Bir sonraki yazmzda yap gstericileri tanmlamay snflar ile gstericiler arasndaki ilikiyi, gsterici aritmetiini inceleyip rnek bir gsterici uygulamas yapacaz.

Kaynaklar:

C# and The .NET Platform (Andrew Troelsen)Professional C# 2nd Edition (Wrox)MSDN Ktphanesi

C#-JAVA' nn Sonu mu?

JAVA'nn gn getike yaygnlaan kullanm alanlar, Microsoft firmasn gerekten g duruma drd. 1995 ylnda JAVA ufukta grnd ve getiimiz 6 yl ierisinde kendisi ile rekabet eden dier btn popler diller zerindeki stnln gsterdi. Balangta Microsoft bu duruma direndi ancak daha sonra, JAVA mehur Visual Studio nun Visual J++ ad altnda bir paras oldu. JAVA' y karan Sun Microsystems, Microsft aleyhine lisans anlamasn ihlal ettii gerekesiyle dava at ve Microsft buna karlk bir bedel demek zorunda kald.

Sonunda ortalk yatt ve Microsft Visual J++ 'n yeni versiyonlarn karmaya devam etti. Fakat Microsoft'un JAVA dilini Visual Studio paketinin iine koyma abas baarya ulaamad ve en sonunda baarz oldu. Elbette ki bu baarszlk ta pazarlamann iyi yaplamamasnn da etkisi olmutur. Sonu olarak Microsoft 1998 ylndan sonra Visual J++ iin yeni bir versiyon karmad, ve yakn bir gelecek iinde de bu tr planlarn askya ald.

Sonunda Microsft anlad ki bir yerlerden dn alnan rnler uzun vadede ie yaramayacak, bu yzden Microsoft, daha ok JAVA'ya benzeyen ancak JAVA da olmayan bir takm yeni zellikleride ekleyerek C# (C Sharp) isimli yeni bir programlama dili tasarlamaya balad. Bu makalenin amac C# hakkndaki phelerinizi gidermek ve JAVA ile karlatrmaktr.

Peki, Microsoft 'un ilgilendii bu pakette nerdikleri nelerdi?

Bu pakette Microsoft'un nerdii iki ana yap vard:

.NET MimarisiYeni bir dil - C#

.NET Mimarisi

.NET mimarisinin 3 ana bileeni vardr.

Herhangi bir dil tarafndan kullanalabilecek Web Servisi denilen yeni bir ortak servisler kmesi. Bu servisler ara kod(intermediate kod) dediimiz mimariden bamsz bir yap ierisinde altrlr. Bu ara kod daha sonra alma zamannda CLR denilen birim tarafndan altrlr, ki bu bahsedilen CLR birimi programla ilgili kaynaklar yneten ve programn almasn izleyen bir birimdir.

.NET'in birincil amac gelitiriciler asndan Web Servislerini kullanarak mimariden bamsz uygulamalar gelitirmeyi kolaylatrmaktr. rnein bir servise hem PC hem PDA hemde Mobil cihazlardan eriebilme gibi.

imdi bu yaplar tek tek inceleyelim.

Web Servisleri

Web Servisleri internet standartlar olan XML ve HTTP zerinden hizmet verebilen yaplardr. Daha teknik bir dille sylemek gerekirse, web servisleri internet zerinden eriilebilen bir ktphane, bir fonksiyon yada bir veritaban gibi dnlebilir. rnein; bir web servisi herhangi bir irkete ait bir yllk ciroyu hesaplayp veren bir fonksiyon ierebilir. Bu fonksiyon parametre olarak bir yl deeri almaktadr. Dolaysyla istemci uygulamamz geri dn deeri 2000 ylna ait ciroyu Yllk_ciro(2000) gibi bir fonksiyonu ararak elde edebilir.

Aslna bakarsanz bir firmada farkl platformlara ynelik hazrlanm uygulamalar arasnda ki senkronizasyonu salamak amacyla Web Servisleri kullanlabilir. Buna ramen Web Servisi kelimesindeki "Web" szc ile internet ortamnda web servislerinin kullanmn n plana karmak iin kullanlmtr. Fakat normal ugulamarda da ou durumda Web servsilerinden faydalanmamz mmkndr.

Web servislerinin en gzel yani servisin her yerden istenebilmesidir. Ksacas web servisi uygulama alanlarna Windows, Linux, Unix, Mac-Os gibi platformlarn yansra komut satrndan alan dier ortamlar bile girebilir. Yani Web servisleri sayesinde platform bamsz uygulamalar gelitirebiliriz. nternet standartlarnn platform bamsz olmas ve web servislerininde internet zerinden arlmas, web servislerinin herhangi bir iletim sisteminin yada programlama dilinin tekelinde olmamasn salamtr.

Ara Kod(ntermediate Code)

Ara kod! Kulaa pek ho gelmiyormu? Bu bana bireyi hatrlatyor....hmmm..... JAVA? Evet, elbette. Microsoft ak bir ekilde .NET ile JAVA' nn alma platformundan esinlendiini kabul etti bylece. .NET ortamnda, programlar bir ara dil zerinden ikili koda evrilir. letim sisteminden ve donanmdan bamsz olan bu dile MSIL(Microsft Intermediate Language) denir. (evirenin notu: MSIL artk IL olarak anlmaktadr.) IL kodu, JAVA platformundaki JVM de olduu gibi CLR tarafndan derlenip makina koduna evrilir. IL kodunu makine koduna eviren derleyicilere ise JIT(Just In Time) derleyicileri denilmektedir.

IL kodu eklinde derlenmi bir uygulamaya tanabilen altrlabilir(Portable Executables) uygulama denir. CLS nin art btn dillerin ortak bir noktada toplanmasn salayacak kurallar oluturmaktr. Ancak burada bir problemle karlald, oda btn dillerin farkl semantik yapya sahip olmasdr, rnein her dilin farkl zellikleri olabilir, baz diller prosedrel teknii destekler, bazlar nesne ynelimi tekniini destekler, bazlarnda operatr ykleme varken bazlarnda yok, ve dierleri.

Bir dilin .NET uyumlu olmas iin CLS(Common Language Specification) standartlarna uymas gerekir. Dolaysyla bir dilin .NET ortamna uyumlu olmas iin salamas gereken iki koul vardr:

CLS ile uyumlulukKaynak kodu IL koduna evirecek derleyici

Peki yukarda bahsedilen komplek yap bize ne kazandracak? Diller aras alma? Btn .NET uyumlu dillerde yazlm kodlar ara koda evrilecei iin herhangi bir dil de yazlm bir nesneyi baka bir dilde yazdmz programda oluturabiliriz. rnein .NET uyumlu C# dilinde yazlm bir snf ile, VB programcs bir nesne oluturabilir.

Peki JAVA'nn bu durumdaki rol ne? Yada Microsoft JAVA y devre dm brakt? Tam olarak deil. JAVA nn .NET dilleri arasnda olmas dnld. JAVA kodunu IL koduna evirecek derleyici Rational firmas(nl UML yazlm gelitirme aracn gelitiren firma) tarafndan hazrlanmaktadr.(Not: bu yaznn yald tarihte JAVA derleyicisi yeni yazlyordu). Peki bu eskisiyle ayn JAVA m olacak? Aslna bakarsanz hayr. JAVA kodlar artk byte kod yerine IL koduna evrilecek.Yeni JAVA, J2EE'nin salad RMI, JMS, JDBC, JSP vs gibi API' lerden faydalanamayacak.Yeni gelitirilen JAVA ile EJB mant yerini .NET'in datk nensne modeline brakmtr.

CLR(Common Language Runtime)

Yukarda da bahsettiim gibi CLR, konsept olarak JVM(Java Virtual Machine)'ye ok benzemektedir. JVM bellek ynetimi iin kaynaklarn dzenlenmesi, gereksiz bilgi(p bilgi) toplama ve iletim sistemi ile uygulama arasndaki iletiimi salayan bir birimdir.

CLR, dizilerin snrlarnn almas, tahsis edilmeyen bellek alanna ulalmas, bellekteki gerekli alanlarn zerine yazlmas gibi programlarn kmesine sebep olan geleneksel hatalarn durumunu izler. Bu izleme hzllktan fedakarlk salamak demektir. Microsoft bu yntemle performansn %10 orannda deceini kabul etmitir, fakat bu sistemler devamllk ve gvenilirlik asndan daha n plandadr.

.NET Senaryoyu Sunuyor

Bu yln ortalarna doru .NET'in tam srm piyasada olacak(evirenin not: Yaznn yazld tarihe gre dnmelisiniz) Microsoft mimarisinin kullanld eski uygulamalar .NET uyumlu Windows 2000 sunucularnda hala geerliliini srdrecek. Eski mimarideki uygulamalarn yeni gelecek bu mimariye tanabilmesi iin gerekli aralarn olacan Microsft garanti etmitir, ancak bunun iyi bir zm olaca grlmyor. Halihazrdaki tamak iin gelitirilen aralarn bu ilemi %100 yapamayaca aktr. Gelitiriciler bu tama ileminden dolay epeyce bir zaman harcayacak.

.NET'in Gelecei

.NET'in gelii ile birlikte, elektronik uygulamalarn altyapsnn deimesi gerektiini inkar edemeyiz. Her dil, .NET uyumlu olmas iin yapsal bir takm deiiklikler yapmaldr. Java dilini bir dnn. Hangi Java daha tercih edilir sizce, JVM ile JAVA m yoksa .NET ile JAVA m? Bu sorunun cevabn siz okurlarma brakyorum.

Yeni Bir Dilin Douu

Microsft .NET'in 27 farkl dil desteinin olduunu iddia ediyor.(evirenin not: u an bu dillrein says daha fazla) Bir dili .NET uyumlu hale getirmek dilin varolan mimarisine yeni yamalar eklemek demektir. Microsft bu durumu deerlendirerek temel olarak .NET mimarisi hedef alnarak yeni bir dil tasarlad. Bu dilin ad C-Sharp yada C#. Bu dili daha ok JAVA y andryor olmasna ramen var olan dier dillerden de gzel zellikler alnp C# diline eklenmi gibi gzkyor.

C# nedir?

Geen iki yzyl ierisinde C ve C++ dilleri ticari ve i uygulamalar gelitirmek iin en ok kullanlan diller olmutur. Bu iki dil programclara byk miktarda kontrol salamasna ramen, retim asndan ok olanak salamyordu.

Bu dilleri Visual Basic gibi dillerle karlatrdmzda ayn uygulamy gelitirmenin C ve C++ dillerinde daha fazla zaman ald bir gerektir. Yllardan beri istenilen tek ey gllk ve retim hznn arasnda bir denge kuracak bir dilin olmasyd. Getiimiz yllarda bu problem Sun Microsystems tarafndan anlald. Ve dier dillerin alma mantndan tamamen farkl olan JAVA dilini gelitirdi. Bytecode konsepti, JVM ve ak kaynak kod vs ve sonu olarak bedeva olmas bu farkllklardan bir kadr.

Fakat unutulan bir ey vard. JAVA ile yazlan kodlar baka dillerde kullanlamyordu. Tekrar kullanlabilirlik denen bu zellii JAVA desteklemiyordu. Bylece, tekrar kullanlabilirlii standartlatracak bir ortamn gereklilii ortaya kt. Bu ortam .NET ile saland, zira .NET ile uyumlu dillerin salamas gereken CLS standartlar mevcuttur. Fakat daha ncede dediim gibi .NET ile tam uyumlu alacak ve dier dillerin gzel zelliklerini salayacak yeni bir dile ihtiya vard.

Hakknda konutuum bu dil C-Sharp diye okunan C#'tan baka birey deildir.

C#, modern, nesne ynelimli, tip gvenliine byk nem veren, temel hesaplama ve haberleme gibi geni bir yelpazedeki uygulamalar gelitirmek iin .NET platformu iin tasarlanm yeni bir dildir.

C#, C++ programclarnna retkenlii ve C++ dilinin gllnn gstergesi olan kontrol mekanizmalarndan taviz vermeden hzl bir ekilde uygulama gelitirme olana tanmaktadr.

C# ve JAVA'nn Karlatrlmas

yi bir dilin salamas gereken eyler nelerdir? Yada programclarn gnln kazanmak iin bir dil yapsnda neyi barndrmaldr? Bu sorular on yllardan beri dil tasarmclarnn zerinde durduu tartmaya ak sorulardr. Btn programclar tarafndan ittifakla kabul edilmitir ki, bu sorularn cevabn en iyi ekilde veren dil JAVA'dr. C#, sentaks olarak JAVA'ya ok benzemektedir, ancak derinlerine daldka Microsoftun bu dili tasarlamak iin ok efor sarfettiini ve bu yeni eklenen bu zellikler iin Microsoft'a teekkr etmemiz gerektiini anlarz.

imdi isterseniz JAVA nn zelliklerini tek tek ele alp bunlar C#'n ilgili zellikleriyle karlatralm.

Intermediate Language(Ara dil)

JAVA kaynak kodu byte koduna evirirken C# MSIL(IL) koduna evirir. IL dili .NET uyumlu btn dillerde yazlm olan programlarn ortak olarak derlendii dildir. Fakat IL ve Byte Kod'un alma mantnda ince bir farkllk vardr. JAVA daki bytecode'lar yorumlanrken IL kodu derlenerek makina koduna evrilir.

Interoperability (Diller aras uyumluluk)

JAVA'nn gc platform bamsz olmasndan kaynaklanmaktayken C# ayn zamanda diller arasndaki uyumluluuda salar. Yani dil bamszl. Gzel!. imdi bunlar biraz daha aalm: JAVA ile yazlm bir program JVM'nin olduu btn sistemlerde almas szkonusu iken, C# ile yazlan bir kod dier .NET uyumlu diller tarafndan tekrar kullanlabiliyor. rnein bir dilde yazlan snf, dier .NET uyumlu diller ile rahatlkla kullanlabilir.

Bellek Ynetimi

JAVA otomatik bellek ynetimi salamaktadr.(daha teknik bir deyimle gereksiz bilgi toplama mekanizmas denir.) Bu zellik programclar tarafndan takdirle karlanmtr. Fakat eski C/C++ programclar JAVA diline gemeye alnca bu zellik onlar rahatsz ediyordu. Bu tr programclarn problemlerini da gz ard etmeden, C# otomatik bellek ynetiminin yannda programcnn bellei kendisininde ynetmesini salayan sistem sunmutur. Ne demek bu? Basit. C#' ta hala pointer kullanabiliyoruz. (evirenin Notu: Mthi!)

Harici Kodlara Referans

Harici kodlar C# ve JAVA'da benzer ekilde ele alnmtr. JAVA dilinde import anahtar kelimesi kullanlrken C# ta using anahtar kelimesi kullanlmaktadr. JAVA paket(packages) kullanrken, C# isim uzaylar(namespace) kullanr. Fakat bunlarn anlamlar aa yukar ayndr.

Veri Tipleri

Bir dilin gc, dilin destekledii farkl veri trleri tarafndan belirlenir. Veri tipleri programclara gll ve esneklii salayan varlklardr. C#, JAVA daki btn veri tiplerini salamtr, bunun yansra JAVA da olmayan baz trler de eklenmitir, rnein baz iaretsiz(unsigned) veri trleri JAVA da yoktur. Ayrca C# ta kayan noktal(floating point) bir veri tr olan 12 byte'lk decimal tr de mevcuttur.

Alan Dzenleyicileri (Field Modifiers)

C# taki Alan dzenleyicileri temel olarak JAVA dilindeki gibidir. Deitirlemeyen yada sabit bir deiken tanmlamak iin JAVA daki final dan farkl olarak read only ve const belirleyicileri kullanlr. const olan alan dzenleyiciler, ilgili deerin IL kodunun bir paras olduu ve sadece alma zamannda hesaplanaca anlamna gelir.

Kontrol Mekanizmas Oluturma

if-else, switch, while, do-while, for, break, contine deyimleri her iki dilde ayndr. Fakat C# ta yeni bir kontrol daha vardr. C# taki bu yeni yap koleksiyonlar arasnda dolamak iin gerekli olan for each yapsdr.

int slist(Arraylist alist).foreach (int j in alist){.}

Yukardaki yapda j dng deikeni olarak adlandrlr. Bu dng deikenine her iterasyonda alist dizisinin int trden olan eleman atanr.

Arayz ve Snf Bildirimi

JAVA daki extends ve implements anahtar szckleri C# te yerini iki nokta iaretine(:) brakmtr.

stisnai Durumlar Ele Alma(Exception Handling)

C# ta catch bloundaki argman istee baldr. Eer catch ile argman belirtilmemise, bu catch blou try blounda frlatlacak herhangi bir hatay yakalamak iin kullanlr. Btn catch blouda C# ta kullanlmayabilir. Ayrca C# ta throws(evirenin not: throw ile kartrmayn) anahtar szc yoktur.

Arayzler

C# ta bir snf istee bal olarak akca bir arayz uygulayabilir. Akca uygulanan metotlar arayz ve snf arasndaki tr dnm sayesinde arlabilir.

Kaltm

JAVA ve C# ta sadece tekli tretme mevcuttur. Eer oklu tretme yapmak gerekiyorsa arayzleri kullanmak tek yoldur.

ok Biimlilik(Polymorphism)

Sanal metotlar ok biimlilii gerekletirmek iin kullanlr. Bunun anlam taban snflarn, tremi snflara ait ar yklenmi metotlar arabilmesidir. JAVA da btn metotlar sanaldr, fakat C# ta tremi bir snftaki metodu taban snf ile arabilmek iin metodun akca virtual anahtar kelimesi il iaretlenmesi gerekir. C# ta override anahtar kelimesi bir metodun treyen snfta yeniden yazlacan bildirmek iin gereklidir. Sanal olmayan bir metodu yeniden uygulamaya almak derleme zaman hatasna yol aacaktr. Fakat eer tremi snftaki metot new anahar szc ile iaretlenirse program hata vermeden derlenecektir.

Pekala, sonu nedir? C# te yeni bir ey bulabildinizmi, yoksa JAVA nn vey kardei gibi mi duruyor? Microsoft bu urann karln ilerde alacakm? Yeni bir dilin var olan uygulamalar zerinde, deiik platformlarda hatta programclar zerindeki etkisi ne olacak? Bu can alc sorularn cevabn ancak zaman verebilir. Fakat bu arada beyninizde bu sorular yava yava zn ve dnn. C# gerekten JAVA nn sonumu?----------------------------

Bu makale http://www.csharphelp.com/archives/archive86.html adresindeki yazdan Trkeye tercme edilmitir.

C# ile Zamanlayc Kullanmak (System.Timers)

Windows programlama ile uraanlar Timer kontroln sk sk kullanmlardr. Bu yazda System.Timers isim alannda bulunan Timer snf ile bir programdaki rutin olarak yaplmas gereken ileri belirli bir zaman aral iinde ne ekilde yapabileceimizi reneceiz. Ancak alalgelmi ekilde bir grafik arayz olan program yerine uygulamamz komut satrndan alacak ekilde gelitireceiz. Burdaki amacmz zamanlayc dediimiz timer nesnelerinin alma prensibini yakndan grmektir.

yle bir konsol uygulamas yapmanz gerektiini dnn. Her 5 dakikada bir, belirli bir kaynaktaki deiiklikler kontrol edilecek. Eer kaynakta bir deiiklik varsa kullancya uyar verilecek. Bunu klasik yntemlerle ne ekilde yapabilirdiniz bir dnn? Yada ben syliyeyim. Muhtemelen sonsuz bir dng ierisinde sistem saatini kontrol edip belirli bir aralk gemi ise kayna kontrol eden ilevi aracaktnz. Eer zamansal bir ilem yapyorsak ki bir olay bir zaman dilimi iinde srekli gerekletirmek zamana bal bir olaydr; mutlaka sistem saatinden faydalanmamz gerekir. Sistem saatini makine dzeyinde ileyen bir birim olarak dnebilirsiniz. Bilgisayar bilimlerinde bir ok algoritma sistem saati zerine kurulmutur. Zatan eer zaman lebilecek bir birim olmasayd u anki teknolojik imkanlara kavumamz mmkn olamazd. Sonu olarak zaman ne kadar deerliyse zaman lebilmek te o derece nemlidir.

Bu yazda bir metodu bir zaman dilimi ierisinde tekrar tekrar armay reneceiz. Bunun iin System.Timers isim alannda ki Timer isimli snf kullanacaz. Timer snfnda bulunan Elapsed olay timer nesnesinin Interval zellii ile belirlenen aralkta altrlacak metodun referansn tutmaktadr. Metodun referans Timer snfnn iindeki delegate(temsilci) ve olay(event) veri yaplar ile salanmaktadr. (Delegate ve Event veri yaplar ile ilgili ayrntl yazlar ileriki zamanlarda yaynlanacaktr.)

imdi isterseniz Timer snfnn yapc metotlarn inceleyelim.Timer snfnn iki tane yapc metodu vardr. Bu metotlardan birincisi herhangi bir parametre almamaktadr. kincisi ise double trden bir parametre almaktadr. Double trden olan bu parametre Timer nesnesinin Elapsed olaynn ne kadar srede meydana geleceini belirtmektedir. Bu metodun prototipi aadaki gibidir.

public Timer(double TickSays)TickSayisi milisaniye cinsindendir. rnein her 1 saniyede almasn istediimiz bir metot iin TickSayisi 1000 olan bir Timer kullanmamz gerekir. Saniyede on defa almasn istediimiz bir metot iin ise TickSayisi 100 olan bir Timer nesnesi kullanmalyz. Eer yapc metot herhangi bir parametre ile kullanlmaz ise varsaylan TickSayisi olan 100 ile Timer nesnesi oluturulur.

alma zamannda timer nesnelerinin TickSayisini deitirmek yada Tick saysn renmek iin Interval zellii kullanlabilir. Timer nesneleri varsaylan olarak aktif deillerdir. Bu yzden Timer nesnelerinin ileyebilmesi iin bool trden olan Enabled zelliinin true olarak ayarlanmas gerekir. Yada Timer snfnn Start() metodunu kullanarak zamanlaycy balatmanz gerekmektedir.

Timer snf ile ilgili en nemli nokta Interval ile belirtilen sre dolduunda hangi metodu aracan nerden anlayacadr. Bunun iin temsilciler ve olaylar kullanlr. Timer snf tasarlanrken yapsnda tanmlanan event ve delegate veri trleri ile bu mmkn olmaktadr. Timer snfnn Elapsed olay bu ie yaramaktadr. Elapsed olayna += operatr ile olay yneticisi yardmyla(event handler) yeni metotlar ekleyebiliriz. Timer snfnn Elapsed olay iin ElapsedEventHandler isminde zel bir temsilci tanmlanmtr. Bu temsilci nesnesine parametre olarak verilecek metodun parametreik yaps aadaki gibi olmaldr.

SaniyelikIs(object o, ElapsedEventArgs a)ElapsedEventArgs snf Timer nesnesi ile ilgili ayrntl bilgiler tutmaktadr. rnein ElapsedEventArgs snfnn SignalTime zellii ile Elapsed olaynn meydana geldii saati ve tarihi renebiliriz. rneimizi verdikten sonra ElapsedEventArgs snfn daha iyi reneceksiniz.

Timer snfnn dier bir nemli eleman ise Stop() metodudur. Bu metodu ardmz anda Timer nesnesinin Elapsed olay artk meydana gelmez. Stop() metodu yerine Timer nesnesnin Enabled zelliini false yapmak ta dier bir zmdr.

Timer snf ile ilgili bu bilgileri verikten sonra bir rnek ile bilgilerimizi pekitirelim. rneimiz de her saniye de saati ekrana yazadracak bir metot bildireceiz. Bu metot bir Timer sayesinde her saniye arlacaktr. rnein kaynak kodu aadaki gibidir.

using System;using System.Timers;class Zamanlayici{static void Main(){Timer t = new Timer(1000);t.Elapsed += new ElapsedEventHandler(SaniyelikIs);t.Start();while(true){}}static void SaniyelikIs(object o, ElapsedEventArgs a){Console.WriteLine(DateTime.Now);}}Timer snfnn ilevini grebilmek iin programmzn en az be on saniye almasna devam etmesi gerekir. Bunun iin while(true) eklinde sonsuz bir dng kurduk. Eer bu sonsuz dng olmasayd programn icras bir saniyeden ksa bir srede bitecei iin Elapsed olay meydana gelmeyecekti. Programn almas srasnda elde edilmi bir ekran grnts aadaki gibidir.

Ekran ktsndan da grld zere her saniyede ekrana yeni saat deeri yazld iin programmz bir saat gibi almaktadr.

SaniyelikIs() metodunu ElapsedEventArgs snfndan dolay aadaki gibi de yazabilirdik. ElapsedEventArgs snfnn SignalTime zellii Elapsed olaynn meydana geldii zaman vermektedir.

static void SaniyelikIs(object o, ElapsedEventArgs a){Console.WriteLine(a.SignalTime);}Timer snfn kullanrken karlaabileceimiz en byk sorunlardan biri Elapsed olaynn meydana gelme aralnn olaydan sonra altrlacak kodlarn icras iin geen zamandan az olmasnda grlr. Bu sorun, ikinci Elapsed olay meydana geldiinde birinci Elapsed olayna ilikin kodlar halen alyor durumda olmasndan kaynaklanr. rneimizdeki Timer nesnesinin Tick saysn 1000 yerine 100 yaptmzda ayn saat deerinin 10 defa ekrana yazdrlmas gerektiini anlarz. nk Elapsed olay her saniyede 10 defa gerekleecektir. Her 10 Elapsed olay gerekletiine bir saniye geecei iin ekrana ayn saat deeri 10 defa yazmaldr diye dnrz. Ama bunun gerekte byle olmadn grrz. Ti