الگوهای تطبیق (Pattern Matching)
الگوهای تطبیق (Pattern Matching) در سیشارپ یکی از قابلیتهای قدرتمند است که به توسعهدهندگان اجازه میدهد تا نوع و ساختار اشیاء را در زمان اجرا بررسی کرده و بر اساس آن عملیات منطقی انجام دهند. این قابلیت از C# 7.0 معرفی شده و در نسخههای بعدی با بهبودهایی همراه بوده است. استفاده از Pattern Matching باعث افزایش خوانایی کد، کاهش نیاز به تبدیلهای دستی و ایجاد کدی امنتر و با قابلیت نگهداری بالا میشود.
الگوهای تطبیق به ویژه در زمانی که با مجموعههای ناهمگن، دادههای پیچیده یا مدلهای شیگرای پیچیده کار میکنیم، اهمیت پیدا میکند. با استفاده از آن میتوان تصمیمگیریهای منطقی را بر اساس نوع یا ویژگیهای یک شیء انجام داد، بدون نیاز به if-elseهای تو در تو. این قابلیت به صورت مستقیم با مفاهیم پایهای سیشارپ مانند سینتکس، ساختارهای داده، الگوریتمها و اصول برنامهنویسی شیءگرا مرتبط است.
در این آموزش، یاد میگیرید که چگونه با Pattern Matching منطق تصمیمگیری خود را ساده کرده، نگهداری کد را بهبود دهید و الگوریتمها را بهینه کنید. همچنین بهترین روشها برای استفاده از switch expressions، Property Patterns و Tuple Patterns آموزش داده میشود و به مشکلات رایج مانند نشت حافظه و مدیریت نادرست خطاها پرداخته میشود. در پایان، شما قادر خواهید بود Pattern Matching را در پروژههای واقعی سیشارپ به کار ببرید و کدی تمیز، کارآمد و امن ایجاد کنید.
مثال پایه
textusing System;
namespace PatternMatchingExample
{
public class Shape {}
public class Circle : Shape
{
public double Radius { get; }
public Circle(double radius) => Radius = radius;
}
public class Rectangle : Shape
{
public double Width { get; }
public double Height { get; }
public Rectangle(double width, double height) => (Width, Height) = (width, height);
}
class Program
{
static void Main(string[] args)
{
Shape shape = new Circle(5.0);
string result = shape switch
{
Circle c => $"شعاع دایره: {c.Radius}",
Rectangle r => $"عرض: {r.Width}, ارتفاع: {r.Height}",
_ => "شکل ناشناخته"
};
Console.WriteLine(result);
}
}
}
در این مثال، یک کلاس پایه به نام Shape
و دو کلاس مشتق شده Circle
و Rectangle
تعریف شدهاند. با استفاده از switch expression نوع شیء در زمان اجرا بررسی شده و متغیرهای محلی برای دسترسی به ویژگیها ایجاد میشوند. الگوی _
برای پوشش انواع ناشناخته استفاده شده است که امنیت کد را افزایش میدهد و از بروز استثنا جلوگیری میکند.
این نمونه نشان میدهد که چگونه میتوان نوع شیء را با امنیت بررسی کرد، ویژگیها را استخراج کرد و تصمیمگیری منطقی را به شکل مختصر انجام داد. در پروژههای واقعی، Pattern Matching نگهداری کد را ساده میکند و موجب کاهش پیچیدگی و افزایش خوانایی و امنیت میشود.
مثال کاربردی
textusing System;
using System.Collections.Generic;
namespace PatternMatchingAdvanced
{
public abstract class Employee
{
public string Name { get; set; }
protected Employee(string name) => Name = name;
}
public class Manager : Employee
{
public int TeamSize { get; set; }
public Manager(string name, int teamSize) : base(name) => TeamSize = teamSize;
}
public class Developer : Employee
{
public string PrimaryLanguage { get; set; }
public Developer(string name, string language) : base(name) => PrimaryLanguage = language;
}
class Program
{
static void ProcessEmployee(Employee employee)
{
switch (employee)
{
case Manager m when m.TeamSize > 10:
Console.WriteLine($"مدیر ارشد: {m.Name}, تیم: {m.TeamSize}");
break;
case Manager m:
Console.WriteLine($"مدیر: {m.Name}, تیم: {m.TeamSize}");
break;
case Developer d:
Console.WriteLine($"برنامهنویس: {d.Name}, زبان اصلی: {d.PrimaryLanguage}");
break;
default:
Console.WriteLine($"نوع ناشناخته کارمند: {employee.Name}");
break;
}
}
static void Main(string[] args)
{
var employees = new List<Employee>
{
new Manager("آلیس", 12),
new Developer("باب", "C#"),
new Manager("چارلی", 5)
};
foreach (var emp in employees)
{
ProcessEmployee(emp);
}
}
}
}
در این نمونه پیشرفته، از Pattern Matching برای تفکیک انواع کارمندان و اعمال شرایط اضافی با when
استفاده شده است. متد ProcessEmployee
مجموعهای ناهمگن از اشیاء را پردازش میکند و با امنیت به ویژگیهای خاص هر نوع دسترسی دارد. بهترین روشها شامل استفاده از case default، نامگذاری معنادار متغیرها و ساختاردهی کد برای حفظ خوانایی است. Pattern Matching به بهینهسازی الگوریتمها، کاهش پیچیدگی و افزایش قابلیت اطمینان کد کمک میکند.
بهترین روشها و اشتباهات رایج در سیشارپ:
- همیشه یک case default برای انواع ناشناخته اضافه کنید.
- از
when
برای شرایط اضافی استفاده کنید و از if-elseهای تو در تو اجتناب کنید. - تبدیلهای غیرضروری نوع را حذف کنید و از Type Patterns استفاده کنید.
- از switch expressions برای افزایش خوانایی بهره ببرید.
- مقادیر null را در صورت نیاز بررسی کنید.
- ایجاد اشیاء غیرضروری در بخشهای حساس به عملکرد را محدود کنید.
- نامگذاری متغیرها باید واضح و معنادار باشد.
- منطق Pattern Matching را به دقت تست کنید.
- از اصول SOLID و استانداردهای نامگذاری پیروی کنید.
📊 جدول مرجع
سیشارپ Element/Concept | Description | Usage Example |
---|---|---|
Type Pattern | بررسی نوع شیء و ایجاد متغیر محلی | case Circle c: Console.WriteLine(c.Radius); |
Property Pattern | بررسی ویژگیهای شیء | case Rectangle r when r.Width > 10: … |
Tuple Pattern | بررسی عناصر یک تاپل | case (int x, int y) when x > y: … |
Switch Expression | روش مختصر برای تصمیمگیری | var result = shape switch { Circle c => c.Radius, _ => 0 }; |
when Condition |
اضافه کردن شرط اضافی به الگو | case Manager m when m.TeamSize > 10: … |
تسلط بر الگوهای تطبیق به شما اجازه میدهد کدی امن، تمیز و بهینه بنویسید. مفاهیم کلیدی شامل Type Patterns، Property Patterns، Tuple Patterns، switch expressions و when
هستند. گام بعدی شامل بررسی Recursive Patterns، Deconstruction در Records و کاربرد Pattern Matching در LINQ میباشد. این مهارتها برای توسعه back-end، APIها و برنامههای سازمانی حیاتی هستند و تفکر الگوریتمی و معماری نرمافزار را تقویت میکنند.
🧠 دانش خود را بیازمایید
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود