C Sharp Programlama Dilinde Metotlar(Fonksiyonlar)
Bu makalede programlama dillerinin en önemli konularından biri olan metotlar konusunu anlatmaya çalışacağım. Öncelikle metodun ne olduğundan başlayarak, sırasıyla, metotların bize sağladığı avantajlar, değer döndüren ve döndürmeyen metotlar, parametre alan ve almayan metotlar, parametre anahtar kelimelerini(parameter keywords) ele alacağım.
Metot Nedir?
Bir yazılımcı olarak alt alta yazdığımız kod satırlarında aslında bir çok işlem yaparız. Projenin çapı büyüdükçe yazılan kod satırı sayısı da haliyle artacaktır. Kod sayısı artmaya başladıktan sonra ise işler artık karmaşıklaşacaktır. Bazı kod gruplarının tekrar tekrar yazıldığı görülecek, bu kod parçacıklarını kontrol etmek zorlaşacak, aynı işlevi yapan kod bloklarında hata alındığında hepsini birden teker teker düzeltmek zorunda kalınacak, kodların okunabilirliği zorlaşacak, tüm bunların neticesinde ise programın geliştirilebilirliği bir noktadan sonra ister istemez tıkanacaktır.
İşte tüm bu sorunları çözmek için imdadımıza metot dediğimiz yapılar koşmaktadır. Metotlar tüm programlama dillerinde vardır ve kendilerine verilen görevleri yapan kod gruplarıdır. Metotlar belirli görevleri yapmak için oluşturulurlar ve kod akışı sırasında görev sırası geldiğinde kullanılırlar. Böylece aynı işlem için tekrar tekrar aynı kodlar yazılmamış olur. Dolayısıyla daha az satır kod yazılmış böylece de kod karmaşası engellenir, kodları okuyup anlayabilmek kolaylaşır. Diğer taraftan aynı farklı yerlerde aynı işlevi yapan kodların yönetimi tek bir yerden yapıldığı için kodların yönetimi, hata yakalaması kolaylaşır. Tüm bunların yanında tek bir yerden yönetim sayesinde kodlar çok rahat bir şekilde geliştirilebilir.
Metotlar nesne yönelimli programlamanın da temelini oluşturmaktadır. Nesne yönelimli programlama felsefesinin anlaşılması aslında metotların ortaya çıkış nedenlerini ve yazılım dünyasına sağladığı faydaları anlamaktan geçmektedir.
Metotların Faydaları Nelerdir?
Metotların faydalarını maddeler halinde yazacak olursak:
- Aynı işlevi yapan ve farklı yerlerde kullanılan kod bloklarının defaatle yazılmasını engeller.
- Daha az kod yazılmasını sağlar.
- Kod karmaşıklığını engeller.
- Kodların okunabilirliğini ve anlamlandırılabilirliğini sağlar.
- Satırlarca kodun tekrar tekrar yazılmasını engelleyerek zaman tasarrufu sağlar.
- Aynı işlevi yapan kod bloklarının yönetiminin tek merkezden yapılmasını sağlar.
- Tek merkezden yönetim ve kod karmaşasının azalması sayesinde geliştirilebilirlik artar.
Metotlar Nasıl Oluşturulur ve Kullanılır?
Öncelikle şu iki kavramın birbirinden farklı anlamlara geldiğini belirterek başlayalım. Metot oluşturmak ve metot çağırmak. Metot çağırma kavramına geçmeden önce metot oluşturmanın ne olduğuna bakalım.
Metotlar sadece global alanda tanımlanabilirler. Herhangi bir lokal alanda oluşturulabilmeleri söz konusu değildir.
Metot oluşturma söz dizimi(syntax) şu şekildedir.:
[erişim belirteci] [geri dönüş değeri] [metot ismi] ([aldığı parametreler])
{
[İşlem Kodları]
}
Tüm metotların mutlaka bir erişim belirleyicisi(private, public) vardır ve söz dizimi bununla başlar. Erişim belirleyicisinin yazılmadığı durumlarda varsayılan olarak “private” erişim belirleyicisi C# tarafından atanır. Erişim belirleyicisi metotlara nerelerden erişilebileceğini ifade eder. Erişim belirleyicisinin “public” olması durumunda oluşturulan metoda her yerden erişilebilirken “private” olması durumunda sadece oluşturulduğu sınıf içerisinden erişilebilir. Bunların dışında “internal” ve “protected” erişim belirleyicileri de vardır. “internal” erişim belirteci sadece bulunduğu projedeki sınıflardan kullanılabilirken “protected” erişim belirteci sadece oluşturulduğu ve kalıtım yoluyla aktarıldığı sınıflardan erişilebileceğini ifade etmektedir. Erişim belirteçleri nesne yönelimli programlama tarafında daha iyi anlaşılacağından burada sadece böyle bir şeyin var olduğunun bilinmesi yeterli olacaktır.
Erişim belirtecinin ardından ise metodun geriye döndüreceği verinin tipi yazılır. Geriye değer döndürmek kavramı ile kastedilen; metodun, yaşam alanında yapılan işlemler neticesinde bir çıktı vermesidir. Metotlar, değer ve referans tiplerinin her ikisinde de değer döndürebilir. Bunun yanında metotlar geriye değer döndürmeyebilir de. Geriye değer döndüren metotların tipi int, string, double, class, object vb. olurken, değer döndürmeyen metotların geri dönüş tipi olarak void anahtar kelimesi yazılır. Void ifadesi anlam olarak “boş” demektir. Ancak buradaki terim anlamı itibariyle “tipsiz” olma durumunu ifade etmektedir.
Metoda, metodun işlevini en iyi anlatan bir isim verilmelidir. Metotların isimleri kural olmamakla birlikte büyük harf ile başlar. Şayet birden fazla kelimeden oluşuyorsa bu durumda kelimeler, ilk harfleri büyük harf ile yazılarak birleştirilir. Yine kural olmasa da metot isimleri yazılım geleneği olarak emir kipi ile yazılır.
Metodun ismi yazıldıktan sonra metot parantezleri gelir. Bu parantezler metotların olmazsa olmazlarıdır. ( ) şeklindeki ilk parantez grubu varsa metot parametrelerinin yazıldığı yerdir. Metotlar parametre almak zorunda değildir. Fakat parametre almasalar dahi bu parantez grubunun olması zorunludur. { } şeklindeki ikinci parantez grubu ise metodun yaşam alanıdır. Burada ise metodun yapması istenen işlevlerin kodları yazılır.
Metot İmzası(Method Signature)
Metot imzası, metodun kimliği demektir. Diğer metotlar ile farkını ortaya koyar. Metot imzası iki kısımdan oluşur. Birinci kısım metodun ismi, ikinci kısım ise ilk parantez grubu olan metodun parametre kümesidir. Bu iki kısımdan herhangi biri değiştiği anda metodun imzası değişecektir. Dolayısıyla geri dönüş tipinin farklı olması metot imzasını değiştirmeyecektir.
Metot kullanımında dikkat edilmesi çok önemli olan bir konu da “metot oluşturma” ve “metot çağırma” kavramlarıdır. Bu iki kavram birbirine karıştırılmamalıdır. Yukarıda detayları anlatılan işlemler metot oluşturmaktır. Burada, metoda nereden erişilebileği, metodun tipi, adı, parametreleri ve işleyeceği kodlar tanımlanır. “Metot çağırma” kavramı ise metodun, işlevini yerine getirmesinin istendiği yerde yazılmasıdır. Metotlar sadece lokal alanda çağrılabilirler. Global alanda çağrılabilmeleri söz konusu değildir. Metotlar çağrılmadıkları sürece çalışmazlar. Global alanda kod bloğu olarak dururlar. Çalışmaları için çağrılmaları gerekir.
Metot çağırma söz dizimi(syntax) şu şekildedir:
[metot ismi] ([aldığı argümanlar]);
Önce metot ismi ve parantez içerisinde varsa aldığı argümanlar yazılır ve noktalı virgül kullanılır. Şu mutlak bir kuraldır ki metotlar çağrıldıklarında mutlaka noktalı virgül kullanılır aksi takdirde söz dizimi(syntax) hatası verecektir.
Kısaca parametre ve argüman kavramlarına değinmekte doğru kullanılmaları ve yerleşmesi açısından faydası var. Parametre ve argüman kimi kaynaklarda aynı şeyler gibi ifade edilen ancak aynı olmayan kavramlardır. Parametre yukarıda detayları anlatılan metot oluşturma aşamasında ilk parantez grubu içerisine yazılan değişkenlerdir. Argüman ise metodun çağrılması sırasında metoda işlemesi için verilen değerlerdir. Parametre ve argüman kavramları Parameter & Argüman başlığı altında daha detaylı anlatılacaktır.
C # programlama dili, metotların kullanımını kolaylaştıracak bir takım ipuçları tanımlamıştır. Bunlardan bir tanesi oluşturulan metoda açıklama eklenmesidir. Bunun için metot imzasının üzerinde yan yana üç tane slash(///) işareti konulduğunda summary aralığı açılacaktır. Bu aralığa metodun yaptığı işlev ile ilgili kısa açıklama eklenebilir. Böylece metodun başka kullanıcılar tarafından ne iş yaptığı kolayca anlaşılabilir. Mouse ile metot isminin üzerine gelindiğinde açıklama görülebilir.
Proje oluşturulurken temel işlevler öngörülerek önceden bu işlevlerin metotları hazırlanabilir. Ancak çalışma sırasında da metot oluşturma ihtiyacı doğabilir. Bu durumda C # programlama dilinin sağladığı kısayol ise kolayca metot oluşturulabilir. Bunun için lokal alanda oluşturulmak istenen metodun adı yazılıp parantezleri konulduktan sonra Ctrl + Nokta kombinasyonu ile açılan pencereden “Generate Method …” seçeneğine tıklanarak global alanda metot şablonu oluşturulur. Metot şablonu oluştuktan sonra ilgili yerler ihtiyaca göre değiştirilir.
Yukarıdaki paragrafın aksine kodlar lokal alanda yazıldıktan sonra bu kodların tekrar ettiği görülebilir ya da tekrar kullanılabileceği öngörülebilir. Bu durumda da yazılan kodların bir metot içine alınması gerekebilir. Kes-kopyala-yapıştır yöntemi ile bu sorun halledilebileceği gibi C # dilinin sağladığı kısa yol ile yapmak yazılımcı prestiji açısından daha uygun olanıdır. Bu kısa yol şu şekilde kullanılır. Önce metot içerisine alınmak istenen kodlar seçilir. Kodlar seçildikten sonra Ctrl + R(efaktor) + M(ethod) kombinasyonu yapıldığında lokal alanda bulunan kodlar ile global alanda metot oluşturulacaktır. Geriye ise sadece metodun ismini yazdıktan sonra enter tuşuna basmak kalacaktır.
Metot Türleri
Metotlar değer döndüren ve değer döndürmeyen şeklinde ikiye ayrılır. Kendi içlerinde de parametre alan ve almayan şeklinde tekrar iki ayrılırlar.
Değer Döndürmeyen Metotlar
Geriye değer döndürmeyen metotlar sonuç vermeyen metotlardır. Bu metotlar sadece yaşam alanlarında belirtilen işlemleri yaparlar. Dolayısıyla geriye değer döndürmeyen metotlar herhangi bir değişkene atanamazlar. Örnek vermek gerekirse Console.WriteLine(), değer döndürmeyen bir metottur. Sadece konsola verilen değeri yazdırır. Görevi sadece yazmaktır. Clear() metodu değer döndürmeyen bir metottur, görevi sadece silmektir. Anlaşılacağı üzere bu metotlar çıktı vermezler. Geriye değer döndürmeyen metotların geri dönüş tipi void’tir.
Parametresiz Değer Döndürmeyen Metotlar
Parametresiz değer döndürmeyen metotlar oluşturulmaları sırasında parametre kümesinde parametre tanımlanmayan metotlardır. Çalışmaları için girdi(input) olarak herhangi bir argüman istemezler. Clear() metodu parametresiz değer döndürmeyen bir metottur.
Parametreli Değer Döndürmeyen Metotlar
Parametreli değer döndürmeyen metotlar, oluşturulmaları sırasında parametre kümesinde parametre tanımlaması yapılan ve çalışmaları için argüman isteyen metotlardır. Bir metodun parametresinin olması o metoda girdi()input yapılacağı anlamına gelmektedir. Dolayısıyla bu metotlara(overloading olmaması şartıyla) argüman verilmemesi halinde söz dizimi(syntax) hatası verecektir. Console.WriteLine() metodu ise parametreli değer döndürmeyen bir metottur. Argüman olarak aldığı değeri sadece konsola yazdırır. Bu işlemi yaptıktan sonra geriye herhangi bir çıktı vermez.
Değer Döndüren Metotlar
Geriye değer döndüren metotlar yapılan işlem sonucunda mutlaka değer veren metotlardır. Dolayısıyla metodun geri dönüş tipine uygun bir değişkene atanabilirler. Değer döndüren metotların mutlaka bir geri dönüş tipi vardır ve istenilen tipte olabilir(int, string, char, object, class). Değer döndüren metotlar ile metodun geri dönüş tipi ile ne yapılıyorsa tüm bu işlemler yapılabilir. Örneğin bir metodun geri dönüş tipi string ise metot sanki bir string değermiş gibi kullanılabilir. Çünkü yukarıda izah ettiğimiz üzere metodun yaşam alanındaki kodların çalışması neticesinde mutlaka bir değer ortaya çıkmıştır. Geriye döndürülecek değerin belirlenmesi return ile sağlanır. Geri değer döndüren metotların yaşam alanı mutlaka return ve metodun geri dönüş tipine uygun bir değer ile sonlandırılmalıdır. Metodun değer gibi davranması return ifadesi sayesinde gerçekleşmektedir. Değer döndüren metotlar geriye sadece bir değer döndürür.
Geriye değer döndüren metotlarda return ifadesinden sonra başka kodlar yazılsa dahi işlenmez. Böyle bir durumda unreachable code detected uyarısı verecektir.
Peki neden değer döndüren metotlara ihtiyaç duyulmuştur? Programlama sırasında bir değişken mevcut olan değeri ile değil de belirli işlemlerden sonra aldığı son değeri ile kullanılmak istenebilir. Bu durumda geri değer döndürmeyen metotlar her ne kadar değişkenin içinden geçmesini istediği işlemleri yapsa da işlemin sonucunda değer vermez. İşte bu durumda değer döndüren metotlar kullanılır.
Parametresiz Değer Döndüren Metotlar
Parametresiz değer döndüren metotlar oluşturulmaları sırasında parametre kümesinde parametre tanımlanmayan metotlardır. Çalışmaları için girdi(input) olarak herhangi bir argüman istemezler. Örneğin Random.Next() metodunun ilk görevi parametresiz değer döndüren bir metottur.
Parametreli Değer Döndüren Metotlar
Parametreli değer döndüren metotlar, oluşturulmaları sırasında parametre kümesinde parametre tanımlaması yapılan ve çalışmaları için argüman isteyen metotlardır. Bir metodun parametresinin olması o metoda girdi()input yapılacağı anlamına gelmektedir. Dolayısıyla bu metotlara(overloading olmaması şartıyla) argüman verilmemesi halinde söz dizimi(syntax) hatası verecektir. Örneğin Random.Next() metodun birinci görevi parametresiz bir metot iken ikinci ve üçüncü görevleri parametre alan metottur. Bir argüman verilmesi halinde bu ikinci görev devreye girecek buna göre değer döndürecek, iki argüman verilmesi halinde üçüncü görev devreye girecek ve bu sefer de bu duruma göre değer döndürecektir. Ancak birinci görevi parametresiz olduğu için argüman verilmemesi halinde hata vermeyecektir.
Parametre & Argüman
Parametre ve argümanın birbirine karıştırılan iki kavram olduğunu, parametrenin metotların oluşturulma aşamasında verilen değişkenler, argümanların ise metotların çağrılmaları sırasında verilen değerler olduğundan bahsetmiştik. Parametre ve argüman konusu değer döndürsün döndürmesin parametre alan tüm metotları ilgilendirdiği için burada daha ayrıntılı olarak açıklanacaktır.
Parametre kullanma ihtiyacı neden doğmuştur?
Metotların parametre almaları sayesinde çağrıldıkları yerden metodun yaşam alanına müdahale etme imkanı sağlanır. Bir an için metotların parametre almamaları düşünüldüğünde metotların yaşam alanı içindeki değişkenlerin değiştirilmesi istendiğinde çağrıldığı yerden bu mümkün olmayacak, değişkenlere müdahale edebilmek için metodun yaşam alanına gitmek gerekecekti. Ancak parametre-argüman ikilisi yoluyla metodun çağrıldığı yerden metodun yaşam alanına köprü kurulmuş olmaktadır. Böylece metodun çağrıldığı yerden verilen argüman ile yaşam alanındaki değişkenlere atama yapılabilmektedir.
Dikkat edilmesi gereken hususlar:
Bir metodun yaşam alanı ilk parantez grubu olan parametre kümesinden başlar. Dolayısıyla parametre ile aynı isimde bir değişken ikinci parantez grubu içerisinde tanımlanamaz.
Bir metot istenilen sayıda ve tipte parametre ile oluşturulabilir. Bu durumda verilen argümanlar da parametre sayısınca, aynı sırada ve tipte verilmelidir.
Metotların çağrıldıklarında parantezleri içerisinde argüman olacak değerlerin tip dönüşümü(convert edilmesi) yapılması mümkün olsa da performans düşürücü bir durumdur.
Parametre alan metotlara istenildiği taktirde varsayılan değer atanabilir. Böylece metot argümansız olarak çağrıldığında metot parametreleri varsayılan değerleri argüman olarak kabul edecektir. Bu da istisnaların olduğu durumlarda kolaylık sağlayacaktır.
Argümanların, parametre isimleri yazılarak verilmesi durumunda parametre sırasına uyulmak zorunda değildir. Ancak isimsiz verilecekler varsa önce bunlar verilmelidir.
Parametrelere varsayılan değer atanırken = işareti kullanılırken, parametre ismi ile argüman ataması yapıldığında : işareti kullanılır.
Geriye değer döndüren metotlarda geri dönüş tipi ile parametre tipleri farklı olabilir.
Varsayılan değeri olan parametreler(optional), zorunlu parametrelerden(required) önce gelemezler.
Overloading
Metot imzasının metot ismi ve parametre kümesi olmak üzere iki kısımdan oluştuğunu ve bunlardan birinin dahi değişmesi halinde metot imzasının değiştiğini belirtmiştik. Metot ismi değiştiğinde ortaya zaten bambaşka bir metot çıkacaktır. Ancak parametre kümesinin değişmesi halinde nasıl bir tablo ortaya çıkacak?
Metodun parametre kümesinin değişmesi hali aynı isimdeki metot için overloading durumu olarak özelleştirilmiştir. Overloading Türkçe’ye aşırı yükleme olarak çevrilse de terim olarak “üzerine yükleme, yeniden tanımlama” demek daha doğru olacak. Bu özelleştirme nesne yönelimli programlama anlayışının bir prensibi olan çok şekilliğin(polymorphism) gereği olarak bir işin farklı şekillerde yapılabilmesini sağlayan bir özelliktir. Bu durumda metot ismi aynı kalacak ancak parametre kümesi değişecek. Parametre kümesinin değişmesi, parametrelerin tipinin ya da sayısının değişmesi ile olacaktır. Parametre isminin değişmesi parametre kümesinin değiştirmeyecektir. Color.FromArgb() metodun ilk görevi int tipinde tek bir argüman alırken, üçüncü görevi int tipinde üç tane argüman almaktadır. Bir metodun overloading görevleri metot çağrıldığında mouse ile parantezleri içerisine gelerek Ctrl + Shift + Space kombinasyonu yapıldığında açılan pencereden ileri-geri tuşları ile öğrenilebilir. Bu pencereden metodun geri dönüş tipi, aldığı parametreler ve metodun ne işe yaradığına ulaşılabilir. Aşağıda MessageBox.Show() metodunun overload durumları gösterilmiştir.
MessageBox.Show() metodunun ilk görevi string bir argüman almaktadır.
MessageBox.Show() metodunun üçüncü görevi iki string tipinde argüman almaktadır.
MessageBox.Show() metodunun beşinci görevi iki string ve bir MessageBoxButtons tipinde argüman almaktadır.
MessageBox.Show() metodunun yedinci görevi iki string, bir MessageBoxButtons ve bir MessageBoxIcon tipinde argüman almaktadır.
Metot şayet overload bir metot ise argüman verildiğinde hangi görevinin devreye gireceği önce parametre sayısına, sayı aynı ise parametre tipine bakılarak belirlenir. Şayet bu şartlar ayrım yapmaya yetmiyorsa opsiyonel/params olmayan devreye girer. Şayet bu koşuldan da netice alınmaz ise opsiyonel olan devreye girer aksi takdirde hata verecektir.
Ref-Out-Params(keywords)
Değer döndürsün veya döndürmesin bir metoda parametre verirken kullandığımız anahtar kelimelerdir(keywords). ref ve out anahtar kelimeleri(keywords) metoda parametre olarak verilen değişkenin orjinalinin değiştirilmesini sağlarken, params anahtar kelimesi metoda birden fazla parametre verilmesini sağlar.
ref ve out anahtar kelimeleri detaylarına girmeden önce RAM ve veri tipleri hakkında bir girizgah yapmakta fayda var. Şöyle ki:
Oluşturduğumuzu programlar bilgisayarın RAM denilen hafızasında çalıştırılırlar. Projede oluşturulan tüm değişkenler RAM’de tanımlanırlar. Tabi değişkenlerin tanımlandıkları yer ve tiplere göre de RAM’de tutuldukları yerler değişiklik göstermektedir. RAM’de iki kısım bulunur. Bunlar stack ve heap alanlarıdır. Stack kısmında değer tiplerinin değerleri ve referans tiplerinin referans adresleri tutulur. Heap kısmında ise değer tiplerinin stack adresleri, referans tiplerin değerleri tutulur.
Bu bilgiyi cebe koyduktan sonra şimdi de veri tiplerine kısaca bakalım. Değer tipleri belli bir sınırı olan tiplerdir, int, byte, short, long, double vb. Referans tipler ise belirli bir sınırı olmayan tiplerdir, class, object vb. Bir de değer tipi gibi davranan referans tipleri vardır, string ve diziler.
Normal şartlarda global ya da lokal alanda tanımlanan değişkenler tipine göre ya stack ya da heap bölgesinde tutulurlar. Ancak metot parametrelerinde işler değişmektedir. Metotlar programın farklı yerlerinde birçok kez kullanıldığı için argüman olarak verilecek değişkenler metotlar kullanıldıkça değişecektir. Bu durum ise kod akışı sırasında değişken değerinin orjinal halinin değişmesine neden olacaktır. İşte bu durumu güvenlik açısından kontrol altına almak için C# değer tipleri ve değer tipi gibi davranan referans tiplerinin parametre olarak verilmesi halinde şöyle bir mekanizma getirmiştir. Bu tip değişkenler argüman olarak metoda verildiğinde; değişkenin stack’te yeni bir alanda kopyası oluşturulur. Metot artık yaşam alanındaki işlemleri bu kopya değişken üzerinden yapacaktır. Haliyle bu durumdan ister global alanda isterse de lokal alanda oluşturulmuş olsun değişkenin stack’teki orjinal hali etkilenmez. Bu işlem sırasında C# metoda argüman değerini Pass By Value yöntemiyle gönderir. Yani sadece argüman olarak verilen değişkenin değerini gönderir. Ta ki parametre ile ref ve out anahtar kelimeleri kullanılana dek.
Referans tipi gibi davranan referans tiplerinde ise argüman olarak değişkenin referans adresi verildiği için bu tiplerde doğrudan değişkenin orjinal değeri değişir. C# burada ise parametreye argüman gönderirken Pass By Reference yöntemini kullanır.
ref-out Anahtar Kelimesi
Yukarıda C# dilinin değer tipleri ve değer tipleri gibi davranan referans tiplerinin metotlara argüman olarak verilmesi halinde kopyaları üzerinden işlem yapıldığını bunun da Pass by Value yöntemi ile sağlandığını aktardık.
Ancak yapılan projede senaryo gereği metoda argüman olarak verilen değer tipi veya değer tipi gib davranan referans tipi değişkenin orjinal değerinin değişmesi istenebilir. Bu durumda değişkenin referans adresinin argüman olarak verilmesi gerekir ki değişkenin orjinal değerine ulaşılabilsin. C# bunu ref ve out anahtar kelimeleri ile sağlar. Bu anahtar kelimeler metot oluşturulurken parametre ile kullanıldığında artık argüman olarak verilen değişkenin referans adresine hitap edilecek ve orjinal değer değişecektir. C# burada argüman olarak verilen değişkeni metot parametresine referans tipi gibi davranan referans tiplerinde olduğu gibi Pass By Reference yöntemi ile gönderir.
ref ve out anahtar kelimelerinin parametre ile kullanılması halinde metot çağrıldığında argümanlarda verilirken de kullanılmaları gerekir.
ref ve out kelimelerinin farkı ise argüman olarak verilecek değişkenlere atama yapılmış olup olmamasıdır. ref anahtar kelimesinin kullanıldığı metotlara verilecek argümanların değerinin atanmış olması gerekir. Dolayısıyla global alanda tanımlanan bir değişkenin değeri atanmasa dahi varsayılan olarak “0” atandığı için bu değişkenin ref ile kullanılması hata vermez. Ancak lokal alanda tanımlanmış ve değeri atanmamış bir değişkenin varsayılan(default) değeri olmadığı için ref ile kullanıldığında “unassigned local variable” hatası alınır.
ref anahtar kelimesinin kullanıldığı metotlara argüman verilirken son derece dikkat edilmelidir. Değişkenin orjinal değeri değişeceği için mantık hatasına yol açacaktır.
Değeri atanmamış bir değişkenin metoda ref ile argüman olarak verildiğinde “unassigned local variable” hatası alınması ve bunu aşmak için ise değişkene rastgele bir değerin atanmasının ileride mantık hatasına yol açabilecek olması karşısında ref anahtar kelimesi yetersiz kalacaktır. Ayrıca her defasında boş yere atama işlemi gerçekleşecektir. İşte bu şartlarda ref yerine out anahtar kelimesi kullanılır. out anahtar kelimesi değer atanmamış bir değişkenin argüman olarak verilmesi halinde metot yaşam alanındaki işlemler sonucunda yeni bir değere sahip olması için kullanılır. Bu işleme ise “değer fırlatma” denir. Bu kavram “değer döndürme” ile karıştırılmamalıdır. “değer fırlatma” sadece out anahtar kelimesinin olduğu durumlarda söz konusudur. Sadece geriye değer döndüren metotlar değer döndürebilirken, değer fırlatmayı değer döndürmeyen metotlar da yapabilir. Değer döndürmede tek bir değer döndürülürken, değer fırlatmada birden fazla değer fırlatılabilir. Bir metodun değişkene atanabilmesi tamamen metodun geriye değer döndürmesi ile ilgilidir, değer fırlatma ile bir ilgisi yoktur.
Değer döndüren bir metot aynı zamanda değer fırlatabilir de. Dönen değer ile fırlatılan değer farklı tip ve değer de olabilir. Örneğin int değer döndüren bir metot string tipinde değer fırlatabilir.
Değerleri atanmış değişkenlerde ref anahtar kelimesini kullanmak daha fazla performans sağlar. out, ref anahtar kelimesinin yaptığı her şeyi yapabilir ancak arka tarafta çalışan dinamiği gereği performansı düşecektir. Dolayısıyla global alanda tanımlanmış ve değer atanmamış bir değişkenin ref ile kullanılması performans açısından daha mantıklı bir hamle olacaktır. Out ile de kullanılabilir fakat performans düşecektir.
out anahtar kelimesi ile tanımlanan bir parametreye metot yaşam alanı sonlandığında mutlaka bir değer atanmak zorundadır. Çünkü out, değer fırlatmayı ifade etmektedir. Şayet değer fırlatan bir metotta parametre değer yaşam alanı sonunda değer almıyorsa “The out parameter ‘değişken’ must be assigned to before control leaves the current method” hatası verir.
Bir metotta birden fazla sayıda ref ve out anahtar kelimesi kullanılabilir. Argüman verilirken de bu anahtar kelimelerin yazılması gerekir. Aksi takdirde hata verecektir.
params Anahtar Kelimesi
Aynı tipte olmak kaydıyla metot içerisinde kullanılacak parametre sayısının bilinmediği durumlarda kullanılır. params anahtar kelimesi dizi yapısıyla kullanılır ancak diziyi bilinen dizi yapısından farklı bir yapıda tutar. params anahtar kelimesi kullanılırken params olarak işaretli parametrenin en son parametre olması gerekir. Çünkü params olarak işaretli parametre kendinden sonraki hiçbir parametreyi kabul etmez. Dolayısıyla bir metotta sadece bir params kullanılabilir.
Bir Metot Hata Veriyorsa
Metotlar kullanılırken sıkça ortaya çıkan hatalar vardır. Bunların bilinmesi hata alındığında nokta atışı ile hatanın bulunmasını sağlar.
- Geriye değer döndüren bir metot geriye değer döndürmüyordur.
- Geriye değer döndüren bir metodun yaşam alanından bir kısmı değer döndürmüyordur (not all code pats return value hatası). try-catch, if else, switch case bloklarında sonlandırma bloklarının olmayışı ya da sonlandırma bloklarında değer döndürülmemiştir.
- Geriye değer döndürmeyen metotlardan değer döndürmeye çalışılıyordur.
- Metodun istediği argümanlar eksik, yanlış sırada veya yanlış tipte verilmiştir.
- Geriye döndürülecek değer yanlış tipte döndürülmüştür.