Visual Studio ile uygulama geliştirirken aslında bir çok senaryoda Visual Studio sizin için bir çok parça sınıf üretiyor, bunları yazının sonunda inceleyeceğiz.
Partial Classes (Parça, Kısmi Sınıflar)
Bu türden sınıfları kullanmak için nedenlerimize şöyle bir göz atarsak ,
- Sınıf için kullandığımız dosya fazlasıyla büyümüştür ve farklı dosyalara ayırma ihtiyacımız ortaya çıkmıştır.
- Sınıfın farklı mantık öğelerine sahip kısımlarını farklı dosyalarda tutmak isteyebiliriz.
- İlk iki maddeden yola çıkarak takım çalışmalarında farklı geliştiricilerin aynı sınıf üzerinde çalışmaları rahatlatılabilir.
- Otomatik oluşturulan kodlar ile çalışırken (Entity Framework gibi) oluşturulan sınıflara direk ilgili sınıf dosyalarında ekleme, düzenleme yapmak tehlikelidir. Çünkü o sınıflar otomatik olarak tekrar oluşturulabilirler bu durumda yazdıklarımız yok olacaktır. Bunun yerine farklı bir dosyadan ilgili sınıfa ek yaparak kod eklemek daha mantıklı olacaktır.
Mantığı kavramak için şöyle bir sınıf oluşturalım :
Class Kedi
Public Adı As String
Sub Miyavla()
Console.WriteLine("Miyav")
End Sub
End Class
Kedi nesnesini türetip Miyavla metodunu çağırdığımızda doğal olarak ekrana “Miyav” sonucu gelecektir, şimdi bu sınıfın çok uzadığını düşünelim ve ikinci bir dosya açmış olalım ve metotlara devam ediyor olalım, ikinci dosyamızın içeriği şöyle olacaktır :
Partial Class Kedi
Public Türü As String
Sub Sevin()
Console.WriteLine("grr grr grr grr")
End Sub
End Class
Aşağıdaki gibi kullanımda aynı sınıf içindeki metotlara farklı dosyalarda dahi olsalar erişebildiğimizi göreceksiniz
Module Module1
Sub Main()
Dim Kedicik = New Kedi With {.Adı = "Kedican",
.Türü = "Siyam"
}
Kedicik.Miyavla()
Kedicik.Sevin()
End Sub
End Module
Örneğinimizin ekran çıktısı şöyle olacaktır :
Partial Methods (Parça, Kısmi Metotlar)
Partial Metotlar ile bir metodun tanımı yapılır fakat o metot oluşturulmaz ve o metot başka bir yerde )genellikle partial class içerisinde) oluşturulmamış ise o satır işlenmez.
İlk sınıfımıza SütüDök() adında bir metot ekliyoruz bu metotta önce kedimiz miyavlayacak eğer Partial Class içerisinde Kaç() metodu oluşturulmuş ise kaçacak..
Class Kedi
Public Adı As String
Sub Miyavla()
Console.WriteLine("Miyav")
End Sub
Sub SütüDök()
Miyavla()
Kaç()
End Sub
Partial Private Sub Kaç()
End Sub
End Class
Diğer dosyamızdaki partial class’ımızda bir değişiklik yapmadan uygulamamızda sütüdök metodunu çağırıyoruz:
Module Module1
Sub Main()
Dim Kedicik = New Kedi With {.Adı = "Kedican",
.Türü = "Siyam"
}
Kedicik.SütüDök()
End Sub
End Module
Bu durumda ekran çıktımız şöyle olacak :
Şimdi, Partial Class’ımızda ilgili metodu oluşturuyoruz :
Partial Class Kedi
Public Türü As String
Sub Sevin()
Console.WriteLine("grr grr grr grr")
End Sub
Private Sub Kaç()
Console.WriteLine("Fırrrr")
End Sub
End Class
Artık Kaç metodumuzun bir işlevi var derleyici bu satırı artık işleyecek, durum itibariyle :
şeklinde çıktı alıyoruz.
Partial olarak Function oluştrmayı denediğinizde bunu yapamadığınızı fark edeceksiniz, zira böyle bir durumda ilgili metot tanımlanmadığında hata oluşacaktır. Peki ne yapabiliriz ? Partial Class’da da tanımlansa metodun class içindeki değişkenleri ve propertyleri değiştirebileceğini unutmayın. Örneğin Kaç() metodunda istersek Adı property(özelliğini)sini değiştirebilirdik ve Kaç() metodunu çağırmamızın ardından Adı özelliğini kontrol edip karar verebilirdik.
Otomatik oluşturulan (Code Generated) kodlarda genellikle Validasyon işlemleri için böyle bir _isvalid özelliği bulunmaktadır ve biz modelin doğruluğunun kontrolünü gerçek sınıfa bırakabilmekteyiz.
Peki bu özellik pratikte nerelerde kullanılıyor,
- Otomatik olarak oluşturulan kodlarda genellikle kullanıcı bu kodlara müdahale edebilmesi amacıyla bu tip metotların çağrımı yapılmaktadır.
- Daha sonra farklı projelerde kullanılabilecek sınıflarda kullanabilmektedir.
Partial Metotlarda nelere dikkat etmek gerekir ?
- Partial Metotlar sadece Sub olabilirler.
- Partial Metot gövdeleri kod içermezler.
- Erişim belirleyicisi sadece Private (Sadece o sınıfın içinde) olabilir.
- Shared olarak tanımlanabilirler.
Visual Studio içinde otomatik oluşturulan Partial Class ve Metotlar
Bununla ilgili en tipik örnek Winforms uygulamalarında form tasarımında olmaktadır. Eklediğimiz her kontrolün bir aslında bir nesne (object) olduğunu biliyoruz, bu durumda form üzerine sürükleyip bıraktığımız her “şey” için bir kod yazılması gerekir. Eğer ki projemizi notepad ile geliştiriyor olsa idik, bir textbox eklemek için
Public Class Form1
WithEvents MetinKutum As New TextBox With {.Bounds = New Rectangle(10, 10, 300, 32),
.Text = "Metin Kutum",
.Name = "txtCihan"
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(MetinKutum)
End Sub
End Class
benzeri bir kod yazmamız gerekirdi, bu şekilde tasarım yapmak oldukça zorlayıcı olacaktır eminim.
Peki biz toolbox’dan metin kutusu eklediğimizde ne oluyor ? Aslında Visual Studio 2005 öncesini kullanıyor olsaydınız, formun codebehind dosyasının en üstüne bir yığın kod eklendiğini görecektiniz zira .net’in ilk sürümlerinde Partial Class yoktu ve tasarımı oluşturan kodlar direkt olarak form için oluşturulan codebehind (form1.vb) dosyasının içinde yer alırdı.
Hızlıca günümüze dönelim ve örneğimiz için hazırlanan sınıfa bakalım :
_
Partial Class Form1
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
_
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
_
Private Sub InitializeComponent()
Me.txtCihan = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'txtCihan
'
Me.txtCihan.Location = New System.Drawing.Point(10, 10)
Me.txtCihan.Name = "txtCihan"
Me.txtCihan.Size = New System.Drawing.Size(300, 20)
Me.txtCihan.TabIndex = 0
Me.txtCihan.Text = "Metin Kutum"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(351, 189)
Me.Controls.Add(Me.txtCihan)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents txtCihan As System.Windows.Forms.TextBox
End Class
Peki bu dosya nerede ? Nasılsa üzerinde kod olarak değişiklik yapmayacağımız için bu dosya Visual Studio tarafından gizleniyor, kendisini açmak için Solution Explorer’ın araç çubuğunda ilgili düğmeye tıklamamız yeterli :
Peki başka başka diyorsanız şu makalelere göz atın derim :


