مطابقت با الگوها (Pattern Matching) از نسخه C# 7 معرفی شد و در هر نسخه بعدی بهبود یافته است. در C# 12، امکانات جدیدی به Pattern Matching اضافه شده که امکان نوشتن کدهای خواناتر و قدرتمندتر را فراهم میکند. در اینجا به برخی از بهبودهای کلیدی میپردازیم:
در C# 12، الگوهای لیستی (List Patterns) گسترش یافتهاند تا با مجموعههای پیچیدهتر مانند آرایهها، List<T>
و سایر انواع مجموعهها مطابقت پیدا کنند. الگوهای لیستی به شما اجازه میدهند تا از عملیاتهایی مانند چک کردن وجود عناصر در یک لیست یا انجام عملیاتهای مختلف روی آنها به شکلی تمیز و قابلخواندن استفاده کنید.
int[] numbers = { 1, 2, 3, 4, 5 };
// استفاده از الگوی لیستی برای مطابقت با آرایهای که اولین و آخرین عنصرش مشخص است
if (numbers is [1, .., 5])
{
Console.WriteLine("The array starts with 1 and ends with 5.");
}
// استفاده از الگوی لیستی برای مطابقت با آرایهای با دو عنصر یا بیشتر
if (numbers is [var first, .., var last])
{
Console.WriteLine($"First element: {first}, Last element: {last}");
}
در مثال بالا:
[1, .., 5]
یک الگوی لیستی است که بررسی میکند آیا آرایه با ۱ شروع و با ۵ پایان مییابد یا خیر.[var first, .., var last]
یک الگوی لیستی است که اولین و آخرین عنصر آرایه را استخراج میکند.
در C# 12، ترکیبکنندههای الگو (Pattern Combinators) بهبود یافتهاند. این ترکیبکنندهها شامل and
، or
و not
هستند که به شما امکان میدهند الگوهای پیچیدهتر و انعطافپذیرتری بسازید.
object data = new[] { 1, 2, 3 };
if (data is int[] { Length: > 0 } and [1, ..])
{
Console.WriteLine("Data is a non-empty integer array starting with 1.");
}
if (data is not null or string)
{
Console.WriteLine("Data is not null and is not a string.");
}
در این مثال:
and
برای ترکیب دو الگوی شرطی استفاده میشود: آرایهای با حداقل یک عنصر که با 1 شروع میشود.not
برای مطابقت با هر دادهای کهnull
یاstring
نیست.
در نسخههای قبلی C#، الگوهای رابطهای (Relational Patterns) برای مقایسه مقادیر با یک عدد ثابت ارائه شد. در C# 12، میتوانید از این الگوها به طور انعطافپذیرتری در ترکیب با سایر الگوها استفاده کنید.
int number = 42;
if (number is > 0 and < 100)
{
Console.WriteLine("Number is between 1 and 99.");
}
if (number is >= 50 or <= 10)
{
Console.WriteLine("Number is 10 or less, or 50 or greater.");
}
در اینجا:
- از
and
وor
برای ترکیب چندین الگوی رابطهای استفاده شده است.
C# 12 پشتیبانی از الگوهای بازگشتی (Recursive Patterns) را بهبود داده است. این الگوها به شما اجازه میدهند تا ساختارهای دادههای تو در تو را به شکل موثرتری بررسی کنید.
class Node
{
public int Value { get; set; }
public Node? Left { get; set; }
public Node? Right { get; set; }
}
Node tree = new Node
{
Value = 5,
Left = new Node { Value = 3 },
Right = new Node { Value = 8 }
};
// الگوی بازگشتی برای مطابقت با ساختار درختی
if (tree is { Value: 5, Left: { Value: 3 }, Right: { Value: 8 } })
{
Console.WriteLine("Tree matches the pattern.");
}
در این مثال:
- از یک الگوی بازگشتی برای بررسی ساختار یک درخت دودویی استفاده شده است.
بهبودهای جدید در Pattern Matching در C# 12 امکان نوشتن کدهای تمیزتر، خواناتر، و قابل فهمتر را فراهم کرده است. این ویژگیها به ویژه در زمانی که با ساختارهای داده پیچیده یا منطقهای پیچیدهای سروکار دارید، بسیار مفید خواهند بود.