Nullable - ?

by Alper KOCA 21. Eylül 2009 12:58

Merhaba herkese iyi bayramlar.
Bugün yazılımgünlüğünde bir makale gördüm ve bunu bende kendi bloğumda yayınlamak istiyorum dedim ve yazmaya başladım. VB.NET ile yazılan makaleye bu linktenulaşabilirsiniz. Şimdi benim makaleme başlayabilirim.

Değişkenler referans ve değer tipleri olmak üzere ikiye ayrılır. Referans tipleri null değer alabilirken değer tipleri null olarak bir değer alamazlar. Sebebi referans tipler ram’da bir adresi işaret ederken değer tipleri direk değeri tutarlar.

.net 2.0 ile birlikte değer tiplerine null değer atanabilmekte. bunu yapabilmek için 2 tane yol var (başka yollar varsa beni bilgilendirin lütfen :) ). Bunlardan ilki Nullable jeneriği.

static void Main(string[] args)
        {
            Nullable<int> sayi;

            sayi = 5;
            if (sayi.HasValue)
            {
                Console.WriteLine(sayi.Value);
                Console.WriteLine(sayi);
            }
            else
            {
                Console.WriteLine("null");
            }
            sayi = null;
            if (sayi.HasValue)
            {
                Console.WriteLine(sayi.Value);
                Console.WriteLine(sayi);
            }
            else
            {
                Console.WriteLine("null");
            }
        }

 

Yukarıdaki kod parçasında da görüldüğü gibi Nullable jeneriğini kullandık. Nullable nesnemizi tanımladığımız zaman iki yeni özelliğimizde beraberinde geliyor. HasValue ve Value.

HasValue değişkenin null olup olmadığını gösteriyor. null ile false değerini, herhangi bir değer aldıysa true değerini alıyor. null olan bir değeri işlemde kullanmak çalışma zamanında hata vereceğinden HasValue ile kontrol yapmak programı hatasız ve kararlı yapmada büyük rol oynuyor.

Value ise değişkene yüklü olan değeri alıyor ve sizin ulaşmanızı sağlıyor. Bunu kullanmadan direk olarak değişkeni kullanarakta değere ulaşabilirsiniz. Yukarıda ikisininde örneği var.

şimdi ise ? kullanımına bakalım.

static void Main(string[] args)
        {
            int? sayi;

            sayi = 5;
            if (sayi.HasValue)
            {
                Console.WriteLine(sayi.Value);
                Console.WriteLine(sayi);
            }
            else
            {
                Console.WriteLine("null");
            }
            sayi = null;
            if (sayi.HasValue)
            {
                Console.WriteLine(sayi.Value);
                Console.WriteLine(sayi);
            }
            else
            {
                Console.WriteLine("null");
            }
        }

 

Aslında pek değişiklik yapmadık sadece tanımlamada bir değişiklik söz konusu.
Nullable<int> sayi; yerine int? sayi; olarak tanımlama yaptık. Buda kod yazarken bize hız sağlıyor. istediğiniz gibi kullanabiliyoruz.

Nullable kullanımı yularda anlattığım gibi. Kullanıma örnek verecek olursam,
Kullanıcıya bir konuda fikrini sorabilirsiniz ve sorunun 3 şıkkı olabilir. Evet, Hayır, Düşüneceğim gibi. Bu durumda short türünde bir değişken tanımlayıp cevaplara 1,2,3 diyebilirsiniz ama bunun yerine bool türünden nullable bir değişken oluştururak işinizi daha az bir ram kullanarak yapabilirsiniz :) daha bir çok örnek var ama heralde en saçma örnek bu olabilir. Siz örnekleri daha da geliştirebilirsiniz.

Umarım faydalı bir makale olmuştur iyi günler..

Tags: , ,

C#

Programın ikinci kez açılmasını engellemek

by Alper KOCA 12. Eylül 2009 16:30

Yaptığım bir projede ağ ile veri alış verişi sağlamak için port dinliyorum ve program ikinci kez açıldığında hata veriyor ve program hatalıymış gibi gözüküyordu. İlk açılan programı sonradan kapattıklarında ise ikinci açılan program işlevini göremiyor ve program çalışmıyormuş gibi söyleniyordu ve bende sinir oluyordum tabiki :) En son sinirlendim ve programı ikinci kez açacakları zaman kibarca bir uyarı mesajı verdim.

Şimdi bunu nasıl yaptığımı inceleyelim.
Okulda işletim derslerinde anlatılan Mutex diye bir nesne vardı ve işime bukadar yarıyacağını hiç düşünmemiştim. Mutex ile multi-thread programlar kaynakların kullanımının hangi thread de olduğunu kontrol edebilir ve çakışmaları önleyebiliriz. Bende bundan faydalanarak kontrol yaptım ve programımı birdaha ikinci kez açmalarını engelledim.

using System;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            bool programyok;
            Mutex mtx = new Mutex(true, "Programim", out programyok);
            if (!programyok)
            {
                MessageBox.Show("Program zaten çalışıyor...");
                return;
            }
            Application.Run(new Form1());
            GC.KeepAlive(mtx);
        }
    }
}

Mutex sınıfının aldığı ilk parametre sahiplenmek için kullanılıyor. İkinci parametre mutex’in ismi onunla çağırıyorsunuz oluşturduğunuz mutex’i, üçüncü parametre ise mutexin başarılı olup olmadığını gösteren bool değer.

Kullanım bu şekilde ve çok basit. Beni büyük bir dertten kurtardı umarım sizin içinde çok faydalı olur.

Tags: ,

C#

MDI Form Arka Plan Resmini ve Rengini Değiştirmek

by Alper KOCA 9. Ağustos 2009 11:40

Sıkıntılı ve bence eksik bir konu olan MDI formların arka planını değiştirmek için internette biraz araştırma yaptım ve ufak bir kod parçasıyla sorunumu çözdüm. Çözdüm ama buna bir kolaylık getirilmeli. Visual Studio diyoruz gelşimiş bir araç diyoruz, C# süper bir dil diyoruz (VB ciler kızmasın oda süper) hele .net varki daha da güzel kolay işimiz, esnek kodlama yapıyoruz herşeyi sürükle bırak ile yapabiliyoruz diyoruz ama gıcık oldum işte neden MDI formların arka planı sadece gri ve başka renk değil?

Başka renkte yapabiliriz ama sürükle bırak yok ayarları değiştir falan la değil.

MdiClient mdi = null;
foreach (Control ctl in Controls)
{
    if (ctl is MdiClient)
    {
         mdi = (MdiClient)ctl;
         mdi.BackColor = Color.White;
    }
}

 

yukardaki kodu formunuzun Load kısmına koyarsanız arka plan beyaz olacaktır. İsterseniz rengi kendinize göre ayarlıyabilirsiniz.

Arkaplan resmi istiyorsanız formun arkaplanını ayarlamanız gerekiyor ve yine bu kodu çalıştırmanız gerekiyor. Arka plan ozaman kendiliğinden geliyor. Umarım yardımcı olmuştur ama bu konuda ki eksikliğinde bir an önce giderilmesini istiyoruz :)

Bir de z-index olayı yok winformlar da ama işte bunların hepsi WPF te var. Bakalım nezaman WPF kullanmaya başliyacağız.

Tags: , , , , ,

C#

Powered by BlogEngine.NET 1.6.1.0 - FunkyGrunge Theme by n3o Web Designers

 

Alper KOCA

Alper KOCA
Çukurova Üniversitesi Bilgisayar Mühendisi
3. Sınıf Öğrencisi
Microsoft Student Partner