Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# – Partial Method Yapıları

Merhaba,

Biliyorsunuz ki C#’ta, “partial” keywordü aracılığıyla class yapılarında “partial class” üretebilmekteyiz. Yani bir sınıfın farklı lokasyondaki parçasını oluşturabilmekteyiz. “partial” keywordünün bu işlevinin dışında benim daha yeni öğrenmiş olduğum ve çoğu kaynakta da timsali zor bulunan bir durumdan bahsedeceğim sizlere. “Partial Method” yapılarından…

“partial” keywordü kullanılabildiği yapılarda parçaları birleştirme işlevi güden ve farklı dosyaların bir bütün olarak çalışabilmesini sağlayan bir modifier(nitelendirici)dir. Haliyle bu keywordü classlar üzerinde kullanırsak class parçalarını birleştirecektir. Yok eğer metotlar üzerinde kullanırsakta metot parçasını bütünsel olarak görecektir.

Şimdi gelin “Partial Method”ları inceleyelim. Tabi her yapıda olduğu gibi partial ve method kavramları bir araya geldiği vakitte belli başlı kurallar meydana gelmektedir. Doğal olarak gelin bu kurallar çerçevesinde konuyu ele alalım.

  • Partial metotlar partial classlar içine tanımlanabilirler.
  • Aynı classlarda olduğu gibi partial metot yapılarının ikisininde “partial” keywordüyle işaretlenmesi gerekmektedir.
  • Partial metotlardan biri tanım, bir diğeride gövde olmak zorundadır.

        partial class OrnekSinif
        {
            //Tanım
            partial void X();
            //Gövde
            partial void X()
            {
    
            }
        }
    
  • Partial metotların geri dönüş tipi her zaman void olmalıdır.
  • Partial metotlar out parametreler alamazlar lakin ref parametreleri alabilirler.
        partial class OrnekSinif
        {
            partial void X(ref int x);
            partial void X(ref int x)
            {
    
            }
        }
    
  • Partial metotlar extern ve virtual olamazlar.
  • Partial metotlar static yahut generic olabilirler.
  • Partial metotlar erişim belirleyicileri almazlar. Yani bir nevi her daim private erişim belirleyicisine sahiptirler.
  • Partial metotlar delegate ile temsil edilemezler. Bunun sebebi birazdan da göreceğimiz üzere partial metotların çalışma zamanında(Run Time) var olacağı kesin değildir.

Yukarıdaki maddelerden birinde bahsetmiş olduğum tanım ve gövde ikilisinde aslında tanımdan kastım declaration(beyanname), gövdeden ise implementation(uygulama)dır.

Partial metotlarda asıl maksat, bir metotun declaration’ının bir dosyada, implementation’ının başka bir dosyada durmasını sağlamaktır. Bu açıdan bakınca partial metodları, partial classlarda kullanmak daha elverişlidir.

    partial class OrnekSinif
    {
        //Declaration
        partial void X(ref int x);
    }

    partial class OrnekSinif
    {
        //Implementation
        partial void X(ref int x)
        {

        }
    }

Eğer ki declaration bir partial metodun implementation’ını oluşturmazsanız hata almazsınız. Bu demek oluyor ki, uygulanmamış bir partial metot derleme sırasında yok sayılmaktadır. İşte bu yüzden yukarıda son madde olarak belirttiğim gibi delegate yapılarınca ilgili metot temsil edilmemektedir.

Bu duruma örnek olarak aşağıdaki kod yapısını incelerseniz eğer;

    partial class OrnekSinif
    {
        partial void X();
    }

    partial class OrnekSinif
    {
        public void Y()
        {
            X();
        }
        partial void X()
        {
            MessageBox.Show("Test");
        }
    }

X metodu partial olduğu için doğal olarak private erişim belirleyicisine sahiptir. Haliyle X metodunu nesne üzerinden kullanabilmek için public olan Y metodu oluşturulmuştur. Burada Y içerisinde X metodu çağırıldığı için Compiler tarafından X metodu private olarak görülecek, sayılacaktır. Yok eğer Y metodu içerisinden X metodunun çağırma ifadesini silersek eğer Compiler derleme aşamasında X diye bir metod görmeyecektir.

Evet…

Bu pek fazla bilinmeyen amma nedense kullanılışı benim çok hoşuma giden konuyu aydınlatmış olduğuma inanıyor ve şimdilik hoşçakalın diyorum…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. My name is help dedi ki:

    Automapper için profile sınıfını partial tanımlayıp ihtiyacın olan yerde ilgili mapping profillerini yazmak için kullanılabilir. Genelde generic tanımlar kullanılıyor ama proje genelinde birçok sayfada özel tanımlar gerekebiliyor.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir