Windows projelerini oluştururken genellikle bir MDI form (parent) ve onun içinde açılan çocuk (child) formlar şeklinde yapmaya çalışırız. Bu makalede bu şekilde bir uygulamada inheritance ve singleton patternin nasıl uygulanacağını göreceğiz.
Öncelikle yapmaya çalıştığımız projedeki ana formda (MDI) solda bir ağaç (tree), üstte bir menü ve altta da durum çubuğu (statusbar) olsun. Ağaç yapımızda şöyle olsun:
anamenu.jpg

Buradaki her alt düğüm (node) bir ekranı (formu) temsil etmektedir ve bu küçük uygulamamızda 6 child fom bulunmaktadır. Tabi ki bu tip projelerde child form sayısı çok daha fazla olmaktadır. Ayrıca bu child formlar birbirlerine benzediklerinden (örneğin her child formda üstte menu olması, altta statusbar olması, ekranı kaplamış bir groupbox olması, zemin renginin yeşil olması gibi bir takım ayarlar…) her formu tek tek projemize ekleyip bu ayarları hepsinde tek tek yapmak hem zaman kaybı olacaktır hem de ileride bakımını ve yönetimini zorlaştıracaktır. Bu sebeple projemizde interitance kullanacağız. Inheritance temel olarak bir sınıfın özelliklerini kalıtsal olarak başka bir sınıfa aktarmaktan ibarettir. (Detaylı bilgi için bakınız.) Bunun için bir tane temel form yaratıp, bu forma her ekranda olmasını istediğimiz özellikleri vereceğiz ve diğer tüm formları bu temel formdan inherit edeceğiz. Bunun için projemize yeni bir form ekliyoruz istediğimiz özellikleri veriyoruz.frmbase.jpg

Yeni yaratacağımız formları ise Project > Add New Item > Inherited Form şeklinde oluşturacağız. Standart form eklemeden farklı olarak eklediğimiz formun hangi formdan türediğini soracak ve listeden temel formumuzu seçeceğiz. Peki ya formlarınız daha önceden eklenmişse ve siz sonradan bu şekilde bir yapıya geçiyorsanız ne olacak? O zaman da formunuzu tanımladığınız yerin hemen altında inherit kodunu yazmanız yeterli olacaktır:

Public Class FrmKategoriTanim  Inherits FrmBase

Buraya kadar yaptığımız girişten sonra asıl makale konumuza geçelim. Ana ekranda gördüğümüz gibi her alt nodeda child formumuzu çağırıyoruz

Dim frm As New FrmUrunTanim 

frm.MdiParent = Me

frm.Show()

Örneğin ürün tanım ekranı açıkken, tekrar aynı ekranı açmak istediğimizde yeni bir ürün tanım ekranı açılacaktır. Bu şekilde her tıklamada yeni bir ekran açılacaktır, ancak biz istiyoruz ki child form hiç açılmamışsa bir kez açılsın, eğer açıksa bize açık ekranı getirsin. Bunu aslında mdi formun ActiveMdiChild propertysi (çağrıldığı andaki açık olan child formları verir) içinde basit bir for..next döngüsü kurup açmak istediğimiz form zaten açık mı değil mi diye bakarak anlayabiliriz. Ancak biz burada farklı bir yöntem uygulayacağız ve singleton design pattern ile inheritance karışımı bir çözüm üreteceğiz. Singleton’da genel prensip bir instance’nın (burada, “New FrmUrunTanim”)  daha önceden oluşturulup oluşturulmaıdığını tespit etmek, instance yoksa yenisini yaratmak varsa, eskisini döndürmek şeklindedir. Temel formumuz olan FrmBase üzerinde yaptığımız işlemlerin diğer tüm formları da etkilediğini söyledik. Bu anlamda örneğin her formun load eventi altında standart bir işlem yapıyorsak bunu sadece FrmBase formunun load eventina yazmamız yeterli olacaktır. Bu sebeple bizde singleton ile ilgili kodlarımızı her forma yazmaktansa FrmBase altına yazacağız: 

Private _FormLoaded As Boolean

Private _instance As Form

Public Function GetInstance(ByVal willLoadedForm As Type) As Form   

 If _FormLoaded = False Then     

   _instance = CType(Activator.CreateInstance(willLoadedForm), Form)       

   AddHandler Me._instance.Closed, AddressOf Me.WhenFormClosed       

   _FormLoaded = True   

 End If

 _instance.Focus()

Return _instance

End Function

Private Sub WhenFormClosed(ByVal sender As Object, ByVal e As EventArgs)    

 Dim closingForm As Form = CType(sender, Form) 

 RemoveHandler closingForm.Closed, AddressOf Me.WhenFormClosed     _FormLoaded = False

End Sub

Ana formda ise kodlarımızı şu şekilde düzenliyoruz:

Private Sub mainTree_DoubleClick(ByVal sender As Object,ByVal e As EventArgs)

    Dim nd As TreeNode = Me.mainTree.SelectedNode

    If ((Not nd Is Nothing) AndAlso (nd.Nodes.Count = 0)) Then

      Dim frm As Form = Nothing  

      Select Case nd.Name      

       Case “kisi”     

        frm = FrmKisiTanim.GetInstance(GetType(FrmKisiTanim))    

       Case “kategori”      

        frm = FrmKategoriTanim.GetInstance(GetType(FrmKategoriTanim))

       Case “urun”

         frm = FrmUrunTanim.GetInstance(GetType(FrmUrunTanim))

       Case “satis”

         frm = FrmUrunSatis.GetInstance(GetType(FrmUrunSatis))

       Case “stok”

         frm = FrmStokDurumu.GetInstance(GetType(FrmStokDurumu))

       Case “satis_raporu”

         frm = FrmSatisRaporu.GetInstance(GetType(FrmSatisRaporu))  

    End Select 

    If (Not frm Is Nothing) Then  

      frm.MdiParent = Me

      frm.Show()

    End If 

 End If

End Sub

FrmBase altında yazdığımız kodlarda _FormLoaded ile formumuzun yüklenip yüklenmediği bilgisini, _instance ile de yüklenen form bilgisini tutuyoruz. Formlarımızın yeni bir instancenı almak için Activator sınıfından yararlandık. CreateInstance metodu ile Type cinsinden verilen bir nesnenin instance alınabilmektedir. Burada tüm formlarımızın ilave constructorı olmadığını varsaydık. Eğer parametre ile formlarımızı açmamız gerekiyorsa CreateInstace metoduna ikinci parametre olarak bu constructor parametrelerini array olarak geçebiliyoruz. Formumuzun kapatıldığını anlamak için de _instance’ın FormClosed eventini yakalayıp _FormLoaded = false yapmamız gerekmektedir. (Bu kodu doğrudan FrmBase’in FormClosed eventine yazamıyoruz, çünkü aynı formu tekrar açmak istediğimizde dispose edilmiş bir forma ulaşmaya çalıştığımıza dair bir hata alırız.)  Formlarımızı ana formdan çağırırken FrmBase yerine ilgili formdan çağırdık, sanki kodları oraya yazmışız gibi :)  

Örnek Uygulamayı İndir

Bütün veritabanı işlemlerinde bir connection tanımlar ve bunun vasıtasıyla veritabanımıza bağlanıp istediğimiz işlemleri yaparız. Farklı her connection tanımladığımızda bu connectionlar connection pool’da saklanır. Eğer tekrar aynı connectiona ihtiyaç duyarsak tekrar tanımlama yaparız, ama artık bu yeni bir connection olmayıp pool’dan bize atanır. Böylelikle aynı veritabanına defalarca bağlanırken (üstelik kullanıcı sayısının arttığını da düşünürsek) daha kısa sürede bağlantı yapmamızı sağlayacaktır. Bu da daha fazla performans demektir.

Şimdi bu connection pooling ile karşılaşabileceğimiz bir sorunun senaryosunu hazırlayalım. Öncelikle aşağıdaki örnek kodumuzu ele alalım:

SqlConnection con = new SqlConnection

(server=.SQLEXPRESS;database=TEST;UId=User1;Pwd=123;”);

SqlCommand cmd = new SqlCommand

(“SELECT Count(*) FROM TARIH”, con);

con.Open();

int i = Convert.ToInt32(cmd.ExecuteScalar());

con.Close();

//Bir takım işlemler….

SqlConnection con2 = new SqlConnection

(server=.SQLEXPRESS;database=master;UId=sa;Pwd=123;

Pooling=False);

SqlCommand cmd2 = new SqlCommand

(“ALTER DATABASE TEST SET READ_ONLY”, con2);

try

{

  con2.Open();

  cmd2.ExecuteNonQuery();

}     

catch (SqlException ex)

{

   Console.WriteLine(ex.Message);

}

finally

{

con2.Close();

}

Burada yapılanı incelersek TEST veritabanına User1 kullanıcısı ile bağlanıp bir sorgu çalıştırılıyor. Burada ne yapıldığı önemli değil, sonuçta veritabanına bağlanıp bir işlem yapıldığını görmek yeterli. Senaryomuz gereği bu veritabanı üzerinde bir işlem yapmamız gereksin. Bu herhangi bir işlem olabilir, basit olması açısında veritabanını READ_ONLY yapmaya çalışacağız. (Önemli olan alter database edebilmek) Buraya kadar bir sorun yokken çalışma zamanında aşağıdaki hata ile karşılaşıyoruz.

Timeout expiredThe timeout period elapsed prior to completion of the operation or the server is not responding. ALTER DATABASE statement failed.

Peki, bu da nereden çıktı şimdi? Evet, connection poolingden… Öncelikle ilk connectionı yarattığımızda bu connection poola atıldı. Daha sonra sa ile sisteme bağlanıp TEST veritabanı üzerinde alter database yapmak istediğimizde ise bize yukarıdaki hatayı verdi. SQLexpress management studioyu açıp sp_who ile bağlı kullanıcılara bakalım.

 connection1.jpg

Sonuçlara baktığımızda User1 kullanıcısının bağlı olduğunu ama “uyuduğunu” görüyoruz. Bu da bizim daha sonra sa ile bu veritabanı üzerinde işlem yapmamızı engelliyor. (SQL 2000 kullanıyorsanız kod tarafında “database currently in use” mesajını alırsınız.)

Gelelim çözümümüze. En basiti, ilk bağlantımızı tanımlarken Pooling=False özelliğini eklemek olabilir. Ancak bu durumda connection poolingin bize sağladığı nimetlerden faydalanamayacağız ki bu istediğimiz bir çözüm değil. Bu durumda 2. bağlantımızı çalıştırmadan hemen önce

SqlConnection.ClearPool(con);

komutunu işletebiliriz. Böylelikle bu connectionı pool’dan temizlemiş oluruz. Buradaki senaryomuzda aynı scope içinde işlem yaptık. Scope dışında isek aynı connectionı pooldan alıp temizleyebilmek için tekrar tanımlamamız gerekiyor. Yani:

SqlConnection con = new SqlConnection

(server=.SQLEXPRESS;database=TEST;UId=User1;Pwd=123;”);

SqlConnection.ClearPool(con);

Hemen burada farklı bir sorunun senaryosunu çizmek istiyorum. Peki, pool bu şekilde değil de farklı bir biçim de temizlenirse ne olur? Mesela sql serverda sorun oldu ve restart oldu, ya da sql admin gitti bizim bu User1 bağlantımızı bize haber vermeden KILL etti. (Yukarıdaki sp_who tablosuna göre KILL 53 komutu ile bağlı kullanıcı düşürülebilir.) Bu durumda poolda engel olacak kullanıcı olmadığından bizim ALTER DATABASE işlemi başarıyla çalışacaktır. Ancak, oldu ya daha sonra yine bizim bu veritabanı üzerinde işlem yapmamız gerekti: 

SqlConnection con4 = new SqlConnection

(server=.SQLEXPRESS;database=TEST; UId=User1; Pwd=123;”);

SqlCommand cmd4 = new SqlCommand

(“SELECT Count(*) FROM TARIH”, con4);

  try

  {

      con4.Open();

      int i2 = Convert.ToInt32(cmd4.ExecuteScalar());

  }

  catch (SqlException ex)

      {

        Console.WriteLine(ex.Message);

      }

  finally

  {

      con4.Close();

  }

Bu seferde farklı bir hata ile karşılaşıyoruz:

A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 – Borunun diğer ucunda işlem yok.)

Anlaşılacağı üzere “borunun diğer ucu” gitmiş.Yani, ADO.NET bunun daha önce poolda olduğunu zannediyor ve connectionı bu şekilde tanımlıyor ve işlem yapmaya çalışıyor; ancak başarılı olamıyor. Peki, bu durumda ne olacak? Bu durumda yapılacak şey yine exceptiona düştüğünde poolu temizlemek:

catch (SqlException ex)

  {

      if (ex.Number == 233)

      {

         SqlConnection.ClearAllPools();

      }

  }

Bu durumda, eğer, bu sorgu çok kritik bir sorgu ise tekrar çalıştırılması gerekecektir.

 

1964 yılında Gilligan’s Island adıyla bir sit-com çekilmiş. Komedi ağırlıklı bu dizide yat kazasıyla ıssız adaya düşen bir grup kazazedenin komik maceralarını izliyoruz. LOSTa ne kadar da benziyor öyle değil mi? Buyrun videoları izleyip siz karar verin: YouTube Preview Image

YouTube Preview Image

İşte 3. sezon boyunca dinlediğimiz tüm şarkılar:  

 1- Petula Clark – Downtown (S03E01)
 2- Glenn Miller – Moonlight Serenade (S03E01)
 3- John Philip Sousa – The Thunderer (S03E01)
 4- Corey Harris – Feel Like Going Home (S03E03)
 5- Brenda Lee – I Wonder (S03E05)
 6- Ann Margret – Slowly (S03E06) 
 7- Oasis – Wonderwall (S03E08)
 8- Sarah McLachlan – Building a Mystery (S03E08)
 9- C. Elliot – Make Your Own Kind of Music (S03E08)
 10- There Dog Night – Shambala (S03E10)
 11- Nirvana – Scentless Apprentice (S03E22)
 12- Beach Boys – Good Vibrations (S03E22)
 

İndir… (47354 KB) 

Kaynak: www.deezi.net

Dizinin Adı: Kurban’ın Kurbanları
Yönetmen: Taylan Biraderler
Yapımcı: Osman Yağmurdereli
Müzik: Kıraç (Ana Şarkı: Yalnızlığımın Adasında Yitirdim Benliğimi)  


Kazazedeler

Jack: Nejat İşler

Kate: Berrak Tüzünataç
Sawyer: Kıvanç Tatlıtuğ
John Locke: Mazhar Alanson
Hurley: Ata Demirer

Mr. Eko: Pascal Nouma

Jin: İlhan Mansız

Sun: Ayumi Takano

Sayid: Mehmet Ali Nuroğlu

Shannon: Pınar Altuğ

Charlie: Özgür Çevik

Boone: Berk Hakman

Ana Lucia: Doğa Rutkay

Claire: Seçkin Piriler

Desmond: Birol Ünen

Michael: Steve Kompela  

The Others (Diğerleri)

Benjamin Linus: Halit Ergenç
Juliet: Özge Özberk
Alexandra Rousseau: Melisa Sözen
Ethan Rom: Timuçin Esen  

Kısaca Konu:

Dokuz günlük Kurban Bayramı tatilini fırsat bilip, “Şöyle bir Amarika’ya gidelim de görelim neymiş, hem ucuz bilet de bulduk, ne duruyoruz o zaman!” düşüncesiyle Okuyanus Havayollarına ait 831 nolu uçuşa doluşan Türkler, uçağın Atlantik Okyanusu üzerinde infilak etmesiyle kendilerini bir anda ıssız bir adada bulurlar.

SSK Okmeydanı Acil Servis doktorlarından Jack de (N. İşler) bu yolcular arasındadır ve gözlerini adada açması ile gaipten gelen “Doktor Jack, Doktor Jack acilen sahile bekleniyorsunuz.” sesini duyması bir olur. Hızla sahile koşan (ve dizinin ilerleyen bölümlerindeki geri-dönüşlerde Aliye isimli eski aşkıyla hüzünlü ayrılışını izleyeceğimiz) Dr. Jack, “anam anam” feryatlarıyla inleyen yolcularla karşılaşır ve olaylar gelişir.

Dizi ilerledikçe adanın hiç de öyle ıssız bir yer olmadığı ve bu adada zamanında (Sorosçu olmakla suçlanan) Dharma Vakfı ile TUBİTAK’ın ortak çalışmalar yürüttüğü ortaya çıkar. Bu çalışmalar adanın manyetik dengesini bozmuş ve yönlerin tespit edilemez hale gelmiştir. Bu da başta ada imamı Mr. Eko (Nouma) olmak üzere çoğunluğun moralini feci halde bozar. (Bkz. Bölüm 8 “Kıble Nerede Be Hacım?”)

Sayısal’da gizemli sayılar “3 5 8 31 40 41” rakamlarına oynayıp paranın gözüne koyan Hurley’in (A.Demirer) ada hakkında sürekli söylediği “Abi ben burayı biliyorum, Acun’un adası burası, Survivor Türkiye Yunanistan da burada çekildiydi.” cümlesi ve John Locke’un (M. Alanson) burnuna sürekli gelen kaşarlı tost kokusu da adanın gizemini arttırır. Nitekim yolcular bu adada yalnız olmadıklarını anlayacaklar ve olaylar gelişecektir.

Diziden Notlar:

Hurley hiç de haksız değildi aslında; dizinin çekimleri için Survivor adaları kullanılmıştı. Fakat senaristlerin bunu neden diziye de yerleştirdikleri, dizideki binlerce meçhuliyet gibi, halen yanıtsız.

Dizinin web sitesine gelen izleyici soruları arasında “Abi onca adam –affedersiniz ama- nasıl def-i hacet gideriyorlar?”ın yoğunlaşması üzerine yapımcı Osman Yağmurdereli “Her taraf deniz, biraz açılıyorlar.” açıklamasında bulundu. Bu açıklamaya Prof. Dr. Orhan Kural büyük tepki gösterdi ve yapımcıyı çevreyi koruma hususunda kötü örnek olmakla suçladı.

Yapım ekibinin dizinin başlaması şerefine verdiği mangal partisi esnasında, etrafa sıçrayan kıvılcımların birkaç palmiyeyi tutuşturması ise sadece çevrecilerden değil, Panama Hükümeti’nden de tepki gördü.  

“Oyuncular arasındaki iletişimden bize de ekmek çıkar nasılsa” düşüncesiyle bir tekne tutup adaya çıkartma yapmaya niyetlenen magazin muhabirleri, teknelerinin yakıtı bitip, bir de üstüne fırtınaya yakalanınca, onbeş gün boyunca okyanusta mahsur kaldılar. Uzun süren aramalar sonucu bulunan magazinciler, kendilerini bulan geminin küpeştesini öperken, muhabirlerden biri “Allahım dualarımızı kabul etti, biz de ona verdiğimiz sözü tutacağız ve bir daha Pınar Altuğ’a yaklaşmayacağız, sevgilisine de ‘Küçük Afacan’ demeyeceğiz” dedi.

Dizinin senaryosu ilk düşünüldüğünde adaya düşen uçağın yerine, şarampole yuvarlanan otobüsten kurtulan yolcular fikri üzerine durulmuş. Özellikle de bütçe endişeleri nedeniyle oluşan bu düşünceden, yapımcının “düşürün uçağı da namımız yürüsün, buluruz bir yerden kredi” sözleriyle vazgeçilmiş.

Yine yapım aşamasında reddedilen fikirlerden birisi, düşen uçaktan bir mafya babası, bir emniyet görevlisi ve bir politikacının sağ çıkması ve diziye “derin devlet”in de olaya katılmasıymış.

Dizide her şeyin gerçekçi olmasını isteyen yönetmenler, animasyon kutup ayılarını gerçekçi bulmadıkları için, Türkiye’den harbi ayı getirtmişler; fakat çingene eğitimli bu ayıların sürekli oynamaya ve bayılma numarası yapmaya kalkmaları üzerine animasyon ayılara mecburi dönüş yapmışlar.

Acun Ilıcalı’nın “Abi hazır adadayken bir Survivor Kazazede-The Others çekelim mi?” teklifi de reddedilmiş. 

Kaynak www.derki.com

Projelerimizde en çok kullandığımız değişken tipi string olsa gerek. String tipinin reference type ve immutuable olması, projelerde hayli yer alması bizim string değişkenlerle yaptığımız işlemlerde performansa ne kadar dikkat etmemiz gerektiğini gösteriyor.  String immutuable bir değişken tipidir, dedik. Bunun anlamı string bir değişkene verdiğimiz değeri (aslında değerin adresini) asla değiştiremeyiz. Bunu basit bir örnekle açıklamaya çalışalım.            

string test = “Veri”;

//Bir takım işler

test = “Data”;

Burada yaptığımız heap’de bir yer ayırıp içine “veri”yi koymaktan ve bu yerin adresini test değişkenine vermekten başka bir şey değil. Daha sonra yapılan ise heap’de bir yer daha ayırıp içine “data”yı koymak ve test değişkenine “data”nın adresini vermek. Yani heap’de aslında iki tane yerimiz var (biri “veri”yi içeriyor diğeri “data”yi) ama test değişkenimiz sadece “data”nın bulunduğu adresi tutuyor. Bu şekilde düşündüğümüzde string üzerinde yaptığımız her yeni atamada aslında içindeki veriyi değil, adresini değiştirmiş oluyoruz ve hafızada (heap’de) belki de farkında olmadan fazladan yer tutuyoruz; ta ki garbage collector (GC) zamanı gelip de “veri” nin adresini tutan herhangi bir değişken bulamayıp temizlediği zamana kadar…  Şimdi de bir karşılaştırma örneğine bakalım. 

string test1 = “veri”;

string test2 = “data”; 

 // Bir takım işlemler 

if (test1.ToUpper() == test2.ToUpper())  

 {      // Bir takım işlemler   }

    Proje çıktısının ilgili yerini ILDASM ile inceleyelim:    

string3.jpg


Görüyoruz ki hafızada test1.ToUpper()’ın sonucu başka bir yerde, test2.ToUpper()’ın sonucu başka bir yerde tanımlanıp farklı değişkenlere alınıyor. (Heap’de “veri”, “data”, “VERİ”, “DATA”  yerleri mevcut ve stackda “VERİ”’nin ve “DATA”nın adresini tutan iki ayrı değişken tanımlanmış) Daha sonra da boolean bir değişken tanımlanıp string fonksiyonlarından Equality kullanılarak karşılaştırıldığını görüyoruz. Peki if bloğunu şu şekilde değiştirirsek ne olur acaba, bakalım:  

if (string.Compare(test1,test2,true) == 0)

   {      // Bir takım işlemler   }

  ILDASM ile proje çıktısının ilgili satırına bakarsak:   

string2.jpg

Fazladan hafızada yer ayırmalar ve değişken tanımlamalar olmamış. Bu da kodumuzun öncekine göre daha performanslı olmasına ve daha az hafıza kullanılmasına sebep olmuştur. String işlemlerinde sıkça kullandığımız bir başka işlem de birleştirmelerdir. Basit bir örnekle bunu da analiz etmeye çalışalım.  

string test = “veri1″;

//Bir takım işlemler 

test += ” veri2″;  

//Bir takım işlemler 

test += ” veri3″;

     

string3.jpg

ILDASM çıktısına ve önceki bilgilerimize göre ilk string birleştirmede aslında heapde bir yer ayrılıp içine “veri1 veri2” yazıldığını ve bunun adresini bizim değişkenimizin tuttuğunu görürüz. Benzer şekilde ikinci birleştirme de heap’de “veri1 veri2 veri3” yazan bir yer ayrıldığını ve bunun adresini değişkenimizin tuttuğunu rahatlıkla söyleyebiliriz. (Heap görüntüsü şöyledir: “veri”, veri1 veri2, “veri1 veri2 veri3” Yani hafızada 3 ayrı yer ayrılmıştır.)  Yani string değişkenimizin içeriğini aslında değiştiremiyoruz, çünkü kendisi immutuable’dır… Bu duruma alternatif çözüm StringBuilder sınıfı ile gelmektedir:   

StringBuilder sb = new StringBuilder();

sb.Append(“veri1″);           

 //Bir takım işlemler 

sb.Append(“veri2″); 

//Bir takım işlemler  sb.Append(“veri3″);

     

Aslında her zaman StringBuilder sınıfını kullanmak istenen performansı vermeyecektir. Bu sebeple String birleştirme işlemi belirli bir sayıda ise + veya concat metodunu kullanmak daha faydalı iken, belirsiz ve fazla sayıda string birleştirmeler de StringBuilder sınıfını kullanmak daha iyi olacaktır. Bu tavsiyeyi MSDN’de de görüyoruz:

“The String class is preferable for a concatenation operation if a fixed number of String objects are concatenated. In that case, the individual concatenation operations might even be combined into a single operation by the compiler. A StringBuilder object is preferable for a concatenation operation if an arbitrary number of strings are concatenated; for example, if a loop concatenates a random number of strings of user input.” 

Projelerimizin minimum kaynak tüketimi ile maksimum performansta çalışmalarını isteriz. Burada da buna nasıl katkı sağlayacağımızı birkaç string işlemi üzerinde incelemeye çalıştık. Belki onlarca satırdan kazanacağımız birkaç ms ve hafızadan tasarruf edebileceğimiz birkaç byte çok fazla bir fark ettirmeyecektir. Ancak unutulmamalıdır ki projelerdeki satır sayısı arttıkça ve yaptığımız işlemler daha da karmaşıklaştıkça bu tip küçük şeylerin aslında ne denli önemli olduğu ortaya çıkacaktır. Ayrıca .NET Framework mimarisinin nasıl çalıştığını anlamamıza bir o kadar da yardımcı olacaktır.  

Çoğu zaman veritabani bağlantılarında connection string özelliğini dinamik olarak oluşturmamız gerekmektedir. Bunun için de string birleştirmeler kullanırız. Benzer şekilde de bir connection stringden bazen server, userId gibi bilgileri parçalayarak elde ederiz. Ancak hepimizin bildiği gibi connection stringler yazılırken farklı formatlarda yazılabilirler ve bu da örneğin bağlanılan database bilgisi yerine baska bir bilgi almamıza neden olurlar. İşte tüm bunların önüne geçmek için .NET 2.0 ile gelen bir sınıf var: SqlConnectionStringBuilder 

SqlConnectionStringBuilder ile çok kolay bir şekilde connection stringler oluşturabiliyoruz; mevcut connection stringler üzerinden de işlemler yapabiliyoruz. SqlConnectionStringBuilder’ın iki tane constructorı vardır ve birisi connection string parameteresi alır.   

Başlıca kullanacağımız özellikleri şunlardır: 

ConnectionString = ConnectionString bilgisini tutar.

DataSource = Bağlanılacam olan ana bilgisayar (server) bilgisini tutar.

InitialCatalog = Ana bilgisayardaki bağlanılacak veritabanı bilgisini tutar.

IntegratedSecurity = Windows güvenliğini kullanarak mı yoksa Sql doğrulama ile mi bağlanacağını belirtir. Default değeri False’dur.

UserID = SQL doğrulama ile bağlanılacak kullanıcı adını tutar.

Password = SQL doğrulama ile bağlanılacak kullanıcının şifresini tutar. 

Sınıfın tüm metodları ve özellikleri için bakınız. 

 Basit olarak aşağıdaki gibi Connection Stringi oluşturabiliyoruz.  

SqlConnectionStringBuilder sqlString =

      new SqlConnectionStringBuilder();

sqlString.DataSource = “(local)”;

sqlString.InitialCatalog = “Northwind”;

sqlString.UserID = “sa”;

sqlString.Password = “123″; 

SqlConnection con =

      new SqlConnection(sqlString.ConnectionString);

Benzer şekilde elimizdeki bir connection string üzerinde de işlem yapmamız gerekebilir. Aşağıdaki örnekte sql doğrulama ile bağlantı sağlayabilecek bir connection stringin windows doğrulama sağlayacak hale nasıl getirildiğini görüyoruz.  

string conString = “Sever=(local);User ID=sa;Password=123;Database=Northwind”;

SqlConnectionStringBuilder sqlString =

new SqlConnectionStringBuilder(conString);

sqlString.Remove(“User ID”);

sqlString.Remove(“Password”);

sqlString.IntegratedSecurity = true; 

SqlConnection con =

    new SqlConnection(sqlString.ConnectionString);

VB.NET 2.0 ile gelen My Namespace bize birçok işi kolay yoldan yapmamızı sağlıyor. Aşağıdaki şekilde My Namespace içindeki sınıfları görüyoruz. Her bir sınıfla bilgisayarımız, uygulamamız hakkında çeşitli bilgiler alıyor ve bir takım işleri çok kolay bir şekilde yapıyoruz. Detaylı bilgi için bakınız.


Ancak Visual Basic’e ait bu namespace C# ortamında doğrudan yer almamaktadır. Tabi bu da C#’da kullanamayacağımız anlamına gelmiyor. Bunun için öncelikle yeni bir C# projesi açıyoruz ve Microsoft.VisualBasic.dll dosyasını referans olarak ekliyoruz: 

Hangi sınıfları projemizde kullanacağımız bulmak için object browserda VisualBasic.DLL assembly’sini inceliyoruz.

Böylelikle projemize ekleyebileceğimiz sınıfları buluyoruz: (İhtiyacınız olmayanı eklemeyebilirsiniz.)

using Microsoft.VisualBasic.ApplicationServices; using Microsoft.VisualBasic.Devices;

Sonrada istediğimiz sınıftan bir instance türeterek istediğimiz işlemleri yapabiliyoruz: 

İzleyenler bilir LOST’ taki karakterler arasındaki bağları ve karmaşıklığını.. Hele hele 3.sezon finalinda Fransız kadının kızıyla karşılaştığında Ben’in “bu senin annen yavrum” repliği koparmıştır, çok tanıdık gelmiştir bir yerlerden. İşte bu ilişkilerin derli toplu (!!) resmini görüyoruz. :)

Büyük resim için tıklayınız.

lostunsirricozuldu.jpg Dünya üzerinde yüz milyonları ekran başına kitleyen Lost dizisinin sırrı çözüldü. Andrew Smith adlı bir Amerikalı senaryodaki gizemi çözüp Seventh Seal Theory adıyla internet sitelerine gönderdi.

FISILTILAR KİME AİT?

Ada, doğal bir mineral(black rock). Alvar Hanso’nun dedesi Magnus Hanso’nun niyeti köleleriyle birlikte bu efsanevi black rock’ı patlatıp elde edeceği madeni satmaktı. Bir fırtınaya yakalanarak karaya vurdular. Magnus kurtuldu, köleler öldü. Adayı terk etmek için bir sal inşa etti. Kölelerin çığlıkları kulaklarındaydı. Aslında onları gerçekten duyuyordu. Black rock elekromanyetik aktiviteyi, sesi, düşünceyi, hafızayı kaydediyordu. Aynı zamanda ona geleceğiyle ilgili sezgisel bir fikir de veriyordu. Bir gemi yapıp eve döndü. Gemisiyle adaya makul bir mesafede seyrederek meditasyon halinde, taşın ona gelecekle ilgili anlattıklarını telakki etti. Bunları ticaret hayatında kullanarak adanın sırrıyla birlikte varisi Alvar Hanso’ya bırakabilecek kadar muazzam bir servete sahip olacaktı.

GİZEMLİ SAYILAR

Valenzetti adlı matematikçi, dünyanın sonuna dair ‘4,8,15,16,23,42’ sayılarını içeren bir formül hesaplamıştı. Bu sayıların her yerde olduklarını ve dünyanın sonunun tahmininde önemli olduğunu iddia ediyordu. Alvar formülü ögrendi ve adanın kendisine verdigi bilgiyle alakalı bularak Valenzetti ile Dharma İnisiyasyonu`nu oluşturdu. Amaç bu sayıları değiştirerek dünyayı öngörülen korkunç sondan kurtarmaktı. Alvar insanlığın iyiliği için adayı bazı kalifiye insanlarla paylaşması gerektiğini biliyordu. Bu yüzden bilimadamlarını ve psişik sınırlara dayanan güçlere sahip özel çocukları adaya getirdi.

ADADAKİ İSTASYONLAR

Adada kurulan istasyonlarda kaderin değiştirilemezliği teorisini sınayan deneyler yapıldı. Bu deneylerden biri Swan’dı. Aslında test edilen şey, görevlerine olan inanlarının kaderi yerinden bir milimetre oynatıp oynatamayacağıydı. İşe yaramadı. Sorunlu kaderin adada hapsedilmesine karar verildi.

MERAK EDİLEN JACOB KİM?

Çocukların en özeli Jacob zihniyle objeleri oynatabiliyordu. Madem black rock hafızayı depolayabiliyordu, Jacob da kayanın gücünün yoğun olduğu yere yerleştirildi ve bir bilim adamı ordusunun gözlemi altında kayadan kaderi emmeye çalıştı. Daha sonra ‘incident’ olarak bahsedilecek patlama gerçekleşti. Jacob bu patlamayla cismani formunu kaybedip black rock tarafından emildi. Ama nesneleri hala oynatabiliyordu. Kendini taş halinde hareket ettirebiliyordu. Siyah bir toz bulutu halinde hareket edip çeşitli şekillere bürüyebiliyordu.

KADERİ DEĞİŞTİREMEDİLER

Patlama enerjinin serbest bırakılmasını gerekli kılmıştı. Yoğunlaşan enerji bilim adamlarının kader üzerindeki araştırmalarının sürmesini sağlıyor, enerjinin periyodik olarak boşaltılması ise başka felaketleri önlemeye yarıyordu. Swan’ın artık gerçek bir amacı vardı. Elektromanyetik enerjinin her 108 dakikada bir yakındaki bir başka uyduya aktarılması gerekiyordu. Bu iş için Radzinsky ve İnman atandı. Fakat onlar kaderin değişmeyeceğini düşündüler. Bununla birlikte incident, dünyanın felaketine yol açacak olan bir anomali yaratmıştı.

ADAYA ANOMALİ ÇEKTİ

Bakunin’e, bu anomalinin dünya üzerinde yarattığı etkiyi takip etme ve etkileyebileceği insanların profilini çıkarma görevi verildi. O da flame istasyonu vasıtasıyla bu insanları buldu. Her biri bir şekilde düşen uçakla ya da birbiriyle bağlantılıydı. Anomali büyük dalgalar halinde büyüyecekti. Sonunda bir şekilde bütün bu insanlar aynı gün aynı saatte aynı uçağa bindirilerek adaya getirildiler. Dharma kaderin rotasının tamirinde (course-correcting) ona yardımcı oluyordu.

Kaynak: www.haberx.com