C# Pattern Matching Expressions (Geliştiriciler için Nasıl Çalışır)
C#'daki desen eşleme, ilk olarak C# 7.0'da tanıtılan ve sonradan genişletilen güçlü bir özelliktir. Bu özellik, şart ifade işlemleri, tür kontrolü ve nesnelerin çözümlenmesi konularında daha öz ve ifade edici kod yazmaya olanak tanır.
Desen eşleme ifadeleri, değerleri desenlerle eşleştirmek ve ilgili kod bloklarını çalıştırmak için esnek ve sezgisel bir yol sağlar. Bu makalede, C#'daki desen eşleme ifadelerinin ayrıntılarını, sözdizimi, kullanım durumları ve kod örnekleri dahil olmak üzere araştıracağız. Makalenin sonunda, Iron Software tarafından IronPDF PDF Oluşturma Kütüphanesi hakkında biraz bilgi edinecek ve C# uygulamalarında anında bir PDF belgesi oluşturacağız.
C#'ta Desen Eşlemenin Avantajları
C# kodunda desen eşleme şu ana avantajları sunar:
- Artırılmış okunabilirlik: Desen eşleme, karmaşık şartsal mantığı basitleştirir, bu nedenle kodunuzun hem sizin hem de diğer geliştiriciler tarafından anlaşılması ve izlenmesi kolaylaşır.
- Kod satırlarında azalma: Karmaşık şart ifadelerini kısa desenlere indirerek, desen eşleme kod tabanınızı düzenlemenizi sağlar; bu da daha az kod satırı ve daha kısık bir uygulama ile sonuçlanır.
- Artırılmış sürdürülebilirlik: Desen eşlemenin sunduğu açıklık, kod bakımı ve hata ayıklama işlemlerini kolaylaştırır. Desenler açık bir şekilde belirlenmiş olduğunda, diğer kod tabanını etkilemeden ihtiyaç duyulan belirli mantık bloklarını tespit etmek ve değiştirmek daha basit hale gelir.
- Daha ifade edici algoritmalar: Desen eşleme, geliştiricilere algoritmaları doğal ve sezgisel bir şekilde ifade etme yetkisi verir. Kod yapılarını problemlerin çözüm paradigmalarına hizalayarak, desen eşleme algoritmaların kavramsal modellerine çok benzeyen şekilde oluşturulmasını kolaylaştırır.
C#'ta Desen Eşleme Türleri
Desen eşleme, aşağıdaki ifadeler tarafından desteklenir:
isifadeswitchifadelerswitchifadeler
Asagidaki desenler yapisalari ile eslesmek icin kullanilabilir:
Deklarasyon ve Tür Desenleri
Deklarasyon ve tür desenleri, C#'da ifadelerin çalışma zamanı türlerinin verilen türlerle uyumunu kontrol etmede önemli araçlar sunar. Deklarasyon desenleri ile hem uyumu kontrol edebilir hem de yeni bir yerel değişken tanımlayabilirsiniz. Aşağıdaki örneği inceleyin:
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, greeting ifadesi string türüne uyuyorsa, message değişkenine atanır, böylece sonraki işlemler yapılabilir.
Aşağıdaki koşullardan herhangi biri doğru olduğunda, Deklarasyon Deseni uygun bir şekildedir:
- İfadenin çalışma zamanı türü
T. - İfadenin çalışma zamanı türü
Ttüretir,Tarayüzünü uygular veyaTtürüne örtük olarak dönüştürülebilir. - İfadenin çalışma zamanı türü, alttaki türü
Tolan boş değerlendirilebilir bir türdür. - İfadenin çalışma zamanı türünden
Ttürüne boks veya unboxing dönüşümü vardır.
Yukarıdaki koşulları gösteren aşağıdaki örneği dikkate alı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, alttaki türü int olan boş değerlendirilebilir bir tür olduğundan kalıbı eşleşir ve boxedy, int türüne unbox yapılabildiği için eşleşir.
Yalnızca ifadelerin türünü kontrol etmek ve yeni bir değişken tanımlamamak gerektiğinde, aşağıdaki örnekte görüldüğü gibi _ atma işlemi kullanılabilir:
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 parçacıkta, _, Vehicle türü ile eşleşen herhangi bir tip için bir yer tutucu görevi görür.
Hem deklarasyon hem de tür desenleri, desen esleme oncesinde ifadelerin null olmadiklarini garanti eder. Başka işlem yapmadan önce bir negatif null sabit deseni kullanarak null olmayan değer tygari yapabilirsiniz:
if (inputVal is not null)
{
// ...
}
if (inputVal is not null)
{
// ...
}
If inputVal IsNot Nothing Then
' ...
End If
Bu olumsuzlama, inputVal null olmadığını garanti eder, böylece sonraki işlemler yapılabilir.
Deklarasyon ve tür desenlerini C# kodunuza dahil ederek, okunabilirliği artırabilir, kod satırlarını azaltabilir ve algoritmaları daha etkili bir şekilde ifade edebilirsiniz. Bu desenler, tür tabanlı mantığı ele almak için kısa ve ifade edici bir yol sunar ve kod tabanınızın sürdürülebilirliğini artırır.
Sabit Desen
Sabit desenler, bir ifade sonucunun belirli bir sabit değerle eşit olup olmadığını kontrol eder. Aşağıdaki örneği inceleyin:
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 kalıplar visitorCount belirtilen sabit değerlerden herhangi biriyle eşleşip eşleşmediğini kontrol eder ve buna karşılık gelen bilet fiyatlarını döndürür.
Sabit bir desende, çeşitli türdeki sabit ifade tanımlarını kullanabilirsiniz:
- Tam sayı veya kayan sayı sayısal sabitleri.
- Karakterler.
- Dizi sabitleri.
- Boolean değerler (
trueveyafalse). - Tamsayı değerleri.
- İlan edilen bir sabit alan veya yerelin adı.
null.
Span<char> veya ReadOnlySpan<char> türündeki bir ifade sabit dizgilerle eşleşebilir.
null kontrol etmek için, şu şekilde bir sabit kalıp kullanın:
if (inputVal is null)
{
return;
}
if (inputVal is null)
{
return;
}
If inputVal Is Nothing Then
Return
End If
Burada kalıp inputVal null olduğundan emin olur, böylece sonraki işlemler yapılabilir.
Ayrıca, null olmayan değerleri teyit etmek için ters null sabit deseni kullanabilirsiniz:
if (inputVal is not null)
{
// ...
}
if (inputVal is not null)
{
// ...
}
If inputVal IsNot Nothing Then
' ...
End If
Bu kalıp, inputVal null olmadığını teyit eder, böylece sonraki işlemler güvenli bir şekilde yapılabilir.
C# kodunuza sabit desenler ekleyerek, belirli sabit değerlerle eşleşmenin gerekli olduğu durumları etkili bir şekilde yönetebilir, kodun anlaşılabilirliğini ve sürdürülebilirliğini artırabilirsiniz.
İlişki Desenleri
İlişki desenleri, ifade sonuçlarını sabitlerle karşılaştırmak için bir yöntem sağlar. Aşağıdaki örneği inceleyin:
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 kalıplar measurement belirli eşiklerle karşılaştırarak sınıflandırmasını belirler.
İlişkisel bir kalıbın sağ tarafı, bir tamsayı, kayan nokta, char veya enum türünde bir sabit ifadedir. <, >, <=, >= operatörleri sol tarafta kullanılabilir.
Bir ifade sonucunu belirli bir aralıkta eşleştirmek için, aşağıdaki gibi birleşik bir 've' desen kullanın:
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ı, bir ayın belirli aralıklarında mevsimi belirlemek için birleşik 've' deseninin nasıl kullanıldığını anlatır. Ayrıca ilişkisel desenlerin ifade sonuçlarını sabitlerle karşılaştırmak için kısa ve ifade edici bir yol sağladığını da belirtiyor, böylece kodun anlaşılabilirliğini ve sürdürülebilirliğini artırıyor.
Atlama Deseni
Atma kalıbı, _ ile ifade edilen, null de dahil olmak üzere herhangi bir ifadeyle eşleşir. Aşağıdaki örneği dikkate alın:
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 atlama desen örneğinde, tüm olası giriş degerlerini yönetir. Haftanın tüm günleri yönetilir ve bir varsayılan değer saglanir. Bu sekilde tüm olası degerler yönetilir. Atma kalıbı, bir is ifadesinde veya bir switch deyiminde bir kalıp olarak kullanılamaz. Bu gibi durumlarda, herhangi bir ifade ile eşleşmek için bir atma işlemiyle birlikte var kalıbı kullanılabilir, örneğin var _. Ancak, bir switch ifadesinde bir atma kalıbına izin verilir. Daha fazla ayrıntı için uğrayıncı notlarının Atlama desen bölümüne başvurun.
Mantıksal Desenler
C#'daki mantıksal desenler, daha esnek ve ifade edici eşleştirme koşulları sağlamak için olumsuzlama, birleşim ve ayrışımı da içeren güçlü araçlar sunar.
Olumsuzlama (not kalıbı)
Olumsuzlama kalıbı, not ile temsil edilir; olumsuzlanan kalıp ifade ile eşleşmediğinde bir ifadeyi eşleştirir. Bu, aşağıda gösterildiği gibi bir ifadenin null olmadığını kontrol etmek için özellikle faydalı olur:
if (input is not null)
{
// ...
}
if (input is not null)
{
// ...
}
If input IsNot Nothing Then
' ...
End If
Burada, input null olmadığında kod bloğu çalıştırılır.
Birleşik (and kalıbı)
Birleşik kalıp, and anahtar kelimesini kullanarak, her iki kalıbın da ifade ile eşleştiği durumlarda bir ifadeyi eşleştirir. Bu, aşağıdaki örnekte gösterildiği gibi birden fazla koşulu birleştirmeye izin verir:
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ğer aralığına göre sınıflandırılır.
Veya Kullanımı (or kalıbı)
Veya kullanımı kalıbı, or anahtar kelimesini kullanarak, kalıplardan birinin ifade ile eşleşmesi durumunda bir ifadeyi eşleştirir. Bu, aşağıdaki gibi birden fazla olası koşulu yönetmeye olanak tanır:
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, takvim mevsimi belirtilen tarihin ayı temel alınarak belirlenir.
Bu desen kombinatörleri daha karmaşık ve doğru eşleştirme koşulları oluşturmak için tekrar kullanılabilir ve kodunuzun esnekliğini ve okunabilirliğini artırır.
Özellik Deseni
Özellik deseni, bir ifadenin özelliklerini veya alanlarını iç içe geçmiş desenlere eşleştirmeye olanak sağlar. Bu, aşağıdaki kod parçasında görebileceğiniz bir örnektir:
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 denk gelmesini sağlar.
Ayrıca, aşağıda gösterildiği gibi bir özellik deseni içinde bir çalışma zamanı türü kontrolü ve değişken beyannesi ekleyebilirsiniz:
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, karakterlerin dizilerini ve koleksiyonlarını ele alarak, bunların özelliklerine göre uygun şekilde işlem yapılmasını sağlar.
Konum Deseni
C# dilinde, konum deseni bir ifadenin sonucunu yapılandırmaya ve çıkan değerleri karşılık gelen iç içe desenlerle eşleştirmeye olanak tanır. Ö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, konum deseni, noktaların koordinatlarına göre sınıflandırılmasını sağlamak için kullanılır.
Ayrıca, C# 10'da tanıtılan ve genişletilmiş özellik deseni olarak bilinen bir özellik deseni dahilinde iç içe ö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 özelliklere doğrudan erişim sağlayarak özellik desenlerinin esnekliğini artırır.
Bu desenler, karmaşık veri yapılarını yönetmek ve kodunuzun okunabilirliğini ve ifade gücünü artırmak için güçlü mekanizmalar sağlar.
Var Deseni
Var Deseni, herhangi bir türü eşleştirmenize olanak tanır. Bu, özellikle Boolean ifadeleri içinde ara sonuçları yakalamak ya da switch case koruyucularında birden fazla kontrol gerektiğinde yararlı olabilir.
İşte bir Boolean ifadesinde var deseninin kullanıldığı 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 tam sayılar dizisini döndürür ve is var kalıbı sonucu results değişkenine kaydederek, özelliklerine dayalı sonraki hesaplamalara olanak tanır.
Ek olarak, var desenleri daha özlü ve okunabilir kodlar için switch ifadeleri veya ifadeleri 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, var kalıbı (x, y) noktanın koordinatlarını kaydederek, değerlerine dayalı farklı dönüşümlere olanak tanır.
Bir var deseninde, bildirilen değişkenin türü, desene karşı eşleştirilen ifadenin derleme zamanı türünden türetilir.
Var deseni, ifadenin belirli türünün önceden bilinmediği çeşitli senaryoları ele almak için uygun bir yol sağlayarak kod açıklığını ve esnekliğini artırır.
IronPDF Kütüphanesi'nin Tanıtımı
IronPDF Belge İşleme, PDF belge üretiminde uzmanlaşmış Iron Software'den bir kütüphanedir. Başlamak için, NuGet Paket Yöneticisi veya Visual Studio Paket Yöneticisi'nden kütüphaneyi yüklemek ilk adımdır.
# 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 görsel, Visual Studio Kurulum Kılavuzu ile nasıl kurulum yapılacağını göstermektedir.

Aşağıdaki kodda, basit bir PDF belgesi nasıl oluşturulacağını 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ı
IronPDF'in ChromePdfRenderer sınıfını HTML dizesini bir PDF belgesine kaydetmek için kullanıyoruz. Çıktı, 'output.pdf' belgesine kaydedilir.
Deneme Lisansı
IronPDF, deneme lisansı ile kullanılabilir. Bu lisansı IronPDF Lisanslama Sayfasından edinebilirsiniz. Bir lisans anahtarının e-posta ile teslim edilebilmesi için bir E-posta Kimliği sağlayın.
"IronPdf.LicenseKey": "<Your Key>"
"IronPdf.LicenseKey": "<Your Key>"
"IronPdf.LicenseKey" = "<Your Key>"
Lisans anahtarını, yukarıda gösterildiği gibi appsettings.json dosyasına yerleştirin.
Sonuç
C#'ta desen eşleştirme ifadeleri, koşullu ifadeler, tür kontrolleri ve nesne yapılandırmaları yazmak için güçlü ve esnek bir yol sunar. Desen eşleştirmeyi kullanarak, geliştiriciler kodun açıklığını ve sürdürülebilirliğini artırabilir ve tekrarlayan kodları azaltabilir. İster tür kontrolü, ister switch ifadeleri, ister yapılandırma olsun, desen eşleştirme ifadeleri, C#'ta çok çeşitli programlama görevlerini ele almak için çok yönlü bir araç seti sağlar.
Sonuç olarak, desen eşleştirme ifadelerini ustaca kullanmak, C# programlama becerilerinizi büyük ölçüde geliştirebilir ve daha temiz, daha ifade gücü yüksek ve anlaşılması kolay kodlar yazmanızı sağlar. IronPDF'nin HTML'den PDF Üretme yeteneklerini de ele aldık. Bu yetenekler sayesinde PDF belgeleri oluşturabilirsiniz.
Sıkça Sorulan Sorular
C#'da desen eslemeyi kullanarak kod okunabilirligini nasıl artirabilirim?
C#'daki desen esleme, geliştiricilerin kodu daha kisa ve anlamli yazmalarina olanak tanir, sartli ifadeleri daha açık ve anlasilabilir hale getirir. Bu, kod bloklarinin karmasikligini azaltarak okunabilirligi ve bakimi iyilestirir.
C#'da mevcut olan farkli desen esleme ifadeleri nelerdir?
C#, is ifadeleri, switch ifadeleri ve switch ifadeleri gibi çeşitli desen esleme ifadelerini destekler. Her tur, desen esleme yardimiyla ifadeleri degerlendirmek ve kod çalıştırmak için farkli yollar sunar.
C# kullanarak PDF belgeleri nasıl oluşturabilirim?
C#'da PDF belgeleri oluşturmak için Iron Software'in bir kütüphanesi olan IronPDF kullanabilirsiniz. HTML icerigi PDF'ye dönüştürmenize olanak tanir ve NuGet araciligiyla kolayca yüklenir, genis bir PDF oluşturma özellikleri yelpazesi sunar.
C# desen esleme icinde bildirim ve tur desenleri nedir?
C#'da bildirim ve tur desenleri, bir ifadenin çalışma zamanindaki turunun belli bir turle eslesip eslesmedigini kontrol eder ve eslesme başarılı oldugunda yeni bir yerel degiskenin bildirimi yapilmasini saglar, tur güvenli işlemleri kolaylastirir.
C#'da sabit desenler nasıl çalışir?
C#'da sabit desenler, bir ifadenin, bir tam sayi veya metin gibi özel bir sabit degerle eslesip eslesmedigini kontrol etmek için kullanilir ve eslesme bulunursa belli bir mantik çalıştırilir, basit sabit deger karsilastirmalar saglar.
C#'da iliskisel desenlerin amaci nedir?
C#'da iliskisel desenler, ifadelerin <, >, <= ve >= gibi iliskisel operatorlerle sabitlerle karsilastirilmasina olanak tanir. Bu, kodunuzda kisa aralik kontrolleri uygulamak için kullanislidir.
C#'da mantiksal desenler nasıl uygulanabilir?
C#'da mantiksal desenler, diğer desenleri and, or ve not gibi mantiksal operatorlerle birlestirerek coklu kriteri ayni anda degerlendirebilecek karmasik desen esleme koşulları oluşturur.
C#'da yok sayma deseni nedir ve ne zaman kullanilir?
C#'da yok sayma deseni, _ ile gösterilir, null da dahil olmak uzere her ifadeyi eslestirir ve switch ifadeleri gibi belli degerlerin gozardi edilmesi gereken durumlarda yaygin olarak kullanilir.
C#'da özellik desenleri nasıl kullanilabilir?
C#'da özellik desenleri, geliştiricilerin bir nesnenin özelliklerini veya alanlarini ic ice geçmiş desenlere eslestirmesine olanak tanir ve nesnenin yapisina derin kontrol saglayarak temiz ve kisa kod yazimini surdurur.




