Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
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:
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 Sub SampleMethod()
' Method implementation
End Sub
End ClassTim 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 Module Extensions
<System.Runtime.CompilerServices.Extension> _
Public Sub PrintToConsole(ByVal message As String)
Console.WriteLine(message)
End Sub
End Module'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 callDim demo As String = "This is a demo"
demo.PrintToConsole() ' Extension method callParametreler, 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 Sub DisplayMessage(message As String)
Console.WriteLine(message)
End SubYine, 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);
}<Extension()>
Public Sub PrintToConsole(ByVal message As String)
Console.WriteLine(message)
End SubArgümanlar, method çağrıldığında methoda geçirilen gerçek değerlerdir.
DisplayMessage("Hello, World!"); // "Hello, World!" is the argumentDisplayMessage("Hello, World!") ' "Hello, World!" is the argumentTim 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 argumentDim demo As String = "This is a demo"
demo.PrintToConsole() ' "This is a demo" is the argumentMethodlar, 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 Function Add(a As Integer, b As Integer) As Integer
Return a + b
End FunctionTim 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;
}<Extension()>
Public Function WordCount(ByVal str As String) As Integer
Return str.Split(" "c).Length
End FunctionMethod 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 Sub Display(message As String)
Console.WriteLine(message)
End Sub
Public Sub Display(number As Integer)
Console.WriteLine(number)
End SubTim 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.
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.
Ö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:
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 Module Extensions
<System.Runtime.CompilerServices.Extension> _
Public Sub PrintToConsole(ByVal message As String)
Console.WriteLine(message)
End Sub
End ModuleSonra, 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.
Tim, neden demo.PrintToConsole() çağırabileceğinizi açıklar:
demo değişkeni string türündedir.string türü yeni yöntem PrintToConsole ile genişletildi.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.
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)<Extension()>
Public Sub PrintToConsole(ByVal message As String)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.
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 Sub Log(message As String)
Console.WriteLine(message)
End Sub
Public Sub Log(message As String, messageType As String)
Console.WriteLine($"{messageType}: {message}")
End Sub
End ClassBu 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.
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 Module ExtendSimpleLogger
<System.Runtime.CompilerServices.Extension>
Public Sub LogError(ByVal logger As SimpleLogger, ByVal message As String)
logger.Log(message, "Error")
End Sub
<System.Runtime.CompilerServices.Extension>
Public Sub LogWarning(ByVal logger As SimpleLogger, ByVal message As String)
logger.Log(message, "Warning")
End Sub
End ModuleElinde 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");Dim logger As 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.
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;
}<Extension()>
Public Sub LogError(ByVal logger As SimpleLogger, ByVal message As String)
Dim defaultColor = Console.ForegroundColor
Console.ForegroundColor = ConsoleColor.Red
logger.Log(message, "Error")
Console.ForegroundColor = defaultColor
End SubTim, 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.
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 Sub LogInfo(ByVal logger As SimpleLogger, ByVal message As String)
logger.Log(message, "Info")
End Sub
Public Sub SaveToDatabase(ByVal logger As SimpleLogger)
' Simulate saving to a database
End SubŞ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.
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.
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.
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.
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.
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.
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.
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.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy