Madem kontrol oluşturamıyoruz bari bir button nesnesi oluşturalım. Visual Studio’nun Toolbox penceresinden Button kontrolünü temsil eden düğmeyi sürükleyip mevcut bir formun üzerine bırakırsanız "button1" adında bir Button nesnesi hazırlamış olursunuz. Bu sırada forma ikinci bir button nesnesi yerleştirmeniz halinde Visual Studio bu button nesnesine button2 adını verir.

Başka bir deyişle Toolbox’tan Button kontrolünü temsil eden düğmeyi sürükleyip forma bırakmakla Visual Studio’ya demiş oluyoruz ki “bana standart özelliklere sahip bir button nesnesi hazırla”. Visual Studio bizi kırmayıp bu nesneyi oluşturmaktadır. Tekrar edelim: Toolbox'tan yararlanıp forma yani Form sınıfının mirasçısı sınıfta button1 adında bir button1 nesne hazırlamak demek bir bakıma Visual Studio bu işlem için gereken kodları git benim için Form1.Designer.cs dosyasına yaz demektir. İşte forma button1 adında button nesnesi yerleştirdiğinizde geri planda hazırlanan kodlar.

Bu sırada yani formun üzerinde button1 adındaki bir Button nesnesi varken bu nesneyi çift tıklarsanız Visual Studio sizin bu nesnenin Click olayını temsil eden bir metot hazırlamak istediğinizi varsayar. Aşağıda verdiğim kodu tasarım anında button1 adlı button nesnesini(kontrol değil nesne) çift tıkladıktan sonra aldım.
private void button1_Click(object sender, EventArgs e) {
}
Gördüğünüz gibi bu bir event değil bir metottur. Visual Studio bu metoda ad seçerken nesne ile bu metodun temsil edeceği olayın adını birleştirip bir metot adı meydana getirdi. Yani programcı bu metoda istediği adı verebilir. Örneğin programcı bu metodun adını aşağıdaki gibi değiştirebilir.
private void button1_Tokmakci(object sender, EventArgs e)
{
}
Anlatılan şekilde button1 nesnesi tasarım anında çift tıklandığında Visual Studio metot hazırlamaktan öte ayrıca bu metot ile Button nesnesinin Click olayını ilişkilendirir. Bu ilişkilendirme Designer.cs adlı dosyada yapılır. Tasarım anında button1 adlı nesneyi çift tıkladığım için Visual Studio geri planda Form1.Designer.cs dosyasına aşağıda işaret edilen satır gibi bir satır ekleyerek bu metotla button1 nesnesinin Click olayını ilişkilendirdi.

Varsayalım ki Visual Studio'nun button1_Click() adını verdiği metodun adını beğenmediğiniz veya bu metot adı yerli programcılık kitabı yazarları tarafından daha önceden register edilmiş olduğundan kullanmak istemiyor olabilirsiniz. Bu durumda Form1.cs dosyasına gidip metodun adını istediğiniz gibi değiştirebilirsiniz. Tabi sonradan kendiniz metodunun adını değiştirirseniz Form1.Designer.cs dosyasındaki metotla Click olayı arasında ilişki kuran satırı da aşağıdaki gibi değiştirmeniz gerekir.

Yukarıda zirveye çıkmak isteyenler için yazılan metinde kod yazılarak yani Visual Studio’dan yararlanılmadan bir kontrol hazırlanmıştı. Pardon nesne hazırlanmıştı. Şimdi aynı işlemi iflah olmaz çukurcular yani zirveye çıkmak istemeyenler için yapalım.
privatevoidForm1_Load(objectsender, EventArgse) {
Buttonbutton2 = newButton();
button2.Text = "buton2";
button2.Left = 25;
button2.Top = 50;
this.Controls.Add(button2);
}
Bu kodları Form1’in Load olayını temsil eden metoda yazdığım için proje çalıştırıldığında forma button2 adında bir nesne yerleştirilir. Çalışma anında button2 tıklansa bile herhangi bir tepki alınmaz. Çünkü bu nesnenin Click olayını temsil eden bir metot henüz yoktur.
Şimdi örnek olması için bir metot hazırlayacağım. Aşağıda verdiğim ekran görüntüsünde tespit edeceğiniz gibi hazırlayıp button2_Tokmakci() adını verdiğim metot object ve EventArgs tipinde 2 parametreye sahiptir. Hazırladığım metoda özellikle argo bir ad verdim ki yarın bir gün birileri çıkıp metodumuzun adını çalmışsın demesinler.

Bu metodun button2 adını verdiğim button nesnesinin Click olayını temsil etmesini istiyorum. Button nesnelerinin Click olayını ancak object ve EventArgs tipinde 2 parametreye sahip metotlar temsil edebildiği için metodun parametre yapısını ona göre düzenledim.
Şimdi sırada bu metot ile, kod yazarak hazırladığım button nesnesinin Click olayı arasında ilişki kurmak var. Bu amaçla yukarıda verdiğim koda ekleme yaptım. Gördüğünüz gibi ne kontrol hazırladık ne de Event. Bu nedenle zirveye çıkmayı kafalarına koyanlar metot hazırlama işleminden Event hazırlama diye söz ederlerse inanmayınız.

Out Bildirili Değişkenler - Zirveye Çıkmak İsteyenler İçin
Bu makalede her C# programcısının çok faydasını gördüğü out bildirisinden söz edeceğim. Daha önce sözü edilen tekniklerde işaret edildiği gibi C#’taki procedure’ler fonksiyonlardan daha gelişmiş bir yapıya sahip olduğu için out bildirisini fonksiyonlar yerine Procedureler üzerinde anlatmayı tercih ettim.
En başta belirtelim ki out bildirili parametreler yani out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılamaz. Bazen insana komut gibi görünün bu bildiri hakkında bilgi vermek için aşağıdaki gibi güzel bir kodlama yaptım. Aşağıda verdiğim kodda şartları zorlayıp out bildirisiyle tanımladığım değişkenin soluna eşittir yazdım.
namespace uzayli_zekiye {
class hakiki_sinif
{
public void benzersiz_metot(out string str)
{
string ilimiz;
ilimiz = str; // Hata meydana gelir, çünkü solunda ‘=’ var.
str = "ADANA";
}
}
}
Bu kodu yazıp işletmek istediğinizde hata meydana gelir. Çünkü Out bildirisiyle tanımlanıp deklare edilen değişkenlerin soluna “=”, eşittirin sağına ise out bildirili değişken yazılamaz. Bu kodda “=” operatörünün sağına burada “str” adını verdiğim out bildirili yani out olmuş değişkenin adını yazdığım için hata meydana gelmektedir. Başka bir anlatımla out bildirisiyle tanımlanan değişkenlerin değeri başka bir değişkene aktarılamaz.
Out Bildirili Değişkenler – Çukura İnmek İsteyenler İçin
Yukarıda out anahtar kelimesiyle ilgili olarak zirveye çıkmak isteyenler yazılanları okudunuz. Bakalım yukarıda yazılanları okuduktan sonra yanlış bildiğinizde ısrar mı edeceksiniz yoksa Visual Studio’yu açıp zirveye çıkmak için yazılanları üç beş dakikada test edip gerçeği görmeyi deneyecek misiniz? İlk olarak yukarıda zirveye çıkmak için yazılan koddaki out bildirisini silip değişen bir şeyin olup olmadığını görmekle Out anahtar kelimesiyle ilgili gerçekleri görmeye başlayabilirsiniz.
namespace uzayli_zekiye
{
class hakiki_sinif
{
public void benzersiz_metot(string str)
{
string ilimiz;
ilimiz = str; // Yine hata meydana gelir
str = "ADANA";
}
}
}
Tabi out anahtar kelimesinin işlevini tam olarak anlamak için reference tipler nedir, Value tipler nedir sorularına verilecek cevabınızın olması gerek. Sizleri çukura çekmeye kararlı olduğum için işe aşağıdaki gibi basit bir sınıf hazırlayacak başladım.
class in_out
{
public static void metot_bir(int x)
{
x = 200;
return;
}
}
Dikkat ederseniz bu Class’in "metot_bir" adını verdiğim bir metodu bulunmakta ve kendisine parametre olarak verilen değişkenin içeriğini değiştirmektedir. Bu sınıfı ve metodunu test etmek için üzerinde çalıştığım projenin formuna bir düğme ve ListBox yerleştirip düğmenin Click olayını temsil eden metodunu aşağıdaki gibi düzenledim.
private void button1_Click(object sender, EventArgs e)
{
int rakam = 100;
listBox1.Items.Add(rakam);
in_out.metot_bir(rakam);
listBox1.Items.Add(rakam);
}
Bu kod işletildiğinde tahmininizde yanılmazsınız ve ListBox’a 2 kez 100 yazılır. Çünkü “rakam” adını verdiğim değişkenin içeriğini (yani referansını değil) metoda parametre olarak verdim.

“rakam” adlı değişkenin içeriği yerine referansını metoda göndermiş olsaydım durum farklı olurdu. Metotlara değişkenlerin içerikleri yerine referansları yani adreslerini parametre olarak göndermek istiyorsanız ref anahtar kelimesinden yararlanmanız gerekir. Ref anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.
public partial class Form1 : Form {
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int rakam = 100;
listBox1.Items.Add(rakam);
in_out.metot_bir(ref rakam);
listBox1.Items.Add(rakam);
}
}
class in_out
{
public static void metot_bir(int x)
{
x = 200;
return;
}
}
"metot_bir" adını verdiğim metodu işletirken parametrenin önüne ref anahtar kelimesini yazdığım için hata meydana gelir. Çünkü metodun yapısında metoda parametre aracılığıyla bilgiler değer gönderilmek üzere hazırlık yapılmış. Bu nedenle metodun yapısında aşağıdaki gibi değişiklik yaptım.
class in_out
{
public static void metot_bir(ref int x)
{
x = 200;
return;
}
}
Bu hazırlıktan sonra formdaki düğme tıklanıp button1_Click() metodu işletilirse bu kez ListBox’a önce 100 sonra 200 yazılır. Çünkü “rakam” değişkeni metoda referans olarak gönderildi ve “metot_bir” adını vermiş olduğum metotta bu bellek adresinin içeriği değiştirildi.

ref anahtar kelimesi sayesinde metotlara parametre aracılığıyla değer yerine referansı gönderilir. Referans derken “rakam” değişkenin bellekteki adresinden söz etmekteyim. Bu uygulamada int tipindeki “rakam” değişkenine ilk değer vermeden aşağıdaki gibi metodu işletmiş olsaydım hata meydana gelirdi.
private void button1_Click(object sender, EventArgs e) {
int rakam;
in_out.metot_bir(ref rakam); // Hata meydana gelir.
listBox1.Items.Add(rakam);
}
Bu metodu düz mantıkla incelediğinizde hata meydana gelmemesi gerekir diye düşünebilirsiniz. Çünkü referans olarak gönderilen değişkene metotta zaten bilgi aktarılıyor ve bilgi aktarıldıktan sonra bu bellek adresinin içeriği ListBox’a aktarılmaya çalışılıyor. Buna rağmen bu kod çalıştırıldığında hata meydana gelir. Çünkü değişkenlere ilk değer aktarılmadan kendilerine tahsis edilen bir adresleri olmuyor. Bu tip hataların önüne geçmek için ref yerine out anahtar kelimesini kullanabilirsiniz. Out anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int rakam;
in_out.metot_bir(out rakam);
listBox1.Items.Add(rakam);
}
}
class in_out
{
public static void metot_bir(out int x)
{
x = 200;
return;
}
}
}
Şimdi gelelim Zirveye Çıkmak isteyenler için yazılan metindeki ender rastlanılan hatadan söz etmeye. Aşağıda verilen kodu tek gözüyle bile inceleyenlerin hatanın nedeninin out bildirisi olmayıp str adlı değişkene ilk değer aktarılmadan içeriğinin okunmak istenmesidir.
namespace uzayli_zekiye
{
class hakiki_sinif
{
public void benzersiz_metot(out string str)
{
str = "ADANA";
string ilimiz;
ilimiz = str; // Hata meydana gelmez
}
}
}
D
olayısıyla zirveye çıkmak isteyenler için hazırlanan metindeki “out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılmaz” cümlesi şeytanın katkısıyla yanlışlıkla kullanılmıştır.