Makale Özeti

"VB.NET biliyorum C# da öğrenmek istiyorum." diyenler için bir makale dizisi.

Makale

VB.NET 'den C#'a - 6

Attribute Kullanımı

VB.NET'de attribute kullanımı için < ve > karakterleri kullanır ve attribute'lar bu karakterler arasında yazılırlar.

<System.Serializable()> _

Public Class MusteriInfo

    'Musteri sınıfı

End Class

C#'da ise bu işlem için [ ve ] karakterleri kullanılır.

    [System.Serializable]

    public class MusteriInfo

    {

        //Musteri sınıfı

    }

VB.NET'de attribute nitelendirdiği satırın başında yazılmak zorundadır. Attribute'ları ayrı bir satırda yazabilmek için VB.NET'de satırı bölmek için kullanılan alt çizgi karakteri kullanılır ancak C#'da attribute ifades aynı satırda olmak zorunda değildir bir üst satıra da yazılabilir.

Shared

Shared sınıf üyeleri sınıfın bir örneğine (nesne) bağlı olmadan kullanılabilen üyelerdir. Metodları,fieldları,propertyleri shared olarak nitelendirebiliz. Shared bir metodun çağrılabilmesi için bir sınıfın bir örneğine ihtiyaç yoktur. Shared fieldlar ise program çalıştığında shared fieldlara istek gelmeden önce initializa edilmiş olurlar. Ve oluşturulmuş olan bu field program sonlandırılana kadar hafızada kalır. Ve sonraki kullanımlarda için hafızada aynı bölüme erişilir. Yani uygulamanın çalıştığı sürece herhangi bir kod bloğundan erişildiğinde aynı değere erişilebilecek bir field olarak kullanılabilir. Shared metodlar sadece shared metodları çağırabilirler, yada bir sınıfdan bir örnek oluşturarak shared olmayan metodları kullanabilirler.

VB.NET için yukarıda anlatılan Shared ifadesi C#'da static olarak geçer. Aynı kurallar C# için de geçerlidir.

Aşağıdaki sınıfda Musteri.GetMusteri şeklinde erişilebilecek bir GetMusteri shared metodu oluşturulmaktadır.

Public Class Musteri

    Public Shared Function GetMusteri(ByVal MusteriID As Integer) As Musteri

        Dim m As New Musteri

        '...

        Return m

    End Function

End Class


 

Dim m As Musteri

m = Musteri.GetMusteri(1)


Aşağıda ise uygulamadaki formların örnekleri oluşturulduğunda onları atayacağımız ve bu sayede sadece Form2'den tek örnek elde ederek çalışabilmemizi sağlayacak bir field gözükmektedir. (Not: Burada singleton kalıbı uygulanabilirdi.)

Public Class FormManager

    Public Shared Form2Instance As Form2

End Class

Yukarıdaki tanımlamaları C# ile yapacak olursak.

    public class Musteri

    {

        public static Musteri GetMusteri(int MusteriID)

        {

            Musteri m=new Musteri();

            //..

            return m;

        }

    }


 

    public class FormManager

    {

        public static Form2 Form2Instance;

    }

C#'da VB.NET'den farklı olarak karşılıklı yaratmaması için bir nesne üzerinden static üyelere erişilemez. Ancak VB.NET'de hem sınıf ismi ile hemde bir nesne üzerinden shared üyelere erişilebilir.

Module

VB.NET'de VB6.0'dan terfi edenlerin uyumululuğu için halen var olan bir yapıdır.Module'ler derlendiklerinde tüm üyeleri shared olan bir class (sınıf) oluştururlar. Module'lerin tüm üyeleri shared olan bir sınıfdan temek farkı başka bir sınıf içerisinde iken module ismi yazılmadan sadece module üyesinin ismi (örneğin bir metod) ile üyeye erişilmesidir. OOP dünyasında kullanımı pek hoş karşılanmayan bir özelliktir. C#'da modul işlevini elde edebilmek için sınıf üyelerini static olarak tanımlayın ve sınıfismi.uyeismi şeklinde erişerek kullanın.

Property

VB.NET'de kullanılan Property'ler C#'da da vardır, ancak yazım kuralı açısından property anahtar kelimesi kullanılmadan yazılması gibi temel bir farklılık vardır.

VB.NET'de sadece yazılanbilen (writeonly) ve sadece okunabilen (readonly) propertyler için özel anahtar kelimelerin property tanımlamasına eklenmesi gereklidir.

Public Class PropertySample

    Private _MusteriID As Integer

    Private _Toplam As Decimal

    Private _SadeceYazilabilen As String

    Public Property MusteriID() As Integer

        Get

            Return _MusteriID

        End Get

        Set(ByVal Value As Integer)

            _MusteriID = Value

        End Set

    End Property

    Public ReadOnly Property Toplam() As Decimal

        Get

            Return _Toplam

        End Get

    End Property

    Public WriteOnly Property SadeceYazilabilen() As String

        Set(ByVal Value As String)

            _SadeceYazilabilen = Value

        End Set

    End Property

End Class

C#'da writeonly,readonly ve tam erişimli üç property içeren yukarıdaki sınıfı aşağıdaki şekilde tanımlayabiliriz. C#'da readonly ve writeonly propertyler oluşturabilmek için sadece get veya sadece set bölümünü yazmak yeterlidir. Başka bir anahtar kelime kullanmaya gerek yoktur.

    public class PropertySample

    {

        private int _MusteriID;

        private decimal _Toplam;

        private string _SadeceYazilabilen;

        public int MusteriID

        {

            get

            {

                return _MusteriID;

            }

            set

            {

                _MusteriID=value;

            }

        }

        public decimal Toplam

        {

            get

            {

                return _Toplam;

            }

        }

        public string SadeceYazilabilen

        {

            set

            {

                _SadeceYazilabilen=value;

            }

        }

    }

C#'da indexer (parametre alan default property) dışındaki propertyler VB.NET'den farklı olarak parametre alamazlar.

Default Property

VB.NET'de sınıfın bir property'sini default olarak nitelendirebiliriz. Bu durumda örneğin sepet.urunler(1) diye erişmek yerine default property olan urunlere sepet(1) şeklinde erişebiliriz.

Public Class Sepet

    Private _Urunler() As Integer = {1, 2, 8, 5}

    Default Public Property Urunler(ByVal index As Integer) As Integer

        Get

            Return _Urunler(index)

        End Get

        Set(ByVal Value As Integer)

            _Urunler(index) = Value

        End Set

    End Property

End Class

Kullanımı:

        Dim sepet As New Sepet

        MessageBox.Show(sepet.Urunler(1))

        MessageBox.Show(sepet(1))

VB.NET'de default property'e yukarıdaki gibi, property ismini yazarak yada default olduğu için ismini yazmadan erişebiliriz.

Default Property yerine C#'da indexer'lar kullanılır. Indexer'lar bir isme sahip olmayan VB.NET'deki gibi direkt index değer verilerek erişilebilen propertylerdir. C#'da yazılmış bir sınıf VB.NET'de kullanılmak istendiğinde indexer'ın ismi default property olarak Item şeklinde gözükür.

    public class Sepet

    {

        private int[] _Urunler={1,2,8,5};

        public int this[int index]

        {

            set

            {

                _Urunler[index]=value;

            }

            get

            {

                return _Urunler[index];

            }

        }

    }

Kullanımı:

            Sepet sepet=new Sepet();

            MessageBox.Show(sepet[1].ToString());

C#'da indexer kullanımı için property'nin ismi olmaması dolayısıyla yukarıdaki kod bloğunda gözüktüğü gibi köşeli parantezler ile index değeri verilerek erişim sağlanır.

 

Cengiz HAN
Microsoft ASP.NET MVP
cengiz@cengizhan.com