C# Pattern Matching Expressions (Geliştiriciler için Nasıl Çalışır)
C#'ta kalıp eşleştirme, C# 7.0'da tanıtılan ve sonraki sürümlerde daha da geliştirilen güçlü bir özelliktir. Bu özellik, geliştiricilerin koşullu ifadelerle, tip denetimle ve nesne dekompozisyonyuyla uğraşırken daha özlü ve ifadeli kod yazmasını sağlar.
Kalıp eşleştirme ifadeleri, değerleri kalıplara karşı eşleştirmenin ve karşılık gelen kod bloklarını çalıştırmanın esnek ve sezgisel bir yolunu sunar. Bu makalede, C#'ta kalıp eşleştirme ifadelerinin inceliklerini, sözdizimlerini, kullanım örneklerini ve kod örneklerini keşfedeceğiz. Makalenin sonunda, IronPDF PDF Oluşturma Kütüphanesi hakkında Iron Software üzerinden C# uygulamalarında hızlıca PDF belge oluşturma üzerine de biraz keşif yapacağız.
Benefits of Pattern Matching in C
C# kodunda kalıp eşleştirme çok sayıda avantaj sunar:
- Gelişmiş Okunabilirlik: Kalıp eşleştirme, karmaşık koşullu mantığı basitleştirir, bu da hem sizin hem de diğer geliştiricilerin kodunuzu daha kolay anlamasını ve takip etmesini sağlar.
- Kod Satırı Azaltımı: Detaylı koşullu ifadeleri basit kalıplara yoğunlaştırarak, kalıp eşleştirme kod tabanınızı streamline eder, bu da daha az kod satırına ve daha özlü bir uygulamaya yol açar.
- Sürdürülebilirliğin İyileştirilmesi: Kalıp eşleştirmenin sunduğu açıklık, kodun daha kolay bakımı ve hatalarının giderilmesini teşvik eder. Kalıpların açıkça deline edilmesiyle, belirli mantık bloklarını bulmak ve gerektiğinde değiştirmek daha basit hale gelir, diğer kod tabanını etkilemeden.
- Daha İfade Edici Algoritmalar: Kalıp eşleştirme, geliştiricilere algoritmaları daha doğal ve sezgisel bir şekilde ifade etme gücü verir. Kod yapılarının sorun çözme paradigmasıyla hizalanmasıyla, kalıp eşleştirme algoritmalarının fikir modellerine çok yakın bir biçimde oluşturulmasını kolaylaştırır.
Types of Pattern Matching in C
Kalıp eşleştirme, aşağıdaki ifadeler tarafından desteklenir:
isifadesiswitchdeyimleriswitchifadeleri
Aşağıdaki kalıplar, yapılarla eşleştirmek için kullanılabilir:
Deklarasyon ve Tip Kalıpları
Deklarasyon ve tip kalıpları, C#'ta ifade çalışma zamanı türlerinin verilen türlerle uyumluluğunu kontrol etme için vazgeçilmez araçlardır. Deklarasyon kalıplarıyla, hem uyumluluğu kontrol edebilir hem de aynı anda yeni bir yerel değişken ilan edebilirsiniz. Aşağıdaki örneğe bakın:
object greeting = "Iron Software is Awesome!";
if (greeting is string message)
{
Console.WriteLine(message.ToLower()); // output: iron software is awesome!
}
object greeting = "Iron Software is Awesome!";
if (greeting is string message)
{
Console.WriteLine(message.ToLower()); // output: iron software is awesome!
}
Dim greeting As Object = "Iron Software is Awesome!"
Dim tempVar As Boolean = TypeOf greeting Is String
Dim message As String = If(tempVar, DirectCast(greeting, String), Nothing)
If tempVar Then
Console.WriteLine(message.ToLower()) ' output: iron software is awesome!
End If
Burada, bildirim deseni, greeting ifadesi string türüne uyarsa, message değişkenine atanmasını ve ardışık işlemlerin yapılmasını sağlar.
Aşağıdaki koşullardan herhangi biri doğru olduğunda, Deklarasyon Deseni iyi çalışır:
- İfadenin çalışma zamanı türü
T'dir. - İfadenin çalışma zamanı türü
T'ten türemiştir,Tarayüzünü uygular veyaT'ya örtük olarak dönüştürülebilir. - İfadenin çalışma zamanı türü, temelde yatan türü
Tolan boş değerlendirilebilir (nullable) bir değer türüdür. - İfadenin çalışma zamanı türünden
Ttürüne bir boxing veya unboxing dönüşümü vardır.
Yukarıdaki koşulları gösteren aşağıdaki örneği düşünün:
int? nullableX = 8;
int y = 45;
object boxedy = y;
if (nullableX is int a && boxedy is int b)
{
Console.WriteLine(a + b); // output: 53
}
int? nullableX = 8;
int y = 45;
object boxedy = y;
if (nullableX is int a && boxedy is int b)
{
Console.WriteLine(a + b); // output: 53
}
Dim nullableX? As Integer = 8
Dim y As Integer = 45
Dim boxedy As Object = y
Dim tempVar As Boolean = TypeOf boxedy Is Integer
Dim b As Integer = If(tempVar, DirectCast(boxedy, Integer), Nothing)
Dim tempVar2 As Boolean = TypeOf nullableX Is Integer
Dim a As Integer = If(tempVar2, CInt(nullableX), Nothing)
If tempVar2 AndAlso tempVar Then
Console.WriteLine(a + b) ' output: 53
End If
Burada, nullableX desene uyar çünkü temelde yatan tür int olan boş değerlendirilebilir bir değer türüdür ve boxedy desene uyar çünkü int'ya unbox edilebilir.
Yeni bir değişken tanımlamadan ifadenin türünü kontrol etmek istediğinizde aşağıdaki örnekte görüldüğü gibi, çöp (discard) _'ı kullanabilirsiniz.
public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
{
Bus _ => 4.00m,
Motor _ => 8.50m,
null => throw new ArgumentNullException(nameof(vehicle)),
_ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
};
public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
{
Bus _ => 4.00m,
Motor _ => 8.50m,
null => throw new ArgumentNullException(nameof(vehicle)),
_ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
};
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
'{
' Bus _ => 4.00m,
' Motor _ => 8.50m,
' null => throw new ArgumentNullException(nameof(vehicle)),
' _ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
'};
Bu kesitte, _ Vehicle ile eşleşen herhangi bir tür için bir yer tutucu görevi görür.
Deklarasyon ve tip kalıpları, ifade uyumunun kalıp eşleştirme öncesi geçersiz olmadığını garantiler. Aşağıda gösterildiği gibi, null olmayan kontrollar yapmak için bir negated null constant pattern kullanabilirsiniz:
if (inputVal is not null)
{
// ...
}
if (inputVal is not null)
{
// ...
}
If inputVal IsNot Nothing Then
' ...
End If
Bu olumsuzlama, inputVal null olmadığından emin olarak daha fazla işlemlere devam eder.
C# kodunda deklarasyon ve tür kalıplarını kullanarak, okunabilirliği artırabilir, kod satırlarını azaltabilir ve algoritmaları daha etkili bir şekilde ifade edebilirsiniz. Bu kalıplar, tür bazlı mantığı ele almak ve kod tabanınızın sürdürülebilirliğini iyileştirmek için özlü ve ifade edici bir yol sağlar.
Sabit Desen
Sabit desenler, bir ifade sonucunun belirli bir sabit değerle eşleşip eşleşmediğini doğrulamak için kullanılır. Aşağıdaki örneğe bakın:
public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
1 => 2.0m,
2 => 10.0m,
3 => 25.0m,
4 => 60.0m,
0 => 0.0m,
_ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};
public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
1 => 2.0m,
2 => 10.0m,
3 => 25.0m,
4 => 60.0m,
0 => 0.0m,
_ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};
Dim tempVar As Decimal
Select Case visitorCount
Case 1
tempVar = 2.0D
Case 2
tempVar = 10.0D
Case 3
tempVar = 25.0D
Case 4
tempVar = 60.0D
Case 0
tempVar = 0.0D
Case Else
'INSTANT VB TODO TASK: Throw expressions are not converted by Instant VB:
'ORIGINAL LINE: tempVar = throw new ArgumentException(string.Format("Not supported number of visitors: {0}", visitorCount), nameof(visitorCount));
tempVar = throw New ArgumentException($"Not supported number of visitors: {visitorCount}", NameOf(visitorCount))
End Select
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'public static decimal GetGroupTicketPrice(int visitorCount)
'{
' Return tempVar;
'}
Burada, sabit desenler visitorCount ifadesinin belirtilen sabit değerlerle eşleşip eşleşmediğini kontrol eder ve buna karşılık gelen bilet fiyatlarını döndürür.
Bir sabit desende, çeşitli türde sabit ifadeler kullanabilirsiniz, örneğin:
- Tamsayı veya kayan nokta sayısal literalleri.
- Karakterler.
- Dize literalleri.
- Boolean değerleri (
trueveyafalse). - Enum değerleri.
- Tanımlanmış bir const alan veya yerel ismi.
null.
Span<char> veya ReadOnlySpan<char> türündeki bir ifadeler sabit dizeleri eşleştirebilir.
null için kontrol etmek amacıyla aşağıdaki gibi sabit bir desen kullanın:
if (inputVal is null)
{
return;
}
if (inputVal is null)
{
return;
}
If inputVal Is Nothing Then
Return
End If
Burada, desen inputVal null olduğundan emin olarak daha fazla işlemlere devam eder.
Ayrıca, null olmayan değerleri belirlemek için bir olumsuzlanmış null sabit deseni de kullanabilirsiniz:
if (inputVal is not null)
{
// ...
}
if (inputVal is not null)
{
// ...
}
If inputVal IsNot Nothing Then
' ...
End If
Bu desen, inputVal null olmadığından emin olarak, güvenli bir şekilde ardışık işlemler yapılmasına olanak tanır.
Sabit desenleri C# kodunuza dahil ederek, belirli sabit değerlerin eşleşmesi gerektiği senaryoları etkili bir şekilde ele alabilir, kodun netliğini ve sürdürülebilirliğini artırabilirsiniz.
İlişkisel Desenler
İlişkisel desenler, ifade sonuçlarını sabitlerle karşılaştırmanın bir yolunu sağlar. Aşağıdaki örneğe bakın:
Console.WriteLine(Classify(20)); // output: Too high
Console.WriteLine(Classify(double.NaN)); // output: Unknown
Console.WriteLine(Classify(4)); // output: Acceptable
static string Classify(double measurement) => measurement switch
{
< -4.0 => "Too low",
> 10.0 => "Too high",
double.NaN => "Unknown",
_ => "Acceptable",
};
Console.WriteLine(Classify(20)); // output: Too high
Console.WriteLine(Classify(double.NaN)); // output: Unknown
Console.WriteLine(Classify(4)); // output: Acceptable
static string Classify(double measurement) => measurement switch
{
< -4.0 => "Too low",
> 10.0 => "Too high",
double.NaN => "Unknown",
_ => "Acceptable",
};
Console.WriteLine(Classify(20)) ' output: Too high
Console.WriteLine(Classify(Double.NaN)) ' output: Unknown
Console.WriteLine(Classify(4)) ' output: Acceptable
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static string Classify(double measurement) => measurement switch
'{
' < -4.0 => "Too low",
' > 10.0 => "Too high",
' double.NaN => "Unknown",
' _ => "Acceptable",
'};
Burada, ilişkisel desenler measurement değerini belirli eşiklere karşı karşılaştırarak sınıflandırmasını belirler.
İlişkisel bir desenin sağ tarafında bir tamsayı, kayan nokta, char veya enum türünde sabit bir ifade olmalıdır. Sol tarafta <, >, <=, >= operatörleri kullanılabilir.
Belirli bir aralık içindeki bir ifade sonucunu eşleştirmek için, birleştirici 've' deseni, aşağıda gösterildiği gibi kullanılır:
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 3, 12))); // output: spring
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 7, 12))); // output: summer
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 2, 12))); // output: winter
static string GetCalendarSeason(DateTime date) => date.Month switch
{
>= 3 and < 6 => "spring",
>= 6 and < 9 => "summer",
>= 9 and < 12 => "autumn",
12 or (>= 1 and <3) => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 3, 12))); // output: spring
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 7, 12))); // output: summer
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 2, 12))); // output: winter
static string GetCalendarSeason(DateTime date) => date.Month switch
{
>= 3 and < 6 => "spring",
>= 6 and < 9 => "summer",
>= 9 and < 12 => "autumn",
12 or (>= 1 and <3) => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(New DateTime(2024, 3, 12))) ' output: spring
Console.WriteLine(GetCalendarSeason(New DateTime(2024, 7, 12))) ' output: summer
Console.WriteLine(GetCalendarSeason(New DateTime(2024, 2, 12))) ' output: winter
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static string GetCalendarSeason(DateTime date) => date.Month switch
'{
' >= 3 and < 6 => "spring",
' >= 6 and < 9 => "summer",
' >= 9 and < 12 => "autumn",
' 12 or (>= 1 and <3) => "winter",
' _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
'};
Bu alıntı, takvimin mevsimini ayın belirli aralıklar içinde düşmesine göre belirlemek için birleştirici 've' deseninin nasıl kullanıldığını açıklar. Ayrıca, ilişkisel desenlerin ifade sonuçlarını sabitlerle karşılaştırmanın kısa ve ifade edilebilir bir yolunu sunduğunu ve böylece kodun netliğini ve sürdürülebilirliğini artırdığını belirtir.
Yok Sayma Deseni
Çöp deseni, _ ile ifade edilen herhangi bir ifadeyi eşleştirmek için hizmet eder, null dahil. Aşağıdaki örneği göz önünde bulundurun:
Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday)); // output: 5.0
Console.WriteLine(GetDiscountInPercent(null)); // output: 0.0
Console.WriteLine(GetDiscountInPercent((DayOfWeek)10)); // output: 0.0
static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch
{
DayOfWeek.Monday => 0.5m,
DayOfWeek.Tuesday => 12.5m,
DayOfWeek.Wednesday => 7.5m,
DayOfWeek.Thursday => 12.5m,
DayOfWeek.Friday => 5.0m,
DayOfWeek.Saturday => 2.5m,
DayOfWeek.Sunday => 2.0m,
_ => 0.0m,
};
Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday)); // output: 5.0
Console.WriteLine(GetDiscountInPercent(null)); // output: 0.0
Console.WriteLine(GetDiscountInPercent((DayOfWeek)10)); // output: 0.0
static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch
{
DayOfWeek.Monday => 0.5m,
DayOfWeek.Tuesday => 12.5m,
DayOfWeek.Wednesday => 7.5m,
DayOfWeek.Thursday => 12.5m,
DayOfWeek.Friday => 5.0m,
DayOfWeek.Saturday => 2.5m,
DayOfWeek.Sunday => 2.0m,
_ => 0.0m,
};
Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday)) ' output: 5.0
Console.WriteLine(GetDiscountInPercent(Nothing)) ' output: 0.0
Console.WriteLine(GetDiscountInPercent(CType(10, DayOfWeek))) ' output: 0.0
Dim tempVar As Decimal
Select Case dayOfWeek
Case DayOfWeek.Monday
tempVar = 0.5D
Case DayOfWeek.Tuesday
tempVar = 12.5D
Case DayOfWeek.Wednesday
tempVar = 7.5D
Case DayOfWeek.Thursday
tempVar = 12.5D
Case DayOfWeek.Friday
tempVar = 5.0D
Case DayOfWeek.Saturday
tempVar = 2.5D
Case DayOfWeek.Sunday
tempVar = 2.0D
Case Else
tempVar = 0.0D
End Select
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'static decimal GetDiscountInPercent(System.Nullable(Of DayOfWeek) dayOfWeek)
'{
' Return tempVar;
'}
Yukarıdaki yok sayma deseni örneğinde, olası tüm giriş değerlerini ele alır. Haftanın tüm günleri yönetilir ve varsayılan bir değer sağlanır. Bu şekilde, olası tüm değerler ele alınır. Çöp deseni, bir is ifadesinde veya switch deyiminde desen olarak kullanılamaz. Bu tür durumlarda, bir var deseni çöp var _ ile kullanılabilir ve herhangi bir ifadeyi eşleştirir. Ancak, çöp deseni bir switch ifadesinde kullanılabilir. Daha fazla ayrıntı için, özellik teklifi notunun Yok Sayma deseni bölümüne bakınız.
Mantıksal Desenler
C#'daki mantıksal desenler, daha esnek ve ifade edilebilir eşleşme koşulları sağlamak için olumsuzlama, bağlantı ve ayrım gibi güçlü araçlar sunar.
Olumsuzlama (not deseni)
Olumsuzlama deseni not ile temsil edilir ve olumsuzlanan desen, ifadenin eşleşmediğinde eşleşir. Bu, özellikle bir ifadenin null olmadığını kontrol etmek için aşağıda gösterildiği gibi kullanışlıdır:
if (input is not null)
{
// ...
}
if (input is not null)
{
// ...
}
If input IsNot Nothing Then
' ...
End If
Burada, input null değilse kod bloğu çalıştırılır.
Bağlaçsal (and deseni)
Bağlaçsal desen, and anahtar kelimesi kullanılarak iki desenin ifadeyle eşleşmesi durumunda eşleme yapar. Bu, aşağıdaki örnekte gösterildiği gibi birden fazla koşulu birleştirmeyi sağlar:
Console.WriteLine(Classify(13)); // output: High
Console.WriteLine(Classify(-100)); // output: Too low
Console.WriteLine(Classify(5.7)); // output: Acceptable
static string Classify(double measurement) => measurement switch
{
< -40.0 => "Too low",
>= -40.0 and < 0 => "Low",
>= 0 and < 10.0 => "Acceptable",
>= 10.0 and < 20.0 => "High",
>= 20.0 => "Too high",
double.NaN => "Unknown",
};
Console.WriteLine(Classify(13)); // output: High
Console.WriteLine(Classify(-100)); // output: Too low
Console.WriteLine(Classify(5.7)); // output: Acceptable
static string Classify(double measurement) => measurement switch
{
< -40.0 => "Too low",
>= -40.0 and < 0 => "Low",
>= 0 and < 10.0 => "Acceptable",
>= 10.0 and < 20.0 => "High",
>= 20.0 => "Too high",
double.NaN => "Unknown",
};
Console.WriteLine(Classify(13)) ' output: High
Console.WriteLine(Classify(-100)) ' output: Too low
Console.WriteLine(Classify(5.7)) ' output: Acceptable
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static string Classify(double measurement) => measurement switch
'{
' < -40.0 => "Too low",
' >= -40.0 and < 0 => "Low",
' >= 0 and < 10.0 => "Acceptable",
' >= 10.0 and < 20.0 => "High",
' >= 20.0 => "Too high",
' double.NaN => "Unknown",
'};
Bu örnekte, measurement değeri aralığına göre sınıflandırılır.
Seçimsel (or deseni)
Seçimsel desen, or anahtar kelimesi kullanılarak herhangi bir desenin ifadeyle eşleşmesi durumunda eşleme yapar. Bu, aşağıda gösterildiği gibi birden fazla olası koşulu ele almayı sağlar:
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19))); // output: winter
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9))); // output: autumn
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11))); // output: spring
static string GetCalendarSeason(DateTime date) => date.Month switch
{
3 or 4 or 5 => "spring",
6 or 7 or 8 => "summer",
9 or 10 or 11 => "autumn",
12 or 1 or 2 => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19))); // output: winter
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9))); // output: autumn
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11))); // output: spring
static string GetCalendarSeason(DateTime date) => date.Month switch
{
3 or 4 or 5 => "spring",
6 or 7 or 8 => "summer",
9 or 10 or 11 => "autumn",
12 or 1 or 2 => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(New DateTime(2021, 1, 19))) ' output: winter
Console.WriteLine(GetCalendarSeason(New DateTime(2021, 10, 9))) ' output: autumn
Console.WriteLine(GetCalendarSeason(New DateTime(2021, 5, 11))) ' output: spring
Dim tempVar As String
Select Case [date].Month
Case 3, 4, 5
tempVar = "spring"
Case 6, 7, 8
tempVar = "summer"
Case 9, 10, 11
tempVar = "autumn"
Case 12, 1, 2
tempVar = "winter"
Case Else
'INSTANT VB TODO TASK: Throw expressions are not converted by Instant VB:
'ORIGINAL LINE: tempVar = throw new ArgumentOutOfRangeException(nameof(date), string.Format("Date with unexpected month: {0}.", date.Month));
tempVar = throw New ArgumentOutOfRangeException(NameOf([date]), $"Date with unexpected month: {[date].Month}.")
End Select
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'static string GetCalendarSeason(DateTime @date)
'{
' Return tempVar;
'}
Burada, verilen tarihin ayına göre takvim mevsimi belirlenir.
Bu desen birleştiricileri, kodunuzun esnekliğini ve okunabilirliğini artırarak, daha karmaşık ve hassas eşleşme koşulları oluşturmak için tekrar tekrar kullanılabilir.
Özellik Deseni
Özellik deseni, bir ifadenin özelliklerinin veya alanlarının iç içe geçmiş desenlerle eşleştirilmesini sağlar. Bunun bir örneği, aşağıdaki kod parçacığında görülebilir:
static bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };
static bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };
Shared Function IsConferenceDay(ByVal [date] As DateTime) As Boolean
'INSTANT VB TODO TASK: The following 'is' operator pattern is not converted by Instant VB:
Return [date] is { Year: 2020, Month: 5, Day: 19 [or] 20 [or] 21 }
End Function
Burada özellik deseni, sağlanan tarihin belirtilen konferans günlerinden birine karşılık geldiğinden emin olur.
Ayrıca, bir özellik deseninde çalışma zamanı türü kontrolü ve değişken tanımı da dahil edilebilir, aşağıda gösterildiği gibi:
static string TakeFive(object input) => input switch
{
string { Length: >= 5 } s => s.Substring(0, 5),
string s => s,
ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
ICollection<char> symbols => new string(symbols.ToArray()),
null => throw new ArgumentNullException(nameof(input)),
_ => throw new ArgumentException("Unsupported input type."),
};
static string TakeFive(object input) => input switch
{
string { Length: >= 5 } s => s.Substring(0, 5),
string s => s,
ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
ICollection<char> symbols => new string(symbols.ToArray()),
null => throw new ArgumentNullException(nameof(input)),
_ => throw new ArgumentException("Unsupported input type."),
};
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static string TakeFive(object input) => input switch
'{
' string { Length: >= 5 } s => s.Substring(0, 5),
' string s => s,
' ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
' ICollection<char> symbols => new string(symbols.ToArray()),
' null => throw new ArgumentNullException(nameof(input)),
' _ => throw new ArgumentException("Unsupported input type."),
'};
Burada, özellik deseni dizeler ve karakter koleksiyonlarını ele almak için kullanılır ve özelliklerine göre uygun bir şekilde ele alınmasını sağlar.
Konumsal Desen
C#'da konumsal desen, bir ifade sonucunu ayrıştırmayı ve elde edilen değerleri karşılık gelen iç içe desenlerle eşleştirmeyi sağlar. Örneğin:
public readonly struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
static string Classify(Point point) => point switch
{
(0, 0) => "Origin",
(1, 0) => "Positive X basis end",
(0, 1) => "Positive Y basis end",
_ => "Just a point",
};
public readonly struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
static string Classify(Point point) => point switch
{
(0, 0) => "Origin",
(1, 0) => "Positive X basis end",
(0, 1) => "Positive Y basis end",
_ => "Just a point",
};
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct Point
Public Structure Point
Public ReadOnly Property X() As Integer
Public ReadOnly Property Y() As Integer
Public Sub New(ByVal x As Integer, ByVal y As Integer)
'INSTANT VB TODO TASK: VB has no equivalent to the C# deconstruction assignments:
(X, Y) = (x, y)
End Sub
Public Sub Deconstruct(<System.Runtime.InteropServices.Out()> ByRef x As Integer, <System.Runtime.InteropServices.Out()> ByRef y As Integer)
'INSTANT VB TODO TASK: VB has no equivalent to the C# deconstruction assignments:
(x, y) = (X, Y)
End Sub
End Structure
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static string Classify(Point point) => point switch
'{
' (0, 0) => "Origin",
' (1, 0) => "Positive X basis end",
' (0, 1) => "Positive Y basis end",
' _ => "Just a point",
'};
Bu örnekte, konumsal desen, koordinatlarına göre noktaları sınıflandırmak için kullanılır.
Ayrıca, C# 10 ile tanıtılan bir genişletilmiş özellik deseni olarak bilinen, bir özellik deseninde iç içe geçmiş özelliklere veya alanlara referans verebilirsiniz:
static bool IsAnyEndOnXAxis(Segment segment) =>
segment is { Start.Y: 0 } or { End.Y: 0 };
static bool IsAnyEndOnXAxis(Segment segment) =>
segment is { Start.Y: 0 } or { End.Y: 0 };
Shared Function IsAnyEndOnXAxis(ByVal segment As Segment) As Boolean
'INSTANT VB TODO TASK: The following 'is' operator pattern is not converted by Instant VB:
Return segment is { Start.Y: 0 } [or] { [End].Y: 0 }
End Function
Bu özellik, iç içe geçmiş özelliklere doğrudan erişim sağlayarak, özellik desenlerinin esnekliğini artırır.
Bu desenler, karmaşık veri yapılarını ele almak ve kodunuzun okunabilirliğini ve ifadeliliğini artırmak için güçlü mekanizmalar sunar.
Var Deseni
Var Deseni, herhangi bir türü eşleştirmenizi sağlar. Bu, özellikle boolean ifadeleri içindeki ara sonuçları yakalamak veya switch case koruyucularında birden fazla kontrol gerektiğinde faydalı olabilir.
İşte bir boolean ifadesinde var deseninin kullanımını gösteren bir örnek:
static bool IsAcceptable(int id, int absLimit) =>
SimulateDataFetch(id) is var results
&& results.Min() >= -absLimit
&& results.Max() <= absLimit;
static int [] SimulateDataFetch(int id)
{
var rand = new Random();
return Enumerable
.Range(start: 0, count: 5)
.Select(s => rand.Next(minValue: -10, maxValue: 11))
.ToArray();
}
static bool IsAcceptable(int id, int absLimit) =>
SimulateDataFetch(id) is var results
&& results.Min() >= -absLimit
&& results.Max() <= absLimit;
static int [] SimulateDataFetch(int id)
{
var rand = new Random();
return Enumerable
.Range(start: 0, count: 5)
.Select(s => rand.Next(minValue: -10, maxValue: 11))
.ToArray();
}
Shared Function IsAcceptable(ByVal id As Integer, ByVal absLimit As Integer) As Boolean
Dim tempVar As Boolean = TypeOf SimulateDataFetch(id) Is var
Dim results = If(tempVar, CType(SimulateDataFetch(id), var), Nothing)
Return tempVar AndAlso results.Min() >= -absLimit AndAlso results.Max() <= absLimit
End Function
Shared Function SimulateDataFetch(ByVal id As Integer) As Integer()
Dim rand = New Random()
Return Enumerable.Range(start:= 0, count:= 5).Select(Function(s) rand.Next(minValue:= -10, maxValue:= 11)).ToArray()
End Function
Bu örnekte, SimulateDataFetch bir tamsayılar dizisi döndürür ve is var deseni sonuçları results değişkeninde yakalar, özelliklerine göre daha sonraki hesaplamalara olanak tanır.
Ayrıca, var desenleri daha kısa ve okunabilir kodlar için switch ifadeleri veya deyimleri içinde kullanılabilir. İşte switch case koruyucularında var deseninin kullanıldığı bir örnek:
public record Point(int X, int Y);
static Point Transform(Point point) => point switch
{
var (x, y) when x < y => new Point(-x, y),
var (x, y) when x > y => new Point(x, -y),
var (x, y) => new Point(x, y),
};
static void TestTransform()
{
Console.WriteLine(Transform(new Point(1, 2))); // output: Point { X = -1, Y = 2 }
Console.WriteLine(Transform(new Point(5, 2))); // output: Point { X = 5, Y = -2 }
}
public record Point(int X, int Y);
static Point Transform(Point point) => point switch
{
var (x, y) when x < y => new Point(-x, y),
var (x, y) when x > y => new Point(x, -y),
var (x, y) => new Point(x, y),
};
static void TestTransform()
{
Console.WriteLine(Transform(new Point(1, 2))); // output: Point { X = -1, Y = 2 }
Console.WriteLine(Transform(new Point(5, 2))); // output: Point { X = 5, Y = -2 }
}
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Point(int X, int Y)
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'static Point Transform(Point point) => point switch
'{
' var (x, y) when x < y => new Point(-x, y),
' var (x, y) when x > y => new Point(x, -y),
' var (x, y) => new Point(x, y),
'};
Shared Sub TestTransform()
Console.WriteLine(Transform(New Point(1, 2))) ' output: Point { X = -1, Y = 2 }
Console.WriteLine(Transform(New Point(5, 2))) ' output: Point { X = 5, Y = -2 }
End Sub
Bu örnekte, (x, y) var deseni nokta koordinatlarını yakalar, değerlerine göre farklı dönüşümlere olanak tanır.
Bir var deseninde, tanımlanan değişkenin türü, eşleştirilen desene karşı eşleşen ifadenin derleme zamanı türünden çıkarılır.
Var deseni, ifadenin belirli türünün önceden bilinmediği çeşitli senaryoları ele almayı kolaylaştırarak, kodun netliğini ve esnekliğini artırır.
IronPDF Kütüphanesine Giriş
IronPDF Belge İşleme, Iron Software'den gelen ve PDF belge oluşturma konusunda uzmanlaşan bir kütüphanedir. Başlamak için, kütüphaneyi NuGet Paket Yöneticisi'nden veya Visual Studio Paket Yöneticisi'nden yüklemek ilk iştir.
# To install from the NuGet Package Manager Console
Install-Package IronPdf
# To install from the NuGet Package Manager Console
Install-Package IronPdf
Aşağıdaki resim, Visual Studio Kurulum Klavuzundan nasıl yükleyeceğinizi gösterir.

Aşağıdaki kodda, basit bir PDF belgesi oluşturmayı göreceğiz:
using IronPdf;
namespace IronPatterns
{
class Program
{
static void Main()
{
Console.WriteLine("-----------Iron Software-------------");
var renderer = new ChromePdfRenderer(); // var pattern
var content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!";
// Declaration Pattern
int? nullableX = 8;
int y = 45;
object boxedy = y;
content += "<p>Declaration Pattern</p>";
if (nullableX is int a && boxedy is int b)
{
Console.WriteLine(a + b); // output: 53
content += $"<p>Output: {(a + b)}</p>";
}
// Relational patterns
content += "<p>Relational patterns</p>";
var season1 = GetCalendarSeason(new DateTime(2024, 2, 25));
Console.WriteLine(season1);
content += $"<p>2024, 2, 25: {season1}</p>";
var season2 = GetCalendarSeason(new DateTime(2024, 5, 25));
Console.WriteLine(season2);
content += $"<p>2024, 5, 25: {season2}</p>";
var season3 = GetCalendarSeason(new DateTime(2024, 7, 25));
Console.WriteLine(season3);
content += $"<p>2024, 7, 25: {season3}</p>";
var pdf = renderer.RenderHtmlAsPdf(content);
pdf.SaveAs("output.pdf"); // Saves our PdfDocument object as a PDF
}
static string GetCalendarSeason(DateTime date) => date.Month switch
{
>= 3 and < 6 => "spring",
>= 6 and < 9 => "summer",
>= 9 and < 12 => "autumn",
12 or (>= 1 and < 3) => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
}
}
using IronPdf;
namespace IronPatterns
{
class Program
{
static void Main()
{
Console.WriteLine("-----------Iron Software-------------");
var renderer = new ChromePdfRenderer(); // var pattern
var content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!";
// Declaration Pattern
int? nullableX = 8;
int y = 45;
object boxedy = y;
content += "<p>Declaration Pattern</p>";
if (nullableX is int a && boxedy is int b)
{
Console.WriteLine(a + b); // output: 53
content += $"<p>Output: {(a + b)}</p>";
}
// Relational patterns
content += "<p>Relational patterns</p>";
var season1 = GetCalendarSeason(new DateTime(2024, 2, 25));
Console.WriteLine(season1);
content += $"<p>2024, 2, 25: {season1}</p>";
var season2 = GetCalendarSeason(new DateTime(2024, 5, 25));
Console.WriteLine(season2);
content += $"<p>2024, 5, 25: {season2}</p>";
var season3 = GetCalendarSeason(new DateTime(2024, 7, 25));
Console.WriteLine(season3);
content += $"<p>2024, 7, 25: {season3}</p>";
var pdf = renderer.RenderHtmlAsPdf(content);
pdf.SaveAs("output.pdf"); // Saves our PdfDocument object as a PDF
}
static string GetCalendarSeason(DateTime date) => date.Month switch
{
>= 3 and < 6 => "spring",
>= 6 and < 9 => "summer",
>= 9 and < 12 => "autumn",
12 or (>= 1 and < 3) => "winter",
_ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
}
}
Imports IronPdf
Namespace IronPatterns
Friend Class Program
Shared Sub Main()
Console.WriteLine("-----------Iron Software-------------")
Dim renderer = New ChromePdfRenderer() ' var pattern
Dim content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!"
' Declaration Pattern
Dim nullableX? As Integer = 8
Dim y As Integer = 45
Dim boxedy As Object = y
content &= "<p>Declaration Pattern</p>"
Dim tempVar As Boolean = TypeOf boxedy Is Integer
Dim b As Integer = If(tempVar, DirectCast(boxedy, Integer), Nothing)
Dim tempVar2 As Boolean = TypeOf nullableX Is Integer
Dim a As Integer = If(tempVar2, CInt(nullableX), Nothing)
If tempVar2 AndAlso tempVar Then
Console.WriteLine(a + b) ' output: 53
content &= $"<p>Output: {(a + b)}</p>"
End If
' Relational patterns
content &= "<p>Relational patterns</p>"
Dim season1 = GetCalendarSeason(New DateTime(2024, 2, 25))
Console.WriteLine(season1)
content &= $"<p>2024, 2, 25: {season1}</p>"
Dim season2 = GetCalendarSeason(New DateTime(2024, 5, 25))
Console.WriteLine(season2)
content &= $"<p>2024, 5, 25: {season2}</p>"
Dim season3 = GetCalendarSeason(New DateTime(2024, 7, 25))
Console.WriteLine(season3)
content &= $"<p>2024, 7, 25: {season3}</p>"
Dim pdf = renderer.RenderHtmlAsPdf(content)
pdf.SaveAs("output.pdf") ' Saves our PdfDocument object as a PDF
End Sub
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
' static string GetCalendarSeason(DateTime date) => date.Month switch
' {
' >= 3 and < 6 => "spring",
' >= 6 and < 9 => "summer",
' >= 9 and < 12 => "autumn",
' 12 or (>= 1 and < 3) => "winter",
' _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
' };
End Class
End Namespace
Çıktı

Kod Detayları
Burada IronPDF'in ChromePdfRenderer sınıfını HTML dizgisini PDF belgesine kaydetmek için kullanıyoruz. Çıktı 'output.pdf' belgesine kaydedilir.
Deneme Lisansı
IronPDF, deneme lisansı IronPDF Lisanslama Sayfası'ndan alınarak kullanılabilir. Bir lisans anahtarı oluşturmak için bir E-posta ID'si sağlayın ve anahtar e-postanıza teslim edilsin.
"IronPdf.LicenseKey": "<Your Key>"
"IronPdf.LicenseKey": "<Your Key>"
"IronPdf.LicenseKey" = "<Your Key>"
Yukarıda gösterildiği gibi Lisans anahtarını appsettings.json dosyasına yerleştirin.
Sonuç
C#'daki desen eşleştirme ifadeleri, koşullu ifadeler, tür kontrolleri ve nesne dekompozisyonları yazmanın güçlü ve esnek bir yolunu sunar ve bu da kısa ve okunabilir hale gelir. Desen eşleştirmeden yararlanarak, geliştiriciler boilerplate ve gereksiz tekrarları azaltırken kodun netliğini ve sürdürülebilirliğini artırabilirler. İster tür kontrolü, ister anahtar ifadelerinde, ister dekompozisyon olsun, desen eşleştirme ifadeleri, C#'daki geniş bir programlama görevi yelpazesiyle başa çıkmak için çok yönlü bir araç seti sunar.
Sonuç olarak, desen eşleştirme ifadelerini ustalaşmak, C# programlama becerilerinizi büyük ölçüde geliştirebilir, temiz, daha ifade edilebilir kod yazarak daha kolay anlaşılır ve sürdürülebilir hale getirmenizi sağlar. IronPDF'in HTML'yi PDF'e Dönüştürme yeteneklerini de ele aldık, bu, PDF belgeleri oluşturmak için kullanılabilir.
Sıkça Sorulan Sorular
Desen eşleme, C#'ta kod okunabilirliğini artırmak için nasıl kullanılabilir?
C#'ta desen eşleme, geliştiricilerin daha özlü ve ifade edici kod yazmasına olanak tanır ve koşullu ifadeleri daha net ve anlaşılır hale getirir. Bu, kod bloklarının karmaşıklığını azaltarak okunabilirliği ve sürdürülebilirliği artırır.
C#'ta mevcut olan farklı desen eşleme ifadeleri nelerdir?
C#, is ifadeleri, switch ifadeleri ve switch ifadeleri dahil olmak üzere çeşitli desen eşleme ifadelerini destekler. Her tür, ifadeleri değerlendirmek ve eşleşen desenlere göre kod yürütmek için farklı yollar sunar.
C# kullanarak PDF belgelerini nasıl oluşturabilirim?
IronPDF, C#'ta PDF belgeleri oluşturmak için kullanılan Iron Software'den bir kütüphanedir. HTML içeriğinin PDF'ye dönüştürülmesine olanak tanır ve NuGet aracılığıyla kolayca yüklenir, geniş bir PDF oluşturma özellikleri sunar.
C# desen eşlemede bildirim ve tür desenleri nelerdir?
C#'ta bildirim ve tür desenleri, bir ifadenin çalışma zamanı türünün belirtilen bir türle eşleşip eşleşmediğini kontrol eder ve bir eşleşme başarılı olduğunda, tür güvenli işlemleri kolaylaştırmak üzere yeni bir yerel değişkenin bildirilmesine izin verir.
C#'ta sabit desenler nasıl çalışır?
C#'ta sabit desenler, bir ifadenin bir tam sayı veya dize gibi belirli bir sabit değere eşit olup olmadığını kontrol etmek ve bir eşleşme bulunursa belirli bir mantığı yürütmek için kullanılır, bu da basit sabit değer karşılaştırmalarını mümkün kılar.
C#'ta ilişkisel desenlerin amacı nedir?
C#'taki ilişkisel desenler, ifadeleri <, >, <= ve >= gibi ilişkisel operatörler kullanarak sabitlerle karşılaştırmanıza olanak tanır. Bu, kodunuza özlü aralık kontrolü uygulamak için kullanışlıdır.
C#'ta mantıksal desenler nasıl uygulanabilir?
C#'ta mantıksal desenler, mantıksal operatörler olan and, or ve not gibi operatörler kullanarak diğer desenleri birleştirir. Böylece aynı anda birden fazla kriteri değerlendirebilen karmaşık desen eşleme koşulları oluşturulur.
C#'taki atma deseni nedir ve ne zaman kullanılır?
C#'taki atma deseni, _ ile temsil edilir ve null da dahil olmak üzere herhangi bir ifadeyle eşleşir; belirli değerlerin dikkate alınmadığı durumlarda, örneğin switch ifadelerinde yaygın olarak kullanılır.
C#'ta özellik desenleri nasıl kullanılabilir?
C#'ta özellik desenleri, geliştiricilerin bir nesnenin özelliklerini veya alanlarını iç içe geçmiş desenlere göre eşleştirmesine olanak tanır. Bu, nesnenin yapısına derinlemesine bakış yaparken açık ve özlü kod yazmayı mümkün kılar.




