Tag Archives: method imzası

C#’ta Method Aşırı Yüklemek

C#’ta method aşırı yüklenmesi, method imzaları farklı olan aynı isimdeki methodları aynı sınıf içerisinde kullanıma izin verir. Aşırı yükleme mekanizması, parametrelere uygun eşleşen methodu bulur ya da herhangi bir basit eşleşme olmazsa bir hata üretir. Aşağıdaki örnek, arışı yükleme mekanizmasının nasıl çalıştığına bir örnektir. Main() methodunun içinde hangi methodun çağrılacağını yorum olarak yazdım.

using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace HelloWorld
{
class Test
{
static void A()
{
Console.WriteLine("A()");
}
static void A(object x)
{
Console.WriteLine("A(object x)");
}
static void A(int x)
{
Console.WriteLine("A(int x)");
}
static void A(double x)
{
Console.WriteLine("A(double x)");
}
static void A<T>(T x)
{
Console.WriteLine("A<T>(T x)");
}
static void A(double x, double y)
{
Console.WriteLine("A(double x, double y)");
}
static void Main()
{
A();          // Çağırılan F()
A(1);         // Çağırılan F(int)
A(1.0);       // Çağırılan F(double)
A("abc");     // Çağırılan F(object)
A((double)1); // Çağırılan F(double)
A((object)1); // Çağırılan F(object)
A<int>(1);    // Çağırılan F<T>(T)
A(1, 1);      // Çağırılan F(double, double)
}
}
}

Önemli: Method aşırı yükleme yanlış kullanımlara neden olabilir. Genel olarak bakarsak, method yüklemeyi sadece methodların hepsi anlamsal olarak aynı işi yaptığı zamanda kullanmalıyız. Bir çok yazılımcı, bu olayı “tek bir method farklı argümanlara sahip” olabilir şeklinde düşünür. Aslında, yerel değişkenin, parametrenin veya özelliğin tipini değiştirme, farklı yüklemelerin çağırılmasına neden olabilir. Yazılımcılar method aşırı yüklemesinin yan etkisini göremeyebilirler. Fakat kullanıcılar için bu tamamen farklı sonuçlar doğurabilir.

Brad Abrams, .NET framework’ü geliştirme aşamasının başlarında, String adında bir sınıfın içinde şu method yüklemelerin problem yarattığını söylüyor:

public class String
{
public int IndexOf (string value);
// Örnekteki değerin index'ini geri döndürür.
public int IndexOf (char value);
// Örnekteki değerin index'ini geri döndürür.
public int IndexOf (char[] value);
// Değerin içindeki karakterlerin ilk index'ini geri döndürür.
} 

Buradaki son method, farklı sonuçlara yol açtığını söylüyor. Şöyle ki;

 "Joshua, Hannah, Joseph".IndexOf("Hannah"); // Geriye 7 döndürür. 

Fakat

"Joshua, Hannah, Joseph".IndexOf(new char [] {'H','a','n','n','a,'h;");
 // Geriye 3 döndürür.

Buradaki son methodun isminin method aşırı yüklemesine bağlı kalınarak aşağıdaki şekilde olması gerektiğini söyler:

public int IndexOfAny (char [] value);

C#’ta Methodlar

C#’ta methodlar, bir sınıf ya da nesne tarafından gerçekleştirilen hesaplamaları ya da eylemleri uygulayan üyelerdir. Static methodlara sınıflar aracılığıyla erişilebilirken, Instance (örnek) methodlara bir sınıfın örneği tarafından erişilebilir.

Methodlar bir parametre listesine (boş olabilen) sahip olabilir ki bunlar methoda geçirilen değer ya da değişkenlere referans gösterirler. Bununla birlikte bir geri dönüş tipine sahip olabilirler (return type) ki bu da method içinde hesaplanan değerlerin programa geri vereceği değeri belirler. Eğer bir methodun geri döüş tipi “void” ise, o method bir değer döndürmez.

Tıpkı tipler gibi, methodlar da, bir takım tip parametre setlerine sahip olabilirler. Bunun amacı method çağırıldığında, hangi tiplerin belirlenmesi gerektiğidir.

Bir method imzası (signature), sınıf içerisinde eşsiz bir değer olmalıdır. Bir method imzası; var olan methodun ismi, tip parametrelerin sayısı, erişim düzenleyicileri (modifier) ve parametrelerin tiplerinden oluşur. Method imzası geri dönüş tipi içermez.

Önemli: Generic tiplerin şanssız bir sonucu olarak, yapısal bir tip (constructed type), özdeş imzalar içeren iki farklı methoda sahip olabilir. Örneğin;


class Sınıf<T>
{
void Method(T t){}
void Method(int t){}
}

şeklide bir kod hiçir hata içermez. Fakat Sınıf<int>’in özdeş imzalara sahip iki farklı methodu olmuş olur. Daha sonra göreceğimiz gibi, bu durum method’ların aşırı yüklenmesinde ve arayüz implementasyonlarında bazı ilginç senaryolara yol açar. İyi bir yönlendirme olarak; bunu yapmayın.