C# System namespace (System İsim Alanı)

Merhaba arkadaşlar,

Bir önceki yazımda C# programlama dilinde bulunan İsim Alanlarından (namespaces) bahsettik. Kısacası isim alanlarını hatırlayacak olursak, programlamada yazdığımız kodları mantıksal olarak organize etmek için kullandığımız bir yöntem. C# namespaces (İsim alanları) yazıma buradan erişebilirsiniz.

Bu yazımda aslında biz farkında olmasak bile Console uygulaması başlattığımızda, projelerimize sınıf, arayüz vs.. eklediğimizde otomatik olarak using anahtar sözcüğü ile gelen System alan adını fark etmişsinizdir. İşte bu yazımda C# programlama dilinde System İsim Alanını ele alacağız.

Bu yazıda bahsedilecek konular

  • System İsim Alanı
    • Temel Tür Yapıları
  • Tarih ve Zaman İşlemleri
  • BitConverter Sınıfı
  • Convert Sınıfı
  • Buffer Sınıfı
  • GC (Garbage Collector) Sınıfı

System İsim Alanı

System isim alanı yaygın olarak kullanılan değer ve referans veri türleri (value & reference data type), olaylar ve olay işleyicilerin (events & event handlers), arayüzler (interfaces), öznitelikler (attributes) ve işleme sırasındaki istisnaları tanımlayan ana ve temel sınıfları içerir.

System İsim alanında bulunun birtakım faydalı kütüphaneler var. Bu başlık altında C# programlama dilinde tarih ve zaman ile ilgili DateTime, TimeSpan yapısını, gereksiz nesne toplayıcısı olan GC (Garbage Collector) sınıfını, değişkenlerin bitleri ile ilgili işlem yapmak için kullanılan BitArray sınıfını, türler arasında dönüşüm yapan Convert sınıfını ve bellek işlemlerinde bulunan Buffer sınıflarını ele alacağız.

Temel Tür Yapıları

C#’ta temel veri türleri aslında System isim alanında bulunan çeşitli yapı türlerini temsil ettiğini söylemiştik. Yani int, bool, decimal gibi anahtar sözcükleri birer takma (alias) isimdir.

Her bir temel türün System isim alanında bulunun karşılığı

C#’ta Takma AdıSystem İsim Alanındaki Veri Yapısı
boolBoolean
charChar
sbyteSByte
byteByte
ulongUInt64
uintUInt32
ushortUInt16
longInt64
intInt32
shortInt16
floatSingle
doubleDouble
decimalDecimal

Şimdi İsim Alanında bulunan bu yapı nesnelerin bazı özelliklerini ve metodunu görelim

UInt64

UInt64 yapısının tutabileceği en büyük ve en küçük sayı

Int32

Int32 Tam sayı yapıları ile ilgil en önemli metot Parse() metodudur. Parse metodu bir string değerini int türüne çevirir.

Tam sayı veri yapıları ile ilgili diğer önemli metotlar CompareTo(), Equals() ve ToString() metotlarıdır.

  • CompareTo() ile metodu çağıran nesnenin değeri ile karşılaştırılmak istenen nesnenin değerini karşılaştırır. Eğer değerler eşit ise 0, metodu çağıran daha büyük ise pozitif ve metodu çağıran daha küçük ise negatif sayı döndürülür.
  • Equals() ile metodu çağıran nesnenin değeri ile karşılaştırılmak istenen nesnenin değerini karşılaştırır. Eğer değerler eşit ise true, değil ise false döndürülür
  • ToString() metodu ile metodu çağıran nesnenin değerini string türüne çevirir.

Double ve Single

Gerçek sayı türleri ile ilgili yapılar Double ve Single yapılardır. Bu yapılar aşağıdaki özelliklere sahiptir

  • Epsilon -> En Küçük Pozitif Değer (sıfırdan farklı)
  • NaN -> Herhangi bir sayıyı temsil etmeyen
  • NegativeInfinity -> Negatif Sonsuz
  • PositiveInfinity -> Pozitif Sonsuz
  • MaxValue = En Büyük Değer, MinValue = En Küçük Değer

Double ve Single yapılarında CompareTo(), Equals(), ToString() ve Parse() metotları yanı sıra aşağıdaki metotları da içerir

Char

Bir diğer önemli veri yapısı olan Char yapısında da CompareTo(), Equals(), ToString() ve Parse() metotların yanı sıra aşağıdaki metotlar bulunur.

Boolean

System isim alanında bulunan diğer bir yapıda Boolean‘dır. Boolean yapısı C#’ta bool türüne karşılık gelir. Boolean veri yapısının iki önemli özelliği vardır. Bu özellikler FalseString, TrueString’tir. Bu özellikler de string türündendir ve False, True yazılarını içerir.

Decimal

C# dili diğer dillerden farklı olarak bir tür barındırır. Bu decimal veri türüdür. decimal türü System İsim alanında Decimal yapısı ile temsil edilir. Decimal veri türünün bellekte saklanması diğer türlere nazaran daha karmaşıktır. Bu yüzden bilgisayarların decimal veri türü ile işlem yapması daha zordur. Decimal değişkeni birçok yöntemle tanımlanabilir. Yapıcı metot yardımı ile int, uat, double ya da float türünden bir sayı ile tanımlanabilir. Bir diğer önemli tanımlama şekli ise aşağıdaki yapıcı metot ile tanımıdır.

Decimal türü bildiğimiz gibi 128 bitlik bir türdür. Bu bitlerin bir tanesi sayının işaretini, 96 biti sayının tam sayı kısmını ve geri kalan bitler ise ondalık kısmını ifade eder. Yukarıda verdiğimiz yapıcı metodu açıklarsak;

birinci parametre ile 96 bitin ilk 32 bitini, ikinci parametre ile ortadaki 32 biti üçüncü parametre ise son 32 biti temsil etmektedir. Dördüncü parametre ise sayının pozitif veya negatif olduğunu temsil eder. Son parametre ise 96 bitlik sayının kaçıncı basamağından itibaren virgül içerdiğini temsil eder. Şimdi bu bilgilere göre 145785,99 sayısını Decimal yapıcı metodu ile oluşturalım.

Decimal veri türünün de diğer veri türlerinde olduğu gibi CompareTo(), Equals(), ToString() ve Parse() metotları yanı sıra çeşitli statik metotlar vardır. Bunları incelemek için Microsoft dokümanına buradan ulaşabilirsiniz

Tarih ve Zaman İşlemleri

C# programlama dilinde Tarih ve Zaman ile ilgili işlemler System isim alanında bulunan DateTime ve TimeSpan yapıları ile yapılmaktadır. DateTime yapısı ile gün, ay, yıl, saat, dakika ve saniye gibi bilgileri elde etmek için kullanırken TimeSpan yapısı ile iki tarih arasındaki farkı temsil etmektedir.

DateTime Yapısı

DateTime yapısında kullanabileceğimiz çeşitli güzel özellikler var. Bu özellikler aşağıdaki gibidir.

TimeSpan Yapısı

TimeSpan yapısı ile iki DateTime nesnesi arasındaki farkı temsil eden bir yapıdır. Yani İki DateTime nesnesini birbirinden çıkartarak elde edeceğimiz sonuç bir TimeSpan yapısı olacaktır.

TimeSpan yapısını doğum gününden bugüne kadar geçen gün sayısını bulan bir örnek program yazalım.

Bir TimeSpan yapısı ile DateTime yapısını birbirinden çıkardığımız gibi birbirleri ile de toplayabiliriz.

DateTime ve TimeSpan yapılarında bildirilmiş birçok operatör metotlarda mevcuttur. Bu metotlar daha önce gördüğümüz aşırı yüklenmiş operatörlerdir. İki tarihin büyüklük, küçüklük karşılaştırılması (>, <) gibi. Bu yöntemleri kullanarak küçük bir örnek yapalım:

BitConverter Sınıfı

Özellikle alt seviye programlama yaparken genellikle verilerin byte dizisi şeklinde olması istenir. Bu hem hız sağlamakta hem de kolaylık getirmektedir. Bitsel operatörleri kullanarak istediğimiz veri türünü byte dizileri şeklinde ifade etmemiz mümkün ancak .Net Sınıf kütüphanesi bizim için yapacak bir sınıf BitConverter sınıfıdır.

BitConverter sınıfında bir tane özellik bulunmaktadır. Bu özellik IsLittleEndian özelliğidir. Bu özellik ile sistemimizin verileri hangi mimariye göre saklandığını kontrol eder. İki bytelik bir veri düşünelim ve bu veri bellekte iki farklı şekilde bulunabilir. Bunlardan biri yüksek anlamlı byte’ı (MSB -most significant byte) ilk sırada ya da düşük anlamlı byte (LSB- least significant byte) ilk sırada olabilir. Eğer düşük anlamlı byte ilk sırada ise bu mimariye Little Endian, tam tersi ise Big Endian denilmektedir.

IsLittleEndian özelliği ile Sistemimizin hangi mimariyi desteklediğini öğrenebiliriz. Bunu öğrenmek aşağıdaki özelliği kullanabiliriz.

