Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Memik Yanık
Memik Yanık
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
3 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: ekrana fonksiyon fonksiyona fonksiyonu fonksiyonun geriye konsol metodun meydana parametre verdigim verilen vermis visual yordam C# / VC#/.NET Memik Yanık
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 4.12.2004
Okunma Sayısı : 110207
Yorum Sayısı : 17     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Fonksiyon ve Metod Hazırlamak
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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 yapa­cak 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 nesne­lerle 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öndermele­ridir. Buna göre geriye değer göndermeyen fonksiyonlara yordam denilebi­lir.

 

Visual Studio .NET ile geliştirilen uygulamalarda fonksiyonlardan metot diye söz edilmekte­dir. 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 gelmekte­dir. 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 vere­ceğ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şletilme­sini 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. Fonk­siyondaki bütün satırlar işletildikten sonra projenin işletimi söz konusu fonksiyonun çağrıl­dığı 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ıla­bilir. Bu amaçla return deyi­minden 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ıl­mış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 yararla­nı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şik­lik 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 aktara­cağı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ı yazma­nız yeterlidir. Ancak işletilecek fonksiyon parametre içeriyor ve fonksiyona paramet­reler 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şik­liklerin yapılması gerekir. Bu amaçla yukarıda vermiş olduğum Form1_Click() yordamını aşağıdaki gibi düzenle­dim.



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ım­lı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 fonksi­yonu 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() fonk­si­yonu ü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şıya­cağım. Bu amaçla Topla() fonksiyonuna ait satırları seçip Cut ve Paste komut­ları 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üm­kü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ık­tan 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 yaza­caktı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önde­rilmektedir. Ş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şke­nin 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ır­lamaya 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ı meto­dun 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ğıra­cağı 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
  • Yazılan Yorumlar
  • Yorum Yaz
HAZ
17
2012
Teşekkürler. Ben de bu konu ile ilgili bir makale yayınlamıştım. http://sonergonul.net/?p=63
MAR
27
2010
arkadaşlar benim bir sorum olacak normal bir fonksiyon oluşturma; Private Void oku() { //yapılacak işlem } benim oluşturmak istediğim fonksiyon biraz karmaşık ama elimden geldiği kadar net anlatmaya çalışıcam; bir tane TextBox var ama KeyPress event'ı kullanılıyor yani şu şekilde; private void textBox4_KeyPress_1(object sender, KeyPressEventArgs e) { //yapılcak işlem } haliyle bunu bir fonksiyon gibi başka bir yerden çağırma olmuyor onun için ayrı bir fonksiyon içersinde bu KeyPress in içeriğini yazıp çağırmam gerekiyor (yav kardeşim KeyPress özelliğinin içindeki kodları başka bir fonksiyon içinde yazıp çağırsana demeyin kod sadece Text in KeyPress'inde çalışıyor).Şimdi yazacağım kod yapmak istediğimi daha iyi açıklıycak fakat hata var işte zaten sizdende bunu için yardım istiyorum. Private Void oku(){ private void textBox4_KeyPress_1(object sender, KeyPressEventArgs e) { //yapılcak işlem } } başka bir kod bölümüne gidip oku(); dediğim zaman KeyPress de yazılan kodların çalışması gerekiyor kısacası fonksiyon içinde fonksiyon tanımlama gibi bişey.ACİL YARDIMLARINIZI BEKLİYORUM şimdiden tşk ederim...
ŞUB
8
2010
Program yazarlarından isteğimiz genelde herşeyin içinde yer aldığı örnek bir programı baştan sona kadar anlatıldığı aktif bir kitap hazırlamaları.. Böylece program yazarlarının program yazıp-yazamadıklarınıda kontrol etmiş oluruz. yoksa sadece işin kabuğunda kalmaya devam ederiz..
EKİ
23
2005
bazı kendilerine hıncal uluç süsü vermiş.. ELeştirmen bozuntusu arkadaşlar kusura bakmasınlar ama ben henüz bu programlama diline yeni başlamış daha ifadeler cast yapıları vs.. vs.. temel konularla yavaş yavaş ilerliyorum... ne kitaplarda okuduğum makalelerde bu kadar temel birşey bulmak neredeyse imkansız.. bu dili çok iyi bilmen önemli değil eğer bir makale yazıp bunu insanlara anlatmayı amaçlıyorsan belli bir kategoriden başlamak zorunda değilsin eğer bunu yapacaksan gidersin bir eğitim kurumunda yaparsın Egonuda fazlasıyla tatmin etmiş olursun.. fakat çok basit diye nitelendirenler için ne diyebilirim bilmiyorum ama özetle şöyle söyleyelim... Basit diye birşeyi yeriyorsanız kendiniz gibi olanları bulun ve intranete geçin.. çünkü internetin tüm kuramlarına aykırısınız demektir... (Beğenmiyorsan okumazsın... kaaaaarrdeeeşiiim (ne kadar basitmiş değilmi?))
MAR
30
2005
Visual Basic ve Delphi hakkında Memik Beyden çok şey öğrendim, C# konusunda da faydalı olacağına şüphem yok kendisine sonsuz teşekkür ve saygılarımı sunuyorum... Başarılarının devamını diliyorum... Ellerinize Sağlık Sn. Memik YANIK harika olmuş...
MAR
5
2005
memik beyin kitaplarini cok gordum bence biraz daha su sade dili birakip azicik profesyonel bir tarza girse cok daha iyi olur kanaatindeyim.
OCA
12
2005
Ellerine sağlık güzel bir yazı olmuş. Java yı az çok bilen birisi olarak, C# ın öğrenilmesinde beni bir adım daha teşvik etti.
OCA
11
2005
HOCAM MAKALE İÇİN ÇOK TEŞEKKÜRLER. GAYET SADE VE ANLAŞILIR BİR DİLLE YAZILMIŞ.. ELİNE VE AKLINA SAĞLIK. ELEŞTİREN ARKADAŞLARDAN DA MAKALE BEKLİYORUZ...
ARA
31
2004
Sadece eleştirmeyi biliorsunuz! başka neden anlarsınız ki! adam uğraşmış yazmış okuuyorsanız, ueni okuyanların fikrini değiştirmeyin! lütfen şikayet etme rolünden kurtulun birazda siz üretin. Teşekkürler.
ARA
6
2004
Merhabalar Açıkcası okuduğum makale çok hoşuma gitti. Eleştiri yapan kullanıcılara birşey söylemek istiyorum. Birisini eleştirebilmek için ondan daha iyi bir şeyler ortaya koyuyor olmanız gerekiyor. Daha iyisini yazabiliyorsanız benim gibi başlangıç seviyesinde olan arkadaşlarım çok minnettar olacaktır. yazamıyorsanız lütfen gereksiz yere eleştirmeyelim. burda ileri seviyede C# bilenlerden çok başlanğıç seviyesi var.
ARA
6
2004
Web de dahil bir medya ile yüzyüze isek, "algıda seçicilik" i kavramak durumundayız. Makale hakkında bir fikrim yok, çünkü tamamını okuyamadım. Ancak şu kesin ki, böyle bir makale hazırlamak insanın saatlarini alır. Bu bir yana, belki benim yaşım kadar, sektörde deneyimi olan bir insana; tarzı veya hitabettiği kesim ne olursa olsun sırf lütfedip buraya bir makale eklediği için ben kendi adıma teşekkür borçlu olduğumuzu düşünüyorum.
ARA
5
2004
Bu yazacaklarım makale yazarı Memik bey ile ilgigili değildir. Eğer birileri ortaya bir ürün, ki burda bir içeriktir, koymuşsa ve bunu bize ücretsiz sunuyorsa öncelikle teşekkür etmek lazım. Bu türden bir yorum yapmak yerine daha iyisini ortaya koymak daha başarılı bri cevap olur... Bir kişi C# yazıyorsa ve herhangi başka bir dilden hoşlanmıyorsa onu kullanmak zorunda değildir. Ayrıca o dil hakkında acımasız ve fütursuz yorumlar yazmak değildir. Siz de .NET veya C# da çok ileri olabilirsiniz ve bu makaleyi bu şekilde eleştiremezsiniz. Öte yandan çok değişik seviyerde insanların bu siteleri ziyaret ettiğini görüyorum. Kimileri programlamada çok yeni iken kimileri ise .NET te yeni. Bir yazar olarak bazen bana da çok basit sorular da gelmiyor değil. Velhasıl kelam, kaba bir tavırla insanları hedef alan, iğneleyici yorumlar yerine daha yerinde ve yapılan işlere en azından yorumla bir şeyler katma düşüncesinde olsak hep birlikte daha ileriye gitmezmiyiz?
ARA
4
2004
Arkadaşlar yazdığım bu makalenin başlığı "Fonksiyon ve Metod Hazırlamak". Bu makale doğal olarak C# uygulamalarında fonksiyon ve metotların nasıl hazırlandığı konusunda yeterli bilgisi olmayanlara yöneliktir. Akademisyen veya ekmeğini program yazarak kazanan biri iseniz ve C# ile az çok ilgilendiyseniz bu makale size birşey kazandırmaz; okumanıza gerek yoktur. Yok eğer okumuş bulundum diyorsanız ve makale hakkında birşeyler söyleme gereğini duyuyorsanız, konuyu ele alış tarzım konusunda öneri veya eleştiriniz varsa lütfen buraya veya bana yazın. Herkese Saygılar...
ARA
4
2004
Ya bu nası bi mantık algoritma olmadan teknoloji olur mu hiç.Ayrıca yukarıdaki yazınında algoritmayla uzaktan yakından alakası yok.Kötü bir konu ve yazı.
ARA
4
2004
Okuyucuya teknoloji lazım. Algoritma değil. Standart Memik Yanık yazısı. Bıkmadınız mı daha ?
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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