Altbilgi içeriğine atla
Iron Academy Logo
C# öğrenin
C# öğrenin

Diğer Kategoriler

Metotları Anlamak ve C# Uzantı Metotlarını Kullanmak

[[academy-video-youtube({"vid": "UntC0hoeGAQ", "start_time": "0", "title": "C# Degişkenleri ve Veri Türlerini Anlama", "creator": "Tim Corey", "length": "28m 27s"})]]

C# programlamasında, yöntemler, yeniden kullanılabilir kodu kapsayan ve belirli görevler gerçekleştiren temel yapı taşlarıdır. Parametre alabilir, değer döndürebilir ve farklı girdileri işlemek için aşırı yüklenebilirler. Daha ileri bir kavram olan uzantı yöntemler, geliştiricilerin, kontrol etmedikleri türlere dahi işlevsellik eklemelerine olanak sağlar.

Tim Corey'nin 'C#'ta Uzantı Yöntemleri Nasıl Oluşturulur' adlı videosu mükemmel bir kaynaktır. Bu rehberde, Tim'in ele aldığı birkaç konuyu inceleyeceğiz:

  1. Yöntemleri Tanımlama ve Çağırma
  2. Yöntem Parametreleri ve Argümanları
  3. Yöntem Dönüş Değerleri
  4. Yöntem Aşırı Yükleme
  5. Uzantı Yöntemlerini Uygulama

Yöntemleri Tanımlama ve Çağırma

Örnek Yöntem Tanımlama

C#'ta bir yöntem bir sınıf içinde tanımlanır. Yöntem tanımı için genel bir yazım, bir erişim belirteç, dönüş türü, yöntem adı ve parametreler içerir.

public class SampleClass
{
    public void SampleMethod()
    {
        // Method implementation  
    }
}
public class SampleClass
{
    public void SampleMethod()
    {
        // Method implementation  
    }
}

Tim Corey'nin 4:05'teki örneğinde, statik bir sınıf içinde uzantı yöntemi oluşturmak için bir yöntem tanımlar. Tanımlanan yöntem PrintToConsole. Tanım, yöntemlerin pratik bir örnekle nasıl tanımlanacağını açıkça açıklayan tüm genel yazımı içerir:

public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}

Bir Yöntemi Çağırma

'Yöntem çağrısı', kodun başka bir yerinde tanımlanmış belirli bir yöntemi yerine getirmesi için programı yönlendirir. Yöntemler sınıf örneği veya statik yöntemlerse doğrudan çağrılır. Uzantı yöntemleri için, uzantı yaptıkları türün bir parçasıymış gibi görünürler. Videoda 6:18'de, Tim, ilkel veri türleriyle tıpkı önceden tanımlı yöntemler gibi uzantı yönteminin nasıl çağrılacağını gösterir.

string demo = "This is a demo";
demo.PrintToConsole(); // Extension method call
string demo = "This is a demo";
demo.PrintToConsole(); // Extension method call

Yöntem Parametreleri ve Argümanları

Parametreler

Parametreler, method tanımında belirtilir ve methoda geçirilen değerler için yer tutucu görevi görür. WriteLine yöntemi çağrıldıktan sonra burada görebilirsiniz, burada message parametredir.

public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}
public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}

Yine, Tim Corey'nin 4:05'te verdiği genişletme yöntemi örneğinde message parametredir:

public static void PrintToConsole(this string message)
{
    Console.WriteLine(message);
}
public static void PrintToConsole(this string message)
{
    Console.WriteLine(message);
}

Argümanlar

Argümanlar, method çağrıldığında methoda geçirilen gerçek değerlerdir.

DisplayMessage("Hello, World!"); // "Hello, World!" is the argument
DisplayMessage("Hello, World!"); // "Hello, World!" is the argument

Tim Corey, 6:20'de dize türü ile nokta söz dizimi kullanarak yöntemi çağırdığında, dize değeri aslında PrintToConsole yöntemine bir değer olarak geçiriliyor:

string demo = "This is a demo";
demo.PrintToConsole(); // "This is a demo" is the argument
string demo = "This is a demo";
demo.PrintToConsole(); // "This is a demo" is the argument

Methodun Geri Dönüş Değerleri

Methodlar, return ifadesi kullanarak değer döndürebilir. Dönüş tipi, method imzasında belirtilir.

public int Add(int a, int b)
{
    return a + b;
}
public int Add(int a, int b)
{
    return a + b;
}

Tim Corey'nin videosundaki genişleme methodu bir değer döndürmez (void dönüş tipi), ancak dönüş değerine sahip genişleme methodları oluşturabilirsiniz. Tim'in örneğindeki dönüş tipi void'dir, bu da methodun herhangi bir değer döndürmediği anlamına gelir. Aşağıdaki örnek, nasıl değer döndürüleceğini gösterir:

public static int WordCount(this string str)
{
    return str.Split(' ').Length;
}
public static int WordCount(this string str)
{
    return str.Split(' ').Length;
}

Method Aşırı Yükleme (11:15)

Method aşırı yükleme, farklı parametrelere sahip aynı ada sahip birden fazla methoda izin verir. Bu, esnek ve sezgisel API'ler oluşturmak için kullanışlı olabilir.

public void Display(string message)
{
    Console.WriteLine(message);
}

public void Display(int number)
{
    Console.WriteLine(number);
}
public void Display(string message)
{
    Console.WriteLine(message);
}

public void Display(int number)
{
    Console.WriteLine(number);
}

Tim Corey'nin 11:24'te farklı loglama senaryoları için birden fazla method oluşturma konusuna kısaca değinmesi, daha geniş anlamda bir method aşırı yükleme örneği olarak görülebilir. Log methodu iki kez mevcuttur, biri bir parametreye, diğeri iki parametreye sahiptir. 11:39'da ikinci log methodu, aynı isim altında çoklu işlevsellik veren log methodunun aşırı yüklenmiş versiyonudur.

Implementing Extension Methods in C

Genişletme Methodları Nedir? (3:13)

Genişletme methodları, mevcut türlere yeni methodlar eklemenizi sağlar ve bunları değiştirme veya yeniden derleme gereksi olmadan kullanabilirsiniz. Instance methodları gibi çağrılsalar da, genişletme methodları statik olarak tanımlanır.

Genişletme Methodu Oluşturma

Önceki bölümde, 'Methodları Tanımlama ve Çağırma' konulu bölümde Tim Corey'nin ayrı bir statik sınıfta genişletme methodu tanımlayıp statik methodu genişletme methodu olarak kullanılacak şekilde tanımladığını vurguladık. İşte Tim Corey'nin vurguladığı bazı önemli noktalar:

  1. Ayrı bir public statik sınıf tanımladığınızdan emin olun veya Tim'in dediği gibi 'sınıfı statik olarak işaretleyin, yoksa çalışmaz.'
  2. Daha fazla genişletme yöntemi oluştururken, onları türlerine göre gruplayın (3:43)
  3. İlk parametreyi this anahtar kelimesi ile öne çıkararak ve genişletilecek türü belirterek statik bir yöntem tanımlayın (4:58)
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}
public static class Extensions
{
    public static void PrintToConsole(this string message)
    {
        Console.WriteLine(message);
    }
}

Genişletme Methodunu Çağırma (6:18)

Sonra, Tim bu string değişkenine genişletme methodunun nasıl çağrıldığını gösterir:

demo.PrintToConsole();
demo.PrintToConsole();

demo girdiğinizde ve Print yazmaya başladığınızda, IntelliSense PrintToConsole yöntemini önerir. Bu, string türüne eklenen yeni yöntemdir.

Method Çağrısının Nasıl Çalıştığını Anlama (6:30)

Tim, neden demo.PrintToConsole() çağırabileceğinizi açıklar:

  • Demo bir Dize Türüdür: demo değişkeni string türündedir.
  • Genişletilmiş Dize Türü: string türü yeni yöntem PrintToConsole ile genişletildi.

Parametrenin Anlaşılması (6:41)

PrintToConsole yöntemine hiçbir parametre geçirilmediği görünse de, Tim, zımni parametre geçişini belirtir - demo dizesi, genişletme yöntemine ilk parametre olarak geçer.

Tim, genişletme methodlarının aramada tanımlamalarından bir eksik parametreye sahip olduğunu vurgular. Bunun nedeni, ilk parametrenin (genişletilen tür) örtük olmasıdır.

Genişletme Methodu İmzası

Burada this string message, yöntemin string türünü genişlettiği anlamına gelir ve message zımni parametredir:

public static void PrintToConsole(this string message)
public static void PrintToConsole(this string message)

Kodu Çalıştırma (7:08)

Son olarak, PrintToConsole yöntemi çağrıldığında, dizeyi konsola çıkarır:

Console.WriteLine(message);
Console.WriteLine(message);

Bu nedenle, demo.PrintToConsole() çağrılması konsola "Bu bir demo'dur" ifadesini yazdırır.

Üçüncü Parti Sınıflar İçin Genişletme Methodlarını Kullanma

Üçüncü Parti Sınıfları Genişletme (10:59)

Tim Corey, genişletme methodlarının, doğrudan değiştiremeyeceğiniz üçüncü parti sınıfları bile genişletebileceğini açıklar. Örneğin, 11:09'da SimpleLogger sınıfına bir göz atalım.

Burada, Tim 11:09'da konsola mesajları kaydeden varsayımsal üçüncü taraf sınıf SimpleLogger kullanıyor. Sınıfın iki methodu vardır:

public class SimpleLogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }

    public void Log(string message, string messageType)
    {
        Console.WriteLine($"{messageType}: {message}");
    }
}
public class SimpleLogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }

    public void Log(string message, string messageType)
    {
        Console.WriteLine($"{messageType}: {message}");
    }
}

Bu methodlar ideal değildir çünkü mesaj türü basit bir stringdir, bu da tutarsızlıklara yol açabilir. Tim, sınıfı geliştirmek için genişletme methodları oluşturmayı önerir.

Tutarlı Mesaj Türleri Uygulama

Genişletme methodları kullanarak, her zaman aynı mesaj türlerini ve biçimlerini kullanarak kodunuzda tutarlılığı sağlar. Burada (12:40'da), Tim bir statik sınıf ExtendSimpleLogger oluşturuyor:

public static class ExtendSimpleLogger
{
    public static void LogError(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Error");
    }

    public static void LogWarning(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Warning");
    }
}
public static class ExtendSimpleLogger
{
    public static void LogError(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Error");
    }

    public static void LogWarning(this SimpleLogger logger, string message)
    {
        logger.Log(message, "Warning");
    }
}

Çağrıları Daha Tutarlı Hale Getirme

Elinde bu varken, (14:02) artık bir SimpleLogger örneği üzerinde genişletme yöntemlerini çağırabilir:

SimpleLogger logger = new SimpleLogger();
logger.LogError("This is an error");
logger.LogWarning("This is a warning");
SimpleLogger logger = new SimpleLogger();
logger.LogError("This is an error");
logger.LogWarning("This is a warning");

Bu, mesaj türlerinin her zaman 'Error' ve 'Warning' olmasını sağlar.

Çıkış Biçimlendirmeyi Artırma (14:35)

Tim, hata mesajları için konsol metin rengini ayarlama işlevselliği ekleyerek bunların öne çıkmasını sağlar:

public static void LogError(this SimpleLogger logger, string message)
{
    var defaultColor = Console.ForegroundColor;
    Console.ForegroundColor = ConsoleColor.Red;
    logger.Log(message, "Error");

    Console.ForegroundColor = defaultColor;
}
public static void LogError(this SimpleLogger logger, string message)
{
    var defaultColor = Console.ForegroundColor;
    Console.ForegroundColor = ConsoleColor.Red;
    logger.Log(message, "Error");

    Console.ForegroundColor = defaultColor;
}

Doğrudan Method Çağrılarıyla Karşılaştırma (17:21)

Tim, bu yaklaşımı orijinal Log yöntemlerini doğrudan çağırmakla karşılaştırıyor ve bunun tutarsızlıklara yol açabileceğini belirtiyor:

logger.Log("Test error", "Error");
logger.Log("Another error", "ERROR");
logger.Log("Test error", "Error");
logger.Log("Another error", "ERROR");

Bu yaklaşım yazım hatalarına ve tutarsız biçimlendirmeye yatkındır.

Genişletme Methodlarını Zincirleme (18:13)

Tim, kodu daha okunabilir hale getirmek için genişletme methodlarının nasıl zincirleneceğini gösterir:

public static void LogInfo(this SimpleLogger logger, string message)
{
    logger.Log(message, "Info");
}

public static void SaveToDatabase(this SimpleLogger logger)
{
    // Simulate saving to a database
}
public static void LogInfo(this SimpleLogger logger, string message)
{
    logger.Log(message, "Info");
}

public static void SaveToDatabase(this SimpleLogger logger)
{
    // Simulate saving to a database
}

Şimdi, bu methodları zincirleyebilirsiniz:

logger.LogInfo("Information").SaveToDatabase();
logger.LogInfo("Information").SaveToDatabase();

Bu, kodu daha okunabilir ve iç içe geçmiş method çağrılarına göre daha sezgisel hale getirir:

SaveToDatabase(LogInfo(logger, "Information"));
SaveToDatabase(LogInfo(logger, "Information"));

Nokta notasyonu ve zincirleme kullanarak, kodun amacı daha net ve daha az iç içe geçmiş olur.

Sahip Olmadığınız Şeyleri Genişletme

20:13'te, Tim Corey, genişletme methodlarının, üçüncü parti kütüphaneler gibi sahip olmadığınız sınıflara işlevsellik ekleme için ideal olduğunu açıklar. Bu, orijinal kodu değiştirmeden gelişim sağlar.

Bağımlılıklardan Kaçınma

Corey ayrıca, genişletme methodlarını kullanarak bağımlılıkları doğrudan bir sınıfa bağlamadan tanıtmayı vurgular. Örneğin, veritabanı kaydetme işlevselliğini veritabanı mantığını gömmeksizin bir Person sınıfına eklemek.

Ara Yüzleri Genişletme

Genişletme methodları ayrıca 21:30'dan itibaren ara yüzlere uygulanabilir, böylece ara yüzü uygulayan birden çok sınıf aynı işlevselliği paylaşabilir. Bu, kodun yeniden kullanılmasını ve basitleştirilmesini teşvik eder.

Genişletme Methodlarını Kullanırken Ne Zaman Kaçınılmalı

23:03'te, Tim Corey, özellikle ilkel veya Microsoft tarafından sağlanan türlerle aşırı genişletme methodu kullanmaktan kaçınılmasını önerir, böylece karmaşıklığı ve dağınıklığı önler. Açık ve net faydalar sunduklarında onları az kullanın.

Açık/Kapalı Prensibi

Tim, 24:54-25:40 arasındaki bölümde, genişletme methodlarını mevcut, kararlı kodu değiştirmeden yeni işlevsellik eklemek için kullanarak açık/kapalı ilkesine uymayı vurgular, böylece hataların tanıtılması riskini azaltır.

Kullanım İfadesi için En İyi Uygulamalar

Genişletme methodlarını mantıksal olarak gruplayarak düzenleyin ve ad çatışmalarından kaçınmak ve daha kolay bakım ve hata ayıklama sağlamak için ayrı alan adlarına yerleştirin.

Sonuç

Ve işte böyle — methodları tanımlama ve çağırmanın, parametreleri ve dönüş değerlerini yönetmenin temelini ve method aşırı yüklemesini anlamış oldunuz. Bu sayede C#'ta sağlam ve esnek uygulamalar oluşturabilirsiniz.

Tim Corey tarafından açıklanan genişletme methodları, mevcut türleri geliştirmenin ve kodunuzu daha okunabilir ve sürdürülebilir hale getirmenin güçlü bir yolunu sunar. Daha ayrıntılı içgörüler ve pratik örnekler için, Tim Corey'nin C#'ta Genişletme Methodlarının Nasıl Oluşturulacağı başlıklı tam videosunu izleyebilirsiniz.

Hero Worlddot related to Metotları Anlamak ve C# Uzantı Metotlarını Kullanmak
Hero Affiliate related to Metotları Anlamak ve C# Uzantı Metotlarını Kullanmak

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js ile çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara