در تکمیل سری بررسی ویژگیهای C# 7.0، ذکر ویژگی Discards نیز ضروری است. Discards به معنای متغیرهای محلی هستند که قابل انتساب بوده، اما قابل خواندن نیستند. دارای نامی نیستند و تنها توسط یک _ مشخص میشوند. در اینجا underscore یا _، یک واژهی کلیدی است؛ مانند var و قابلیت خوانده شدن را ندارد (نمیتواند در سمت راست یک انتساب قرار گیرد).
علت وجود Discards در C# 7.0
گاهی از اوقات میخواهیم از مقادیر بازگشت داده شدهی توسط متدها، خصوصا آرگومانهای out، صرفنظر کنیم:
در این مثال، parsedValue برای ما اهمیتی نداشته و تنها میخواهیم از خروجی متد TryParse استفاده کنیم. به علاوه میخواهیم آنرا در ادامهی کد نیز قابل دسترسی کنیم. در C# 7.0 برای رسیدن به این مقصود از Discards استفاده میشود:
در اینحالت، _ ذکر شده، در بدنهی if و یا حتی در خارج از آن، قابل دسترسی نیست و کامپایلر از آن صرفنظر میکند.
مکانهایی که میتوان از Discards در آنها استفاده کرد
پارامترهای از نوع out، یکی از مکانهایی هستند که میتوان از Discards برای معرفی آنها استفاده کرد. سایر کاربردهای آن شامل موارد ذیل میشوند:
-در تعاریف tuples برای صرفنظر کردن از پارامتری خاص (Value Tuple deconstructions)
در اینجا فرض کنید خروجی یک متد که یک tuple را بر میگرداند، شامل سه عدد است که تنها به مورد اول آنها علاقمندیم. در اینجا میتوان سایر پارامترهای صرفنظر شده را توسط _ معرفی کرد.
-در pattern matching برای صرفنظر کردن از نوعی خاص
- در پارامترهای delegates
واژهی کلیدی _
یک واژهی کلیدی زمینهای است
_ یک contextual keyword به حساب میآید؛ مانند var. به این معنا که اگر پیشتر در کدهای خود، یک متغیر محلی را به نام _ تعریف کرده باشید، با _ بکار رفتهی به صورت discard، تداخل نخواهد کرد:
در اینجا مقدار v داخل بدنهی if، برخلاف تصور false خواهد بود. علت اینجا است که اولین _ تعریف شده یک local variable است و دومین _ یک discard به حساب میآید. بنابراین مهم نیست که رشتهی TRUE قابلیت parse به true را دارد و نتیجهی true در _ پارامتر خروجی out قرار میگیرد. واژهی کلیدی _ قابلیت خواندن را نداشته و فقط مقدار متغیر محلی _ تعریف شدهی پیش از discard، خوانده خواهد شد.
قابلیت تعریف مجدد را دارد
در مثال
هرچند واژهی کلیدی _ به معنای تعریف یک متغیر محلی فقط نوشتنی است، اما قابلیت تکرار تعریف آن وجود دارد. یعنی در این حالت نیازی نیست تا دومین متغیر را با یک _ و سومین را با دو __ مشخص کرد. واژهی کلیدی _ قابلیت تعریف و استفادهی مجدد را دارد.
علت وجود Discards در C# 7.0
گاهی از اوقات میخواهیم از مقادیر بازگشت داده شدهی توسط متدها، خصوصا آرگومانهای out، صرفنظر کنیم:
if (bool.TryParse("TRUE", out parsedValue)) { /* Do your stuff */ }
if (bool.TryParse("TRUE", out bool _)) { /* Do your stuff */ }
مکانهایی که میتوان از Discards در آنها استفاده کرد
پارامترهای از نوع out، یکی از مکانهایی هستند که میتوان از Discards برای معرفی آنها استفاده کرد. سایر کاربردهای آن شامل موارد ذیل میشوند:
-در تعاریف tuples برای صرفنظر کردن از پارامتری خاص (Value Tuple deconstructions)
var (arg1, _, _) = (1, 2, 3);
-در pattern matching برای صرفنظر کردن از نوعی خاص
// in pattern matching switch (input) { case int number: Add(number); break; case object[] _: // ignore break; }
- در پارامترهای delegates
// in delegate parameters var usersWithPosts = context.Users .Join(context.Posts, user => user.UserId, post => post.UserId, (user, _) => user);
واژهی کلیدی _
یک واژهی کلیدی زمینهای است
_ یک contextual keyword به حساب میآید؛ مانند var. به این معنا که اگر پیشتر در کدهای خود، یک متغیر محلی را به نام _ تعریف کرده باشید، با _ بکار رفتهی به صورت discard، تداخل نخواهد کرد:
bool _ = false, v = false; if (bool.TryParse("TRUE", out var _)) { /* Do your stuff */ v = _; }
قابلیت تعریف مجدد را دارد
در مثال
var (arg1, _, _) = (1, 2, 3);