.NET 2.0 ile birlikte delegate(temcilsi) yapılarını da generic olarak tanımlama şansı elde etmiş olduk. Delegate, bir olay gerçekleştiği zaman bunu ilgili yerlere(metodlara) bildiren temsilcilerdir. Delegate tabanlı işlem yapılacağı zaman öncelikle delegate türünde bir temsilci metod tanımlanır ardından sözkonusu olay gerçekleştiği zaman bu temsilcinin bilgilendirme yapacağı metodlar, temsilci metodun listesine eklenir. Çalışma zamanında olay(event) gerçekleştiği zaman temsilci metod yani delegate çağrılır. Temsilci metod da hangi metodları temsil ediyorsa onları tetikler, onları gerçekleşen bu event’ten haberdar eder. Delegate yapılarını, daha sonra “Delegate & Event” konulu bir makalede işleyeceğiz. Okumaya devam et
Aylık arşivler: Mayıs 2007
Generic Türler (Generic Types) -III [Generic Koleksiyon Sınıfları]
.NET 2.0 ile birlikte nongeneric koleksiyonların generic versiyonları çıkarıldığı gibi yeni koleksiyon sınıfları da geliştirildi. Aşağıdaki tabloda yeni nesil generic sınıfları ve bunlara karşılık gelen klasik koleksiyon sınıfları gösterilmiştir. Okumaya devam et
Generic Türler (Generic Types) -II
.NET 2.0 ile birlikte gelmiş en güçlü özelliklerinden biri hiç şüphesiz C++’taki template konseptiyle benzerlik gösteren generic yapısının destekleniyor olmasıdır. .NET uygulamalarında değer ve referans olmak üzere iki tür veri türü kullanılacağını biliyoruz. Bazı durumlarda aynı değişkende hem değer hem de referans türünde veriler barındırmak isteyebiliriz. Bu durumda Framework’teki bütün veri türlerinin türediği System.Object türü kullanılır. Bütün veri türleri, temelde object türünde olduğu için bir değişkenin hem değer hem de referans değerleri koruması için değişkenin türünü object olarak set ederiz. Bu yöntem, çoğu zaman kullanışlı görünse de beraberinde performans kaybını getirir. Bir programda iyi performans sağlamanın bir yolu da geçici olarak tuttuğumuz verileri memory üzerinde en doğru tiplerle barındırmaktır. Yani integer olarak strack üzerinde korumamız gereken “456¨ değerini object türünde heap üzerinde depolamamız mantıklı bir çalışma olmaz. Ve en önemlisi object türüne değer atarken veya bu türden değer okurken, CLR değerini gerçek tipini yakalayarak boxing, unboxing işlemleri yapar. Bu da CPU bacağında ek yük oluşturmaktadır.
Bu şekilde çalışan veri türlerinin başında koleksiyon sınıfları gelmektedir. Önceki bölümlerde işlediğimiz koleksiyon nesneleri, elemanları doğrudan object türünde barındırır. Sadece numeric değerleri tutmak istesek bile bu değerler koleksiyonlar tarafından object olarak tutulur. Bu değerleri, başka işlemlerde kullanmak üzere okumak istediğimiz casting işlemi yaptırmak gerekir. Oysa veriler, koleksiyon içerisinde oldukları gibi yani integer türünde durmuş olsalarda boxing, unboxing, casting gibi performans kaybına neden olan işlemler olmayacaktı. .NET 2.0 ile birlikte bu sorun, Generic denilen mimariyle giderilmiş oldu. Okumaya devam et
Generic Türler (Generic Types) -I
Bu yazıda .NET 2.0 ile birlikte gelmiş ve .NET dillerinin üstünlüğünün bir özelliği olarak görülen Generic veri tiplerini işleyeceğiz. Öncelikle konuyla ilgili koleksiyon sınıfları hakkında bir özet geçmemiz faydalı olacaktır.
Bilindiği gibi .Net Framework, koleksiyonları tanımlamak ve amacına uygun kullanmak için birçok sınıf sunar. System.Collections namespace’in altında bulunan bu sınıflar, ArrayList, HashTable, SortedList, Queue, Stack ve BitArray dır. Koleksiyonlar, Array kullanımına göre daha esnek ve dinamik bir yapıya sahiptir. Okumaya devam et
Nullable Veri Türleri (Nullable Data Types) [C#-VB.NET]
Bilindiği gibi değişken tipleri, depolanma durumları ve davranışları bakımından değer ve referans olmak üzere ikiye ayrılır. Bu iki veri tipi arasındaki önemli bir farktan bahsedeceğiz; referans türlerinin null(nothing) değeri alabiliyorken değer türlerinin bu özelliği taşımıyor olmasıdır. Yani değer türleri, her zaman bir değer taşımak zorundadır. Bir değişkenin, null olması, herhangi bir nesneye işaret etmiyor olduğu anlamına gelir. Özellikle veritabanı işlemlerinde null tabanlı kolonlarla çalışıldığında veya uygulama içerisinde değişkenlerin herhangi bir değer taşımaması gereken durumlarda bu özellik önem kazanmaktadır. Örneğin boolean türünde bir değişkenin değerini veritabanına göndereceğimizi düşünelim. Kullanıcı bu değeri, ya false ya da true olarak set edecektir. Peki, kullanıcının bu değeri set etmeden önce bu değişkenin default değeri ne olacak veya kullanıcı hiçbir şekilde bu değişkenin değerini set etmediyse veritabanına hangi değer gönderilecek. Okumaya devam et
ADO.NET Transaction İşlemi – III (Savepoint)
Gelişmiş veritabanı sistemleri, transaction işlemlerinde Savepoint denilen kaydetme noktaları tanımlama imkanı verir. Transaction birden fazla iş parçacığından oluştuğu için başarılı biten her iş parçacığının bitiş noktasını savepont olarak işaretlemek, özellikle karmaşık transaction işlemlerinde Rollback işleminin yükünü hafifletir. Çünkü bu durumda transaction içinde Rollback yapmak gerektiği zaman transaction, en başa geri sarılmak yerine sadece belirli bir savepoint noktasına geri döndürülür. Okumaya devam et
ADO.NET Transaction İşlemi – II [ADO.NET 2.0]
ADO.NET 2.0 ile birlikte programcının yerel ve dağıtık transaction işlemlerini daha kolayca yönetebilmesi için System.Transactions.dll kütüphanesi sunuldu. ADO.NET 2.0’da LightWeight Transaction(LT) ve OLE Transaction(OleTx) olmak üzere iki transaction modeli geliştirildi.
LightWeight Transaction, tek veri kaynağı üzerinde sorgulama yapılırken kullanılan transaction modeli, OleTx Transaction ise dağıtık transaction yapısında olup ayrı veri kaynakları üzerinde işlem yapılırken kullanılan modeldir.
Bu yeni transaction sistemini kullanabilmek için projemize System.Transactions.dll dosyasını referans olarak eklememiz gerekir. Okumaya devam et
ADO.NET Transaction İşlemi – I
DbTransaction nesnesi, veritabanı sistemine gönderdiğimiz sorguya ait transaction yönetimini sağlamak için kullanılır. Bilindiği gibi transaction(işlem) kavramı, veritabanı yönetim sistemlerinde önemli bir yere sahip olup birbirleriyle ilişkili iş parçacıklarının bulunduğu mantıksal bir birim olarak düşünebilir. Transaction yönetimi, aynı iş parçacığında seri bir şekilde yürütülecek sorguların hatasız bir şekilde sonuçlanıp sonuçlanmadığının kontrolünü sağlar. Klasik bir örnek olarak banka sisteminde havale uygulamasını ele aldığımızda ilk önce havaleyi yapan kişinin hesabından ilgili miktar düşürülür ve havale yapılan kişinin hesabına o kadar miktar eklenir. Dışarıdan basit görünen bu sürecin herhangi bir halkasında meydana gelecek bir hata kaynak veya hedef siteminde bilgi tutarsızlığına neden olacaktır. Bu yüzden bu işlemlerin transaction yönetiminde gerçekleştirilmesi gerekir. “Ya hep ya hiç” mantığıyla çalışan transaction işleminin esas amacı “veri bütünlüğü” olup, süreç içerisinde istenmeyen bir durum olduğu zaman önceki iş parçacıklarının geri alınmasıdır. Yani süreç, başlangıç noktasına geri döndürülür ve süreç içindeki hiçbir iş parçacığının gerçekleşmemiş olduğu kabul edilir. Büyük ölçekli VTYS’lerde dahili transaction yönetimi bulunmaktadır. Örneğin SQL Server’da çalıştırdığımız bir UPDATE veya DELETE işlemi esnasında herhangi bir kesinti olduğu zaman o zamana kadar gerçekleştirilmiş güncelleme veya silme işlemleri geri alınır ve veriler eski haline geri dönmüş olur. Bu geri alma işlemine ROLLBACK(geri sarmak), işlemler hatasız çalıştığı durumda değişikliklerin kalıcı hale getirilmesine COMMIT(işlemek) denilir. Okumaya devam et