BitConverter sınıfının en önemli metodu statik GetBytes() metodudur. Bu metot ile bool, char, int, long, double, short, uint, ulong ve ushort türünden değişkenlerin de değerini byte türünden bir dizeye aktarabiliriz.

Convert Sınıfı

Convert sınıfındaki statik metotlar tür dönüştürme için en çok kullanılan metotlardır. Convert sınıfı veri kaybı olmayacak şekilde bütün türler arasında dönüşüm yapabilmektedir. Temel sayı türler ile ilgili zaten hem bilinçli hem de bilinçsiz dönüşümler yapılmaktaydı.

Convert sınıfından bazı metotlar aşağıdaki gibidir. Sizler de programlama yaparken ihtiyacınız olan Convert metodunu kullanabilirsiniz.

Buffer Sınıfı

Buffer sınıfı ile tür bilgisinden bağımsız biçimde byte düzeyinde işlemler yapılır. Örneğin dizinin belirli alanının başka bir diziye aktarılması gibi. Buffer sınıfı tür bağımsız veriler üzerinde çalışırken kullanabiliriz.

public static void BlockCopy(Array kaynak, int kaynak_index, Array hedef, int hedef_index, int adet);

Yukarıdaki metot ile türden bağımsız bir şekilde kaynak dizinin kaynak_index numaralı elemanından itibaren byte’ı hedef dizisinin hedef_index elemanından sonra kopyalanır. Bu metodu kullanarak örnek bir uygulama yapalım.

Yukarıdaki örnekte iki elemanın değeri değişti ve geri kalan elemanlar sıfır oldu. Çok anlamlı değil gibi gelebilir. Bunun nedeni öncelikle short türünün 2 byte olduğunu hatırlayalım ve int türü de 4 byte yer kaplıyor. Buradan yola çıkarak short dizideki her iki eleman int dizideki her bir elemana tekabül ediyor. Yani kaynak dizide “1”, “1” iki elemanı int türündeki dizide bir elemanı temsil edecek

Kaynak dizide 4 eleman var ve ilk iki eleman ile son iki eleman 11’dir. short türünün 2 byte olduğunu düşünürsek (1byte =8bit) 1, 1 sayısının bit değeri aşağıdaki gibi olacaktır.

00000000 00000001 00000000 00000001 buda ikili binary çevirdiğimizde 65537 eder. O halde 11, 11 hedef diziye kopyalandığına göre kaynak dizide 65537 65537 yazdığını görürüz.

Buffer sınıfının ByteLength metodu ile gönderilen dizinin toplam byte sayısını döner.

GG (Garbage Collector) Sınıfı

.Net Platformunda bulunan gereksiz çöp toplayıcı (garbage collector) mekanizması programımızın herhangi bir anında kullanılmaya referans değerleri heap bölgesinden siler. GC mekanizması ne zaman devreye gireceği bilinmediğinden hangi nesnenin ne zaman sonlandırılacağı bilinmez. GC mekanizması bellek alanını optimum tutacak şekilde ayarlar. .Net platformun bize sunduğu GC sınıfı ile istediğimiz bir anda garbage collection mekanizmasının devreye girmesini sağlayabiliriz. Bunun için GC sınıfının statik metodu olan Collect() metodundan yararlanırız.

Programın herhangi bir anında o ana kadar alan tahsil edilmiş toplam bellek alanını byte cinsinden görmek için GC sınıfının GetTotalMemory(true) metodu kullanılır ve bool türünde parametre alır. Eğer bool parametre true gönderilirse bellek alanını dönmeden önce anlamsız veriler bellekten silinir. Eğer parametre false gönderilirse hiçbir şey yapılmadan toplam tahsil edilmiş bellek alanını geri döner.

Bellek yönetimini daha iyi anlamak için örnek üzerinden gidelim. Rastgele miktarda bellekte bir nesne oluşturup o anki toplam tahsil edilmiş bellek alanını yazdırdıktan sonra GC sınıfının Collect() metodunun çağırdıktan sonra bellek alanını karşılaştıralım.

Evet gerçekten de GC sınıfı ile bellekte işi bitmiş referans değerleri sildikten sonra bellek kullanım alanının düştüğünü görüyoruz.

Bir yazımın sonuna daha geldik. Bu yazımda temel düzeyde System isim alanı ve bu isim alanında bulunan sınıfları hakkında edindiğim bilgileri paylaşmaya çalıştım. System isim alanında bulunan diğer özellikleri merak ediyorsanız kaynak bölümünde bulunan Microsoft dokümanını inceleyebilirsiniz.

Bir sonraki yazımda görüşmek üzere 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/api/system.io?view=netframework-4.8

Leave a Comment