26 Kas 2006 Namespace Nedir, Value ve Reference Type’ları Nedir? Kategori: C#.NET Etiketler: .NET FrameworkC# 0 Yorum Namespaces Diger .Net dilleri gibi C#'ta .NET base class library'sinde tanımlanmıs datatype'ları kullanır. Bu classlar namespace adı altında gruplanmıstır. Namespace'e diger bir tanımlama ile classları kullanırken fonksiyonel bir sekilde ulasmamızı saglayan logic containerlar diyebiliriz. Örnek olarak System.Windows.Forms namespace'i ni verebilirim namespace Desta.Deneme.DenemeClasses { public class a() { Public a(){} private string dbname; public string dbName { Get{return dbname;} Set{dbname=value;} } } } using kelimesi ile de namespaceler içerisinde bulunan classları projemize dajil etmis oluruz.. namespace using ile projeye dahil edildikten sonra herhangi bir period belirtmeden namespace içerisinde bulunan tanımlamalara ulasabiliriz. using Desta.Deneme.DenemeClasses; böylece deneme namespace içindeki tüm classlara ve içinde bulunan property ve fonksiyonlara erisebiliriz. using ile compile islemi sırasında modüller arasında herhangi bir link tanımlamıs olmayız. using ile ilgili ilginç bir sey ise onu alias type tanımlamak için kullanabilmemiz. Asagıdaki örnek System.Int32 type'ını intecir adıyla kullanmamızı saglar. using intecir=System.Int32; public class AliasOrnek { public static intecir Main() { intecir i=1; intecir j=i+1; System.Console.WriteLine(j); return 0; } } System Namespace Common Laguage Specification (CLS) bir programlama dili tarafından desteklenmesi kaçınılmaz olan bir çok datatype'ı tanımlayan zengin bir library'e sahiptir. Bu libraryde bulunan Boolean, string, integer, kronolojik ve finansal valueların hepsi System namespace'inin içerisinde yer alır. Bütün typelar object type'ından inherit edilir. Böylece bir object'in referansı herhangi bir tipdeki degiskeni tutmak için kullanılabilir. Long type'ın bit olarak büyüklügü 64'e çıkarılmıstır. Bu sayede Whistler ve XP platformlarında 64 bitlik programlar için bir hazırlık saglanmıstır. (64 bitlik olan bu isletim sistemleri Intel'in yeni nesil 64 bitlik islemcisi Itanium uyumludur) System NameSpace i birçok alt kullanıcı barındırır. System.Web HTML ve Web kontrollerini ,güvenlik, sessionstate, konfigurasyon, bölgesel ayarlar gibi metodları barındırır. System.Data Genel olarak veritabanı islemlerimiz için kullandıgımız NameSpace'dir. System.Windows.Forms Windows Forms uygulamaları için özel ayarları barındırır. System.Drawing Yazdırma ve resim isleme ile ilgili islemlerde kullandıgımız NameSpace'dir. System.XML XML islemleri için kullanılmktadır. süphesiz .Net Framework ün bize sundugu bu zengin kütüphane System NameSpace'i ile sınırlı degil. Value ve Reference Tipleri C# programlama dilinde bildiginiz gibi veri türlerini Reference Types Value Types olmak üzere iki kısma ayırıyoruz. .NET dilleri tarafından kullanılan yada yaratılan her class value ve referans tipleri olarak kategorilendirilebilir. Value ve referans tipleri iki belirgin farklılık gösterir : hafızada tutuldukları yerler ve atama islemi içeriklerdeki davranıslarına göre. Value tipler stackte tutulur, her iki value degeri için yapılmıs atama islemi ile hafızada birbirinin kopyası iki bölüm olusturulur. Referans tipler ise heap'de tutulur. Her iki referans degeri için yapılmıs atama islemi ile memory'deki tek bir yere iki ayrı referans olusturulur. Asagıdaki kod parçasında bir referans türüne ve bir de deger türüne null degerler atanmaya çalısılmaktadır. using System; namespace c1 { class c1 { static void Main(string[] args) { string refTuru=null; int dTuru=null; } } } Bu uygulamayı derlemeye çalıstıgımızda Cannot convert null to 'int' because it is a value type hatasını alırız. Aynı durumu kendi tanımladıgımız referans ve deger türleri içinde gerçeklestirebiliriz. Asagıdaki kod parçasında bu durum örneklenmistir. using System; namespace c2 { class c2 { } struct Dvd { } class C1 { static void Main(string[] args) { Kitap kitap=null; Dvd dvd=null; } } } Bu kod parçasındada aynı hatayı alırız. Çünkü struct' lar deger türüdür ve bu sebeple null degerler alamazlar. Oysaki aynı istisnai durum class gibi kendi tanımlamıs oldugumuz referans türleri için geçerli degildir. Peki deger türlerinin null deger içerme ihtiyacı ne zaman dogabilir? Bir veritabanı uygulamasını göz önüne alalım. Bu tabloda int, double gibi deger türlerine karsılık gelecek alanların var oldugunu düsünelim. Veri girisi sırasında bu int ve double degiskenleri null olarak tabloya aktarmak isteyebiliriz. Ya da tablodan veri çekerken, deger türü karsılıgı alanların null deger içerip içermedigini anlamak isteyebiliriz. Iste bu gibi durumlarda deger türlerinin null veriler içerebilecek yapıda olması, kodumuzun ölçeklenebilirligini arttıracak bir yetkinlik olarak düsünülebilir. Veritabanları için geçerli olan bu senaryoyu göz önüne almadan önce C# 2.0 için deger türlerinin nasıl null veriler tasıyabilecegini incelemeye çalısalım. Deger türlerinin C# 2.0 için iki versiyonu vardır. Nullable deger türleri ve Non-Nullable deger türleri. Bir deger türünün null degerler içerecek tipte olacagını belirtmek için ? tip belirleyicisi kullanılır. using System; using System.Collections.Generic; using System.Text; namespace TestOfNullableValues { class P { static void Main(string[] args) { int? maas; double? pi; maas = null; pi = null; } } } Yukarıdaki kod parçası sorunsuz olarak derlenecek ve çalısacaktır Asagıdaki kod ile iki value degerine atama yapılmakta ve hafızada iki deger kopyası olusturulmaktadır. (kodu derleyip çalıstırmak için /unsafe switch'ini kullanın) using System; public class Simpleclass { public static int Main() { int i; int j; i=5; j=i; Console.WriteLine("i="+i); Console.WriteLine("j="+j); unsafe { if (&i==&j) { Console.WriteLine("i ve j'nin adresleri aynı"); } else { Console.WriteLine("i ve j'nin adresleri farklı"); } } Console.ReadLine(); return 0; } } Bu kod ise iki referans degerine atama yapmakta ve hafızadaki tek kopyaya ulasmaktadır. using System; public class ReferenceType { public int MyValue; } public class SimpleClass { public static int Main() { ReferenceType i; ReferenceType j; i=new ReferenceType(); i.MyValue=5; j=i; Console.WriteLine("i.MyValue="+i.MyValue); Console.WriteLine("j.MyValue="+j.MyValue); unsafe { if (i==j) { Console.WriteLine("i ve j aynı adreste"); } else { Console.WriteLine("i ve j farklı adreste"); } } Console.ReadLine(); return 0; } } Primitives olarak adlandırılan pek çok degisken tipi C#'da value tipi olarak kabul edilir : integer value tipi gibi. Aynı zamanda struct ile tanımlamanan user tipler'de value tipinde tanımlamalardır. Bir sonraki makalemde görüsmek üzere
26 Kas 2006 C# da Karar Yapıları ve Döngüler Kategori: C#.NET Etiketler: .NET FrameworkC# 1 Yorum C# da Karar Yapıları ve DöngülerKarar Yapıları IF Program içinde karar vermek için kullanılan en basit yapıdır. If..Else deyimi bir Boolean ifadeyi degerlendirerek program denetimi belirtilen deyim gruplarına geçirir. Bir örnekle açıklamak gerekirse; Simdi kafanızda canlandırın. Tatil yapmak istiyorsunuz. Brosürlere baktınız. Elinizde 4 seçenek var. Bodrum, Fethiye, Ayvalık, Uludag ve cebinizde 40 lira var. Fiyatlara baktınız Ayvalık ve Uludag seçeneklerinin fiyatları 90 lira. Bodrum 30, Fethiye 35. Kafadan bi kere 90 lıkları elediniz. Eee bütün parayı oraya verirsek ne yicez ne içicez deyip acaba tüm masraflar dahilmi onada baktınız. Fethiyede hersey dahil. Güzel Bodruma göre 5 lira fazla olmasına ragmen daha kârlı. Evet Kararınızı verdiniz Fethiye ye gidiceksiniz. Iste karar yapıları böyle kurulur. Tabi ki burada ki yapı çok kompleks bir yapıdır. Yüzeyseldir. Programlamada her türlü olasılık bu yapılar içinde belirtilmek zorundadır. Meselâ tatilden dönünce ise gidicek parayı nerden bulacagınız gibi. Burası çok önemli bir noktadır gerçek hayatta bu hayati bir mesele olmamasına ragmen programlamada bu yapı çöker. Operatörler C# içinde operatörleri asagıdaki gibi kullanacagız. < Küçüktür <= Küçük esittir > Büyüktür >= Büyük esittir != Esit degildir = = Esittir C#'taki if deyimi C ve C++ a benzer. Eger parantez içerisindeki kosul dogru ise ilgili blokdaki program kodu execute edilir. Yapısı: if (Islem) { //Eger karsılastırma sonucu true ise execute edilir } Örnek 2: if (saat = = 24) { saat = 0; gun++ } Else C# aynı zamanda daha complex bir yapı saglamak için else de kullanır. if (Islem) { //Eger karsılastırma sonucu true ise execute edilir } else if (Islem2) { //Islem karsılastırmasının sonucu false ve // Islem2 karsılastırmasının sonucu true ise //execute edilir } else { // Islem karsılastırmasının sonucu false ve // Islem2 karsılastırmasının sonucu false ise //execute edilir } Asagıdaki örnek kod ile true yada false durumlarında programın akıs degisimi bir sekli de gösterilmistir. using System; public class IfExample { public static int Main() { bool Islem =false; if (Islem) { Console.WriteLine("Islem ’in degeri true"); } else { Console.WriteLine("Islem 'in degeri false"); } Console.ReadLine(); return 0; } } Bu örnekte ise if'in farklı bir kullanımını görülebilir. if (a) { int j=FunctionA(); } else { int j=FunctionB(); } //Asagıdaki kod yukarıdaki ile aynı islemi yapar. int j=ExpressionA?FunctionA():FunctionB(); switch.case Deyimi Switch deyimi de if deyimi gibi programın kosullara gore yönlenmesini saglar. Özellikle bir degiskenin degerine gore degisik islemler yapılacaksa o zaman Switch..Case yapısı uygun olur. Örnegin ücret degerinin belli kademelerde degisik oranlarda vergilenmesi gibi. Yapısı: Switch (degisken) { Case kosul1: Islem1 Case kosul2: Islem2 Default: Islem3 } Default etiketi, degerin herhangi bir case kosuluna uymadıgı durumlarda gidilecek deyimi belirtir. Örnek: using System; public class switchExample { public static int Main() { for (int i=1;i<10;i++) { switch (i) { case 1: Console.WriteLine("Bir"); break; case 2: Console.WriteLine("Iki"); break; case 3: Console.WriteLine("Üç"); break; case 4: Console.WriteLine("Dört"); break; case 5: Console.WriteLine("Bes"); break; default: Console.WriteLine("Sayı 5’ten büyük"); break; } } Console.ReadLine(); return 0; } } Yukarıdaki kod incelendiginde açık olarak görüldügü gibi i degiskenin alabilecegi her deger göz önünde bulundurularak kosula göre gereken islem yapılmıstır. default tanımlamadan 'yukarıda belirtilen degerlerden herhangi birisine sahip degilse' anlamı çıkarılmalıdır. switch kullanırken dikkat edilmesi gereken case ile deger bildirildikten sonra yazılan kodun en sonuna yani diger kosula geçmeden once break kullanarak compiler'a kosul tanımının bittigini söylemektir. Aksi takdirde "Control cannot fall through from one case label ('labelname:') to another" seklinde bir compiler hatası ile karsılasırız. Döngüler Loops Programlamanın diger önemli elemanlarından biri de döngü kullanımıdır. C# ile döngü kullanımı da diger programlama dillerinde oldugu gibi mantık olarak aynıdır. while Döngüsü Belirtilen kosul gerçeklesene kadar bir döngüye ihtiyacımız oldugunda kullanacagımız döngülerdir. Tek dikkat etmemiz gereken tanımlanan kosul gerçeklesmisse döngünün execute edilmesidir. Bunun nedeni kosulun döngü baslangıcında bildirilmesidir. using System; public class whileExample { public static int Main() { int i=0; //i degiskenin degeri 7’den küçükse //döngüye basla while (i<7) { i++; Console.WriteLine(i); } //i degiskenin degeri 8’den büyükse //döngüye basla deger 8’den büyük olmadıgı //için asagıdaki döngünün burada hiç bir islevi yoktur. while (i>8) { i++; Console.WriteLine(i); } Console.ReadLine(); return 0; } } do.while Döngüsü While döngüsünden tek fark olarak karsılastırmanın döngünün sonunda yapılmasıdır. Bu durumda program akısı geregi döngü durum ne olursa olsun asagıda belirtilen kosul saglanana kadar yada break keyword'ü ile döngünün kesildigi söylenene kadar execute edilir. using System; public class whileExample { public static int Main() { int i=0; do { i++; Console.WriteLine(i); if (i==5) { break; } }while (i<8); Console.ReadLine(); return 0; } } Uygulama: 1 ile 10 arası deger girilene kadar ekrandan deger okuyacak program parçasını yazın. Çözüm: do { Console.Write ("degeri girin"); deger = int.Parse (console.ReadLine()); } while (deger < 0 ½½deger >= 10); For Deyimi Bir grup deyimi belli sayıda çalıstırarak (tekrar ederek) bir döngü olusturur. Örnegin birden ona kadar (on kere) su islemi yap seklinde. Özellikle bir döngü denetim degiskenin kullanıldıgı (sayaç) bu döngü yapısı iç içe döngülerin de yapılmasını saglar. Yapısı: for (ilk deger ; kosul ; artırım ) iç deyimler Örnek: for (int i = 0; i < 10; i ++) { Console.WriteLine(i); } For...Next döngüsünde döngü degiskeni, döngünün kullanımında önemli bir rol oynar. Kullanımlardan genellikle döngü degiskeni ile bir dizinin elemanı ya da kayıt sayısı gibi degerler temsil edilir: for (int i = 0; i < 7; i ++) { Console.WriteLine(gunler[i]); } Jump Deyimleri Döngüler ve karar deyimleri görevlerini yerine getirirken, bazen çıkıs yapmaya gereksinim duyulur. C#’da goto, break ve continue deyimleri atlama deyimleri olarak bilinir. Goto deyimi program içinde belirtilen bir etikete atlamayı saglar. Ancak yapısal programlama açısında kullanımı önerilmez. Örnek: .. atla: .. goto atla; Break ve continue deyimi En yakın bloktan çıkısı saglar. Continue deyimi ise yeni bir döngüye baslar. int sayac = 1; while (true) { Console.WriteLine(sayac); sayac++; if (sayac <= 10) continue; else break; } Bir sonraki makalede görüsmek üzere. Herkese iyi çalısmalar dilerim