|
Fonksiyon ve Metod Hazırlamak |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalede
Visual C#’ta fonksiyon ve metotların nasıl
hazırlandığı konusunda bilgi bulunmaktadır. Bu makale
yazarın daha önce yayınlanan kitabından olduğu gibi
alındığı için kitabın daha önceki sayfalarında
anlatılan bazı konulara yer yer gönderme yapılmaktadır.
Visual C# projelerinin
temel bileşeni olan formlara her biri değişik bir amaca yönelik
kontroller Toolbox’tan seçilip yerleştirile bilinmektedir. Üzerinde
çalıştığınız forma bir Button
yerleştirip tasarım anında düğmeyi çift tıklarsanız
düğme için kod yazılabilinen pencere açılır ve
çalışma anında düğme tıklandığı zaman
işletilmek üzere bir metot kalıbı hazırlanır. Bu
şekilde hazırlanan metot geriye bir değer göndermediği için
metot veya fonksiyon adının önüne void deyimi
yazıldı.
Visual C# projeleri
dahilinde kullanılan nesnelere uygulanma olasılığı
olan olaylar için metot veya fonksiyon kalıpları otomatik olarak
hazırlanmaktadır. Hangi olay için metot veya fonksiyon kalıbı
hazırlamak istiyorsanız Properties penceresinde söz konusu
nesneye ait olayların listelenmesini sağlamalısınız.
Bildiğiniz
gibi Properties penceresinde ilgili nesneye ait tanımlı
olayların listelenmesini sağlamak için Events düğmesini
tıklamak gerekmektedir. Aşağıda verdiğim ekran
görüntüsünü aldığım sırada Properties penceresinde “button”
nesnesine ait olaylar listeleniyordu.
Örneğin
çalışma anında formdaki düğme
tıklandığı zaman yapılması istenen işlemleri
yapacak kodlar Click yordamına yazılır. Properties
penceresinde “button1” düğmesine ait olaylar listelenirken KeyPress
olayının üzerinde çift tıklama yapınca aşağıdaki
gibi bir yordam veya geriye değer göndermeyen metot kalıbı
hazırlandı.
Form veya
diğer nesnelerle ilgili olarak projelere dahil edilen yordamların
dışında yapmak istediğiniz işlemler için kendiniz
yordam veya fonksiyonlar hazırlayabilirsiniz. Visual C#’ta Visual Basic ve
Delphi, Pascal gibi dillerden farklı olarak Procedure veya yordamlar
yoktur. Gerçekte yordam ile fonksiyon arasındaki tek fark, fonksiyonların
geriye değer göndermeleridir. Buna göre geriye değer göndermeyen
fonksiyonlara yordam denilebilir.
Visual Studio .NET
ile geliştirilen uygulamalarda fonksiyonlardan metot diye söz
edilmektedir. Aslında direk nesneler üzerinde işlem yapmayan metotları
fonksiyon diye adlandırma taraftarıyım. Farkında olmadan
bazen metotlardan fonksiyon diye söz ettiğim oluyor. Bu kitapta geriye
değer göndermeyen metot ve fonksiyonlardan söz ederken yer yer yordam
kavramını kullandım.
Yukarıda verilen
metodun başına konulan private deyimi sayesinde bu metoda
başka bir sınıftan erişim sağlamak veya kullanmak
mümkün olmaz. Daha önce konsol uygulamaları hakkında bilgi verilen
bölümden hatırlayacağınız gibi C# uygulamaları sınıflardan
meydana gelmektedir. Yeni bir proje hazırlandığında
projeye dahil edilen form ile aynı ada sahip bir class veya
sınıf hazırlanmaktadır. Bir forma sahip yeni bir proje
hazırlandığında Visual Studio .NET tarafından otomatik
olarak hazırlanan sınıfı aşağıda
görebilirsiniz.
Projeye 2. bir form
dahil edilmesi halinde 2. bir sınıf hazırlanır.
Dolayısıyla önüne private deyimi yazılan yordamı
başka sınıflarda kullanmak mümkün değildir.
Hazırlayacağınız yordam veya metodu başka
sınıflarda kullanmak istiyorsanız yordamın başına
private yerine public yazmalısınız.
Hazırlamış
olduğunuz fonksiyon geriye bir değer göndermiyorsa veya başına
void deyimi eklenmiş ise bu fonksiyona yordam(Procedure)
diyebilirsiniz. Şimdi “Mesaj_yaz” adında geriye değer
göndermeyen basit bir fonksiyon hazırlayacağım. Geriye
değer göndermeyen fonksiyonların başına void deyimi
eklenmektedir.
Bu amaçla forma ait
kod penceresinde aşağıdaki gibi bir yordam kalıbı
hazırladım. Bu yordamın başına erişim belirteci
olarak public veya private yazmadığım için yordamın private
yani sınıfa özel olduğuna karar verilir.
Hazırlamak
istediğim fonksiyon sayesinde MessageBox sınıfının Show()
metodu ile ekrana mesaj vereceğim. Aslında böyle bir işlem için
form ve diğer nesnelerle ilgili olarak önceden tanımlı mevcut
yordamlardan(olaylar) yararlanılabilinir ama buradaki amacım
deneysel. Bu nedenle yukarıda verdiğim Mesaj_yaz() yordamına bir
satırlık kod ekledim.
Hazırladığım
bu metot veya fonksiyonun formun üzerinde tıklama
yapıldığı zaman işletilmesini istiyorum. Bu nedenle
Form_Click() yordamına Mesaj_yaz() fonksiyonunu işletecek bir
satırın yazılması gerekir. Bir fonksiyonu işletmek
veya çağırmak için fonksiyonun adını yazmak yeterlidir.
Bu şekilde
fonksiyon hazırlanıp çalışma anında formun üzerinde
tıklama yapılırsa Form_Click() yordamı işletilir. Bu
yordamda Mesaj_yaz() fonksiyonunu çağıran bir satır
olduğundan Mesaj_yaz() yordamı sayesinde bir diyalog kutusu içinde
ekrana mesaj verilir.Return Deyimi
Normal
şartlarda çağrılan fonksiyon veya yordamdaki satırlar
sıra ile işletilir. Fonksiyondaki bütün satırlar
işletildikten sonra projenin işletimi söz konusu fonksiyonun
çağrıldığı satırdan bir sonraki satıra
geçer. Çağrılıp işletilen fonksiyondan veya metottan sonra
işletilecek başka satır yoksa projenin işletimi aktif formda
kalır. Fonksiyondaki bütün satırlar işletilmeden fonksiyondan
çıkılabilir. Bu amaçla return deyiminden
yararlanılmaktadır.
Aşağıda
verilen konsol uygulamasında hazırlanan fonksiyonda
kullanıcıdan toplanmak üzere 2 sayının girilmesi
istenmektedir. Girilen sayılardan birisinin 0 olması halinde
fonksiyonun geri kalan satırları işletilmeyip fonksiyondan
çıkılmaktadır. Bu konsol uygulamasındaki
“topla()”yordamının başına public yazmış
olmama rağmen bu uygulamada bir tek sınıf olduğu için
public deyiminin burada herhangi bir işlevi yoktur.
Daha önceki
konularda nesnelerle ilgili oldukları için önceden tanımlı olan
bazı yordamlarda parametreler kullanılıyordu. Örneğin daha
önce TextBox nesneleri için tanımlı olan KeyPress()
olayından söz edilmişti. KeyPress olayı çalışma
anında kullanıcının klavyenin her hangi bir tuşuna
basması halinde meydana gelmekte ve söz konusu nesne ile ilgili olarak
KeyPress() yordamı önceden hazırlanmış ise işletilmektedir.
KeyPress
olayını temsil eden yordam adından sonra parantez içinde “e”
adında bir parametre vardır. KeyPress olayının meydana
gelmesi sırasında hangi tuşa basılmışsa,
basılan tuşun kodu “e” parametresi sayesinde yordama gönderilir.
Programcı, projenin bir yerinden başka bir yerine bilgi aktarmak
amacıyla kullanılan bu değişkenin(parametre)
içeriğinden yararlanıp istediği işlemleri yapabilir.
Fonksiyonlar İçin Parametre
Tanımlamak
Yukarıda
hazırladığım fonksiyon geriye bir değer
göndermediği gibi fonksiyon çağrılırken fonksiyona bilgi
gönderilmedi. Şimdi yukarıda verdiğim Mesaj_yaz() fonksiyonunda
değişiklik yapıp fonksiyonun bir parametreye sahip
olmasını sağlayacağım. Fonksiyon
dışarıdan bilgi alacaksa veya parametrelere sahip olacaksa bu
parametreler değişken tanımlanıyor gibi parantezin içine
yazılmalıdır.
Mesaj_yaz() fonksiyonu
dışarıdan string tipte bilgi alacağı için
parantezin içinde string tipinde bir değişken tanımladım.
Fonksiyon çağrılırken dışarıdan birden fazla
bilgi alacaksa parantezin içinde birden fazla değişken
tanımlanır. Mesaj_yaz() fonksiyonunu bu şekilde
değiştirdikten sonra Form1_Click() yordamını
aşağıdaki gibi düzenledim. Bu yordam işletildiğinde
Visual Basic .NET’in InputBox() metodu ile kullanıcıdan mesaj girmesi
istenir ve girilen bilgi Mesaj_yaz() fonksiyonuna parametre olarak verilir.
Şimdi ise
kendisine parametreler aracılığı ile gönderilen 2
sayıyı toplayıp ekrana yazan “Topla()” adında bir fonksiyon
hazırlayacağım. Hazırlamak istediğim fonksiyona
dışarıdan int tipinde 2 sayısal bilgi aktaracağım
için parantezlerin içine parametrelerin tipilerini ve adlarını
aşağıdaki gibi yazdım. Bu metodun
içinde tanımlanan “sonuc” değişkeni metodun
dışında tanımsızdır.
Üzerinde
çalıştığınız forma ait kod penceresinde bulunan
bir fonksiyonu çağırmak için fonksiyonun adını yazmanız
yeterlidir. Ancak işletilecek fonksiyon parametre içeriyor ve fonksiyona
parametreler ile bilgi gönderilecekse, fonksiyonun
çağrıldığı satırda fonksiyon adından sonra
içerikleri fonksiyona aktarılmak istenen değişkenler veya
bilgiler yazılır.
Programın
çalışması sırasında formun her hangi bir yerinde
tıklama yapılırsa Click olayı meydana gelir ve Form_Click()
metodu işletilir. Bu metottaki Topla( maas, mesai) satırı
ile “maas” ve “mesai” değişkenlerinin içerikleri Topla() fonksiyonuna
aktarılır ve Topla() fonksiyonu işletilir.
Fonksiyonların Geriye Değer Göndermeleri
Yukarıda hazırladığım
2 fonksiyon geriye bir değer göndermiyorlardı. Bu nedenle fonksiyon
adından önce void deyimini kullandım. Şimdi yukarıda
verdiğim Topla() fonksiyonunda değişiklik yapıp bu
fonksiyona gönderilen 2 sayının toplanıp sonucun geriye
gönderilmesini sağlayacağım. Bu amaçla fonksiyon
adının önüne yazdığım void deyimini silip
yerine int yazdım.
Fonksiyon geriye ne
tür bilgi gönderecekse o bilgi tipinin fonksiyon adının önüne
yazılması gerekir. Bu fonksiyon geriye int tipinde bilgi
göndereceği için fonksiyon adının önüne int yazdım.
Fonksiyonlarda geriye bilgi gönderme işlemi return deyimi ile
yapılmaktadır.
Bu fonksiyon
kendisine gönderilen 2 sayısal bilgiyi toplayıp “sonuc”
değişkenine aktardıktan sonra bu değişkenin
içeriğini return deyimi ile geriye göndermektedir. Fonksiyonda bu
şekilde değişiklik yaptıktan sonra fonksiyonu
çağıran yordam veya fonksiyonda bazı değişikliklerin
yapılması gerekir. Bu amaçla yukarıda vermiş olduğum
Form1_Click() yordamını aşağıdaki gibi düzenledim.
Konunun iyice
anlaşılmasını sağlamak için şimdi başka bir
fonksiyon hazırlayacağım. Hazırlamak istediğim fonksiyonu
“int” tipindeki bir sayının kare kökünü bulmak amacıyla kullanacağım.
Bu fonksiyona int tipinde bir bilgiyi parametre olarak vereceğim için
fonksiyon adından sonra parantezlerin arasına “int X”
yazdım. Buradaki “X” parametrenin adıdır. Bu fonksiyon geriye double
tipinde bilgi göndereceği için fonksiyon adından önce double
yazdım.
static double karekok(int X)
{
double kok;
kok = Math.Sqrt(X);
return kok;
}
|
Bu fonksiyonda
kullanılan Sign() ve Sqrt() fonksiyonları Math
adlı Namespace’inde tanımlıdır. Bu nedenle fonksiyon
adından önce Namespace adı yazılmalıdır. Yukarıda
belirtildiği gibi Visual C#’ta geriye değer gönderme işlemi return
deyimi ile yapılmaktadır. Bu fonksiyonu ve bu fonksiyonu
çağıran satırları konsol uygulamasına yazdım.
Bu konsol
uygulaması derlenip çalıştırıldığında
kullanıcıdan karekökü alınacak sayı istenir. Ancak kesirli
bir sayının karekökünü almak istemiz halinde hata meydana gelir.
Çünkü yazdığım fonksiyonu dışarıdan int
tipinde bilgi almak üzere düzenledim. Bunun önüne geçmek için girilen
sayının int tipine dönüştürülmesi sağlanabilir. Bu örnekte
kullanılan karekok() fonksiyonun double bilgi alıp
geriye double tipinde bilgi gönderebilmesi için birtakım değişiklikler
yaptım.
Diğer yandan
eksi bir sayının karekökünü almak mümkün değildir. Bu
şekilde düzenlenen konsol uygulaması
çalıştırılıp eksi bir sayı girildiğinde
programın çalışması kırılmaz ama
kullanıcının bu konuda bilgilendirilmesi gerekir. Bu amaçla hazırlamış
olduğum fonksiyonu aşağıdaki gibi düzenledim.
static double
karekok(double X)
{
double kok;
if (Math.Sign(X) <
1)
{
Console.WriteLine("girdiğiniz sayi negatif");
return 0;
}
else
{
kok =
Math.Sqrt(X);
return kok;
}
} |
Sayısal
bilginin negatif olup olmadığı öğrenilmek istendiği
zaman Math sınıfının Sign() metodundan
yararlanılmaktadır. Sign() metodu parametre olarak
aldığı sayısal bilgi negatif veya eksi işaretli ise
geriye -1 değerini göndermektedir.
Fonksiyonları Başka Formlarda Kullanmak
Yukarıdaki
sayfada kendisine parametre olarak verilecek 2 sayıyı toplayacak
Topla() fonksiyonu üzerinde çalıştığım formda tanımlayıp
aynı formda çağırıp kullandım. Hazırlamak
istediğiniz fonksiyonun başka bir formdan çağrılmasına
imkan sağlamak istiyorsanız fonksiyon adının
başına public deyimini yazmanız gerekir. Bu konuda size
bilgi vermek için üzerinde çalıştığım projeye 2. bir
forma dahil ettim.
Projeye Form2
adında 2. bir form dahil ettikten sonra ilk formda
hazırladığım Topla() fonksiyonunu 2. forma taşıyacağım.
Bu amaçla Topla() fonksiyonuna ait satırları seçip Cut ve Paste
komutları ile 2. forma taşıdım.
Bu şartlarda
yani başka bir formdaki Topla() fonksiyonunu
çağırırsanız hata meydana gelir. Çünkü C#, Topla()
fonksiyonunu yalnızca ilk formda arar. Başka bir deyişle, bu
fonksiyon yalnızca mevcut sınıfta aranır.
Hazırladığınız
fonksiyonun başka bir formdan çağırılıp kullanılmasını
istiyorsanız fonksiyona public özelliğini vermelisiniz. Tekrar
etmek gerekirse; başka bir form demek yerine başka bir sınıf
demek daha doğru olur. Çünkü Visual C# projelerindeki her form aynı
zamanda ayrı birer sınıftır. Sınıflar
hakkında daha sonra bilgi verilecektir.
Bu şekilde
public özelliği verilen fonksiyonu herhangi bir formdan
çağırıp kullanmak mümkündür. Fonksiyonun adından önce
fonksiyonun tanımlı olduğu formun adını yazmak
gerekmektedir.
Dizi Değişkenleri Parametre
Olarak Kullanmak
Yukarıda
belirtildiği gibi hazırladığınız metot veya
fonksiyonların istediğiniz tip ve sayıda parametreye sahip olmasını
sağlayabilirsiniz. Ancak isterseniz fonksiyona parametre olarak göndermek
istediğiniz bilgileri bir dizi değişkene aktarıp bu dizi
değişkeni fonksiyona parametre olarak verebilirsiniz.
Bu işlemin
nasıl yapıldığını basit bir örnek üzerinde anlatacağım.
Bu amaçla aşağıda verdiğim konsol uygulamasında string
tipinde 5 elemanlı bir dizi değişken tanımladım ve
dizi değişkenin elemanlarına bilgi aktardım.
Bu konsol
uygulamasının Main() fonksiyonu içinde dizi değişken
tanımlayıp bilgi aktardıktan sonra şimdi bu dizi
değişkeni parametre olarak alan void bir fonksiyon
hazırlayacağım. Fonksiyona dizi değişken
aracılığıyla bilgi gönderileceği için parantezin
içinde parametre olarak kullanılacak değişkeni dizi
değişkenler gibi tanımlamak gerekir.
Bu void
fonksiyon bu şekli ile dizi değişkenin içeriğini WriteLine()metodu
ile ekrana yazacaktır. Dizi değişken özelliğine sahip bu
parametrenin elemanlarına erişirken foreach deyimini
kullandım.
Değer ve Referans Parametreleri
Şimdiye
kadar metot ve fonksiyonlar ile ilgili olarak verilen örneklere göre int, char,
long vs gibi belleğin stack adı verilen kısmında
saklanan bilgiler fonksiyonlara değer olarak gönderilmektedir.
Şimdi ve anlaşılmaz cümleyi anlaşılır kılmak
için basit bir örnek vereceğim.
Bu
konsol uygulamasında Main() fonksiyonu içinde önce “Sayi” adında int
tipinde bir değişken tanımladım ve değer aktarıp
içeriğini WriteLine() metodu ile ekrana yazdım. Ardından
uygulamadaki “Procedure1” adını vermiş olduğum yordamı
işletip “Sayi” değişkenin içeriğini tekrar ekrana
yazdırdım.
Bu konsol uygulamasındaki
“Procedure1” adını vermiş olduğum metot,
başlangıçta 100 değerini içeren “X” adını
verdiğim parametrenin içeriğini 200 olarak
değiştirmektedir. Bu şartlarda konsol uygulaması derlenip
çalıştırıldığında ekrana 2 kez 100
yazılır.
Bu olaya günlük
hayattan karşılık bulmak istersek şöyle bir örnek
verebiliriz: Elinizdeki bir evrakın fotokopisini çekip birisine
veriyorsunuz. O kişi o kopyada sonradan değişiklik yapıyor.
Bu şartlarda sizdeki evrak doğal olarak kopyada yapılan değişiklikten
etkilenmez. Yukarıda verilen örnekte yapılan budur; 100
sayısı yordama gönderiliyor. Yordamda bu değer 200 ile
değiştiriliyor ancak elinizdeki sayı bundan etkilenmiyor.
Kişiye
evrakın fotokopisi yerine aslını vermiş olsaydık durum
farklı olurdu. Bazen içeriği yordama gönderilen değişkenin
içeriğinin yordamda yapılan işlemlerden etkilenmesi istenir. Bu
gibi durumlarda parametrenin başına ref deyiminin eklenmesi
gerekir. Ref deyiminin nasıl kullanıldığını
aşağıda görebilirsiniz.
ref deyimi sayesinde metot ve fonksiyonlara parametre ile değer
yerine referansı gönderilir. Başına ref yazılan
parametrelere referans parametreleri adı verilmektedir. Referans derken
“Sayi” değişkenin bellekteki adresinden söz etmekteyim.
Bu şartlarda
bu konsol uygulaması derlenip
çalıştırıldığında ekrana önce 100
ardından 200 yazılır. Çünkü “Sayi” değişkeni metoda
referans olarak gönderildi ve “Procedure1” adını vermiş
olduğum metotta bu bellek adresinin veya referansın içeriği değiştirildi.
Başka bir deyişle, “Sayi” değişkenin içeriği yordamda
değiştirildi.
Yukarıda
hazırladığım konsol uygulamasında int tipindeki “Sayi”
değişkenine ilk değer vermeden yordamı işletmiş
olsaydım hata meydana gelirdi. Bu özelliği size hatırlatmak için
yukarıda verdiğim basit konsol uygulamasını
aşağıdaki gibi değiştirdim.
Bu yordamı düz
mantıkla incelediğinizde hata meydana gelmemesi gerekir diye
düşünebilirsiniz. Çünkü referans olarak gönderilen değişkene
yordamda zaten bilgi aktarılıyor ve bilgi aktarıldıktan
sonra bu bellek adresinin içeriği ekrana yazılmaya
çalışılıyor.
Buna rağmen bu
konsol uygulaması çalıştırıldığında
hata meydana gelir. Bu tip hataların önüne geçmek için ref deyiminin
yerine out deyimini kullanabilirsiniz. Out deyiminin nasıl
kullanıldığını aşağıda görebilirsiniz.
Diğer yandan
dizi değişkenler zaten referans tipler oldukları için ref
deyimini kullanmaya gerek yoktur. Bu cümle size bir şey ifade etmediyse
lütfen aşağıda verilen örneği dikkatlice inceleyin. Tahmin
edeceğiniz gibi aşağıda verdiğim konsol
uygulaması derlenip çalıştırıldığında “ilk_bes”
adını vermiş olduğum dizi değişkenin
elemanlarının içeriği ekrana yazılır.
Şimdi ise bu
konsol uygulamasına bir yordam veya metot ekleyip bu metot sayesinde dizi
değişkenin elemanlarının içeriğini değiştireceğim.
Bakalım bu değişiklikten Main() fonksiyonunda
tanımladığım “ilk_bes” adını vermiş
olduğum dizi değişken etkilenecek mi?
Visual C#’ta dizi
değişkenler referans bir türler olmasaydı ref deyimine
yer verilmediği için “ilk_bes” adlı dizi değişkenin
içeriği ekrana 2 kez yazılırdı. Ancak diziler zaten referans
türler olduğu için bu konsol uygulamasını
çalıştırıldığında sanki ref deyimine yer
verilmiş gibi aşağıdaki gibi bir sonuç alınır.
Yukarıda yapıldığı gibi yordamdaki parametrenin önüne ref
deyimi yazılırsa Visual C# buna gerek yok demez.
Metotların Aşırı
Yüklenmesi
Şimdiye kadar metotlar
ve fonksiyonlar hakkında verilen bilgilere göre metotlar eksik veya fazla
parametre ile işletilmek istendiğinde hata meydana gelmektedir. Bu
konuda size bilgi vermek için aşağıda verdiğim basit konsol
uygulamasını hazırladım.
Bu konsol
uygulamasındaki “Procedure1” adını vermiş olduğum metot
kendisine parametre olarak verilen int tipindeki 2 sayıyı toplayıp
geriye göndermektedir. Bu yordam çağırılırken 2 yerine 1
veya 3 parametre gönderilirse hata meydana gelir. Ancak bazen hazırlanan
metodun kaç parametre ile çağrılacağı önceden belli
değildir.
Örnek olsun diye hazırladığım
bu metot 2 sayıyı toplamaktadır. Ya kullanıcı çalışma
anında toplanmak üzere 3 sayıyı bu metoda göndermek isterse? Bu
gibi durumlarda aynı metodun 2. veya 3. kopyası hazırlanır.
Her kopyanın parametreleri farklı olur. Aynı metodun 2. bir
kopyasının nasıl hazırladığımı
aşağıda görebilirsiniz. Aynı ada sahip birden fazla metot
hazırlamaya metodun aşırı yüklenmesi(overload)
denilmektedir.
static int Procedure1(int
X, int Y)
{
return (X + Y);
}
static int Procedure1(int
X, int Y, int Z)
{
return (X + Y + Z);
} |
Kullanıcı
veya programcı int tipinde 2 sayıyı toplamak istiyorsa metodu 2
parametre ile çağırır. Bu durumda aynı metodun 2
parametreli kopyası devreye girer. Metot 3 parametre ile
çağrıldığında ise 3 parametreye sahip 2. kopyası
işlev görür.
Derleyici metodun
çağrıldığı satırda kullanılan parametre
sayısına bakarak hangi metodun hangi kopyasını
kullanacağına karar verir. Konsol uygulaması
aşağıda verilen şekli ile derlenip işletildiğinde
metodun 3. parametreye sahip versiyonu işletilir.
Yukarıda
hazırladığım metodun her 2 kopyası da int
tipinde bilgiler alıyordu. Ancak bazen
hazırladığınız metot ile değişik tipteki
bilgileri toplamak isteyebilirsiniz. Nasıl ki aynı metodun
değişik sayıda parametreye sahip versiyonlarını
hazırlamak mümkün oluyorsa, değişik tipte bilgiler üzerinde
işlem yapan kopyalarını hazırlayabilirsiniz.
Aşağıda verilen metot hem float hem de int bilgileri
toplayabilir.
static int Procedure1(int X, int Y)
{
return (X + Y);
}
static float Procedure1(float X, float Y)
{
return (X + Y);
} |
Bu metoda parametre
olarak 2 float sayıyı gönderirseniz metodun 2. kopyası
işletilir. Yukarıda verilen konsol uygulaması
aşağıdaki gibi düzenlediğinde bu metodun float bilgiler
üzerinde işlem yapan kopyası işletilir.
Aynı örnekten
yola devam edecek olursak: Bazen toplanacak sayıların kaç adet
olduğu programın yazımı sırasında belli
değildir. Bu durumda her ihtimal için metodun ayrı bir
kopyasını hazırlamak gerekir ki bu pratik değildir.
Bu gibi durumlarda
parametreler dinamik bir diziye yerleştirilir. Çalışma
anında dinamik dizinin içeriğine bağlı olarak metot işlev
görür. Bu işlemin nasıl yapıldığını size
anlatmak için yukarıda verdiğim konsol uygulamasını
aşağıdaki gibi düzenledim.
Bu şekilde düzenlenen
metot istenilen sayıda parametre ile çağrılıp
işletilebilir. Procedure1 adını vermiş olduğum metodu
yukarıda 2 parametreli olarak kullandım. Eğer bu metot ile float
tipindeki sayısal bilgileri de toplayabilmek istiyorsanız bu metodun
aşağıdaki gibi 2. bir kopyasını hazırlamanız
gerekir.
static
int Procedure1(params int[] X)
{
int T = 0;
foreach( int i in X)
T = T + i;
return T;
}
static
float Procedure1(params float[] X)
{
float T = 0;
foreach( float i in X)
T = T + i;
return T;
}
|
Konunun iyice anlaşılması
için bir Visual C# projesi hazırladım ve forma ListBox
yerleştirdim. ListBox’a aktarılmış tipindeki bilgileri
hazırlayacağım metot ile toplayıp formdaki TextBox’a yazacağım.
Bu amaçla projenin formunu aşağıdaki gibi düzenledim.
ListBox’a
tasarım veya çalışma anında aktarılmış olan
sayıları toplamak için metot hazırlamak şart olmamakla
birlikte buradaki amacımız deneysel. “Topla” başlıklı
düğme tıklandığı zaman işletilecek kodlar
sayesinde ListBox’ın elemanları int tipindeki bir dizi
değişkene aktarılacak ve bu dizi değişken
yukarıda hazırlamış olduğum “Procedure1” adlı
metoda parametre olarak verilecektir. Bu metodun geriye gönderdiği
değer ise formdaki metin kutusuna aktarılacak.
Fonksiyonların Kendi Kendilerini
Çağırması
Visual C#, metotların
kendi kendilerini çağırmalarına izin vermektedir. Bu
işlemin nasıl yapıldığını size anlatmak için
aşağıda verdiğim basit yordamı hazırladım.
Bu yordam kendi kendisini 5 kez çağırarak belirtilen mesajı 5
kez ekrana yazmaktadır.
Belli bir
şarta bağlı olarak yordamdan
çıkılmadığı zaman yordam kendisini sürekli olarak
çağıracağı için sorun çıkar. Pratik değeri
olmayan bu konsol uygulaması
çalıştırıldığı zaman aşağıdaki
gibi bir sonuç alınır.
Makale:
Fonksiyon ve Metod Hazırlamak C#, Visual C# ve .NET Memik Yanık
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|