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 Yorum (0) Bu yazıya henüz yorum yapılmamış... Yorum Yaz * Ad Soyad: * Email: * Message: