تطبیق الگوی تکنیکی است که در آن یک عبارت را آزمایش می کنید تا مشخص شود که آیا ویژگی های خاصی دارد یا خیر. C# تطبیق الگوی نحو مختصر تر برای آزمایش عبارات و اقدام به هنگام بیان مطابقت دارد."IS Expression" از تطبیق الگوی برای آزمایش یک عبارت پشتیبانی می کند و به طور مشروط متغیر جدیدی را به نتیجه آن بیان اعلام می کند."بیان سوئیچ" شما را قادر می سازد بر اساس اولین الگوی تطبیق برای یک عبارت ، اقدامات را انجام دهید. این دو عبارت از واژگان غنی از الگوهای پشتیبانی می کنند.
در این مقاله مروری بر سناریوها ارائه شده است که می توانید از تطبیق الگوی استفاده کنید. این تکنیک ها می توانند خوانایی و صحت کد شما را بهبود بخشند. برای بحث کامل در مورد تمام الگوهای مورد استفاده شما ، به مقاله در مورد الگوهای موجود در مرجع زبان مراجعه کنید.
چک های تهی
یکی از رایج ترین سناریوها برای تطبیق الگوی اطمینان از تهی نیست. شما می توانید با استفاده از مثال زیر ، یک نوع مقدار قابل تهی را به نوع زیرین آن تست و تبدیل کنید:
int؟شاید = 12 ؛if (شاید شماره int باشد)
کد قبلی یک الگوی اعلامیه برای آزمایش نوع متغیر است و آن را به یک متغیر جدید اختصاص می دهد. قوانین زبان این تکنیک را از بسیاری دیگر ایمن تر می کند. شماره متغیر فقط در قسمت واقعی بند IF قابل دسترسی و اختصاص داده شده است. اگر سعی می کنید به جای دیگری ، یا در بند دیگر ، یا بعد از بلوک IF ، به آن دسترسی پیدا کنید ، کامپایلر خطایی را به وجود می آورد. ثانیا ، زیرا شما از اپراتور == استفاده نمی کنید ، این الگوی هنگامی کار می کند که یک نوع بیش از حد اپراتور == را اضافه می کند. این باعث می شود که آن را به یک روش ایده آل برای بررسی مقادیر مرجع تهی ، اضافه کردن الگوی NOT:
رشته؟پیام = "این رشته تهی نیست" ؛if (پیام تهی نیست)
مثال قبلی از یک الگوی ثابت برای مقایسه متغیر با تهی استفاده کرده است. نه الگوی منطقی است که وقتی الگوی نفی مطابقت نداشته باشد مطابقت دارد.
تست های نوع
یکی دیگر از کاربردهای متداول برای تطبیق الگوی ، آزمایش یک متغیر برای دیدن اینکه آیا با یک نوع معین مطابقت دارد یا خیر. به عنوان مثال ، اگر یک متغیر غیر تهی باشد و رابط کاربری System. Collections. Generic. Ilist را تست کند ، آزمایش کد زیر را آزمایش می کند. اگر این کار را انجام دهد ، از ویژگی ICollection. Count در آن لیست برای یافتن شاخص میانی استفاده می کند. الگوی اعلامیه صرف نظر از نوع زمان کامپایل متغیر ، با یک مقدار تهی مطابقت ندارد. کد زیر در برابر NULL ، علاوه بر محافظت در برابر نوعی که ILIST را اجرا نمی کند.
Public Static t Midpoint (دنباله ienumerable)دیگری اگر (دنباله تهی است)دیگر>
همین آزمایشات را می توان در یک عبارت سوئیچ اعمال کرد تا یک متغیر را در برابر انواع مختلف مختلف آزمایش کند. شما می توانید از این اطلاعات برای ایجاد الگوریتم های بهتر بر اساس نوع خاص زمان اجرا استفاده کنید.
مقادیر گسسته را مقایسه کنید
همچنین می توانید یک متغیر را آزمایش کنید تا یک مسابقه را در مقادیر خاص پیدا کنید. کد زیر یک مثال را نشان می دهد که در آن مقداری را در برابر تمام مقادیر ممکن اعلام شده در یک شمارش آزمایش می کنید:
public State PerformOperation(Operation command) =>سوئیچ فرمانRunDiagnostics(), Operation.Start => StartSystem(), Operation.Stop => StopSystem(), Operation.Reset => ResetToReady(), _ => throw new ArgumentException("Invalid enum value for command", nameof(command)),>;
مثال قبلی ، اعزام روش را بر اساس مقدار شمارش نشان می دهد. مورد نهایی _ الگوی دور انداختن است که با تمام مقادیر مطابقت دارد. این شرایط خطایی را کنترل می کند که مقدار آن با یکی از مقادیر enum تعریف شده مطابقت ندارد. اگر آن بازوی سوئیچ را حذف نکنید ، کامپایلر هشدار می دهد که شما تمام مقادیر ورودی ممکن را انجام نداده اید. در زمان اجرا ، اگر شیء مورد بررسی با هیچ یک از بازوهای سوئیچ مطابقت نداشته باشد ، بیان سوئیچ استثنا می کند. به جای مجموعه ای از مقادیر enum می توانید از ثابت های عددی استفاده کنید. همچنین می توانید از این تکنیک مشابه برای مقادیر رشته ثابت استفاده کنید که دستورات را نشان می دهد:
public State PerformOperation(string command) =>سوئیچ فرمان<"SystemTest" =>RunDiagnostics(), "Start" => StartSystem(), "Stop" => StopSystem(), "Reset" => ResetToReady(), _ => throw new ArgumentException("Invalid string value for command", nameof(command)),>;
مثال قبلی همان الگوریتم را نشان می دهد ، اما از مقادیر رشته به جای یک enum استفاده می کند. اگر برنامه شما به جای یک قالب داده معمولی به دستورات متن پاسخ می دهد ، از این سناریو استفاده می کنید. با شروع C# 11 ، می توانید از یک دهانه یا readonlyspan برای آزمایش مقادیر رشته ثابت نیز استفاده کنید ، همانطور که در نمونه زیر نشان داده شده است:
public State PerformOperation(ReadOnlySpan command) =>سوئیچ فرمان<"SystemTest" =>RunDiagnostics(), "Start" => StartSystem(), "Stop" => StopSystem(), "Reset" => ResetToReady(), _ => throw new ArgumentException("Invalid string value for command", nameof(command)),>;
در تمام این مثالها ، الگوی دور انداختن تضمین می کند که شما هر ورودی را کنترل می کنید. کامپایلر با اطمینان از رسیدگی به هر مقدار ورودی ممکن به شما کمک می کند.
الگوهای ارتباطی
شما می توانید از الگوهای رابطه ای برای آزمایش چگونگی مقایسه یک مقدار با ثابت استفاده کنید. به عنوان مثال ، کد زیر وضعیت آب را بر اساس دمای موجود در فارنهایت برمی گرداند:
string WaterState(int tempInFahrenheit) =>سوئیچ Tempinfahrenheit<(>32) و (<212) =>"مایع" ،<32 =>"solid",> 212 => "gas", 32 => "solid/liquid transition", 212 => "liquid / gas transition",>;
کد قبلی همچنین الگوی ملتحمه و منطقی را نشان می دهد تا بررسی کند که هر دو الگوی رابطه ای مطابقت دارند. همچنین می توانید از یک الگوی ناسازگار یا الگوی استفاده کنید تا بررسی کنید که هر یک از الگوی مطابقت دارد. این دو الگوی رابطه ای توسط پرانتز احاطه شده است که می توانید در اطراف هر الگوی برای وضوح استفاده کنید. دو بازوی سوئیچ پایانی موارد مربوط به نقطه ذوب و نقطه جوش را کنترل می کنند. بدون آن دو بازو ، کامپایلر به شما هشدار می دهد که منطق شما هر ورودی ممکن را پوشش نمی دهد.
کد قبلی همچنین ویژگی مهمی دیگر را نشان می دهد که کامپایلر عبارات تطبیق الگوی را ارائه می دهد: کامپایلر در صورت عدم تحمل هر مقدار ورودی به شما هشدار می دهد. این کامپایلر همچنین اگر یک بازوی سوئیچ در حال حاضر توسط یک بازوی سوئیچ قبلی انجام شود ، اخطار را صادر می کند. این به شما آزادی می دهد تا عبارات سوئیچ را اصلاح کنید و دوباره تنظیم کنید. راه دیگر برای نوشتن همان عبارت می تواند این باشد:
string WaterState2(int tempInFahrenheit) =>سوئیچ Tempinfahrenheit<<32 =>"solid", 32 =>"انتقال جامد/مایع" ،<212 =>"liquid", 212 => "liquid / gas transition", _ => "gas",>;
درس کلیدی در این مورد و هرگونه اصلاح مجدد یا مرتب سازی مجدد این است که کامپایلر تأیید می کند که شما تمام ورودی ها را پوشش داده اید.
ورودی های چندگانه
تمام الگویی که تاکنون دیده اید ، بررسی یک ورودی است. می توانید الگویی بنویسید که چندین ویژگی یک شی را بررسی می کند. سابقه سفارش زیر را در نظر بگیرید:
سفارش ضبط عمومی (موارد int ، هزینه اعشاری) ؛
نوع سابقه موقعیت قبلی ، دو عضو را در موقعیت های صریح اعلام می کند. ظاهر اول موارد ، سپس هزینه سفارش است. برای اطلاعات بیشتر ، به سوابق مراجعه کنید.
کد زیر تعداد موارد و ارزش سفارش برای محاسبه قیمت تخفیف را بررسی می کند:
public decimal CalculateDiscount(Order order) =>سوئیچ سفارش<10, Cost:> 1000.00m> =>0. 10m ،5, Cost:> 500.00m> =>0. 05 متر ،250.00m> => 0.02m, null => throw new ArgumentNullException(nameof(order), "Can't calculate discount on null order"), var someObject => 0m,>;
دو بازوی اول دو ویژگی سفارش را بررسی می کنند. سوم فقط هزینه را بررسی می کند. بررسی های بعدی در برابر NULL و مسابقات نهایی هر مقدار دیگر. اگر نوع سفارش یک روش ساختارشکنی مناسب را تعریف کند ، می توانید نام ویژگی ها را از این الگوی حذف کرده و از ساختارشکنی برای بررسی خواص استفاده کنید:
public decimal CalculateDiscount(Order order) =>سوئیچ سفارش<(>10,> 1000.00m) => 0.10m, (> 5,> 50.00m) =>0. 05 متر ،250.00m> => 0.02m, null => throw new ArgumentNullException(nameof(order), "Can't calculate discount on null order"), var someObject => 0m,>;
کد قبلی الگوی موقعیتی را نشان می دهد که در آن خواص برای بیان از بین می رود.
الگوهای لیست
با استفاده از الگوی لیست می توانید عناصر را در یک لیست یا یک آرایه بررسی کنید. یک الگوی لیست وسیله ای برای استفاده از الگوی برای هر عنصر یک دنباله فراهم می کند. علاوه بر این ، می توانید الگوی دور انداختن (_) را برای مطابقت با هر عنصر اعمال کنید ، یا یک الگوی برش را برای مطابقت با عناصر صفر یا بیشتر اعمال کنید.
الگوهای لیست ابزاری ارزشمند است که داده ها از ساختار منظم پیروی نمی کنند. شما می توانید به جای تبدیل آن به مجموعه ای از اشیاء ، از تطبیق الگوی برای آزمایش شکل و مقادیر داده ها استفاده کنید.
گزیده زیر را از یک فایل متنی حاوی معاملات بانکی در نظر بگیرید:
04-01-2020 ، سپرده ، سپرده اولیه ، 2250. 00 04-15-2020 ، سپرده ، بازپرداخت ، 125. 65 04-18-2020 ، سپرده ، چک ، 825. 65 04-22-2020 ، برداشت ، بدهی ، مواد غذایی ، 255. 73 05-01 05-01-2020 ، عقب نشینی ، #1102 ، اجاره ، Apt ، 2100. 00 05-02-2020 ، علاقه ، 0. 65 05-07-2020 ، برداشت ، بدهی ، فیلم ، 12. 57 04-15-2020 ، هزینه ، 5. 55
این یک فرمت CSV است، اما برخی از ردیف ها ستون های بیشتری نسبت به بقیه دارند. حتی بدتر از آن برای پردازش، یک ستون در نوع WITHDRAWAL دارای متن تولید شده توسط کاربر است و می تواند حاوی یک کاما در متن باشد. یک الگوی فهرستی که شامل الگوی حذف، الگوی ثابت و الگوی var برای گرفتن داده های پردازش ارزش در این قالب است:
تراز اعشاری = 0 متر؛تراکنش foreach (string[] در ReadRecords())decimal.Parse(amount), [_, "WITHDRAWAL", . var amount] => -decimal.Parse(amount), [_, "INTEREST", var amount] => decimal.Parse(amount), [_, "FEE", var fee] => -decimal.Parse(fee), _ =>پرتاب جدید InvalidOperationException($"Record
مثال قبلی یک آرایه رشته ای را می گیرد که در آن هر عنصر یک فیلد در ردیف است. کلیدهای عبارت switch در فیلد دوم، که نوع تراکنش و تعداد ستون های باقیمانده را تعیین می کند. هر ردیف تضمین می کند که داده ها در قالب صحیح هستند. الگوی دور انداختن ( _ ) از اولین فیلد با تاریخ تراکنش می گذرد. فیلد دوم با نوع تراکنش مطابقت دارد. عنصر باقیمانده مطابق با پرش به فیلد با مقدار است. تطبیق نهایی از الگوی var برای نمایش رشته مقدار استفاده می کند. عبارت مقداری را که باید از موجودی اضافه یا کم شود محاسبه می کند.
الگوهای فهرست شما را قادر می سازد تا با شکل دنباله ای از عناصر داده مطابقت داشته باشید. شما از الگوهای دور انداختن و برش برای مطابقت با مکان عناصر استفاده می کنید. شما از الگوهای دیگری برای تطبیق ویژگی های عناصر فردی استفاده می کنید.
این مقاله توری از انواع کدهایی را که می توانید با تطبیق الگو در سی شارپ بنویسید ارائه کرده است. مقالات زیر نمونه های بیشتری از استفاده از الگوها در سناریوها و واژگان کامل الگوهای موجود برای استفاده را نشان می دهد.
همچنین ببینید
- از تطبیق الگو برای جلوگیری از بررسی «است» و سپس بازیگران استفاده کنید (قوانین سبک IDE0020 و IDE0038)
- کاوش: از تطبیق الگو برای ایجاد رفتار کلاس خود برای کد بهتر استفاده کنید
- آموزش: از تطبیق الگو برای ساخت الگوریتم های نوع محور و داده محور استفاده کنید
- مرجع: تطبیق الگو
فارکس تحلیل تکنیکال...
ما را در سایت فارکس تحلیل تکنیکال دنبال می کنید
برچسب :
نویسنده : مرتضی احمدی
بازدید : <-PostHit->
تاريخ : سه
شنبه
14 شهريور
1402 ساعت: 19:18