در این بخش، به خلاصهای از بحثهای مطرح شده پیرامون توسعهی «افزونهها» (Extensions) در سیشارپ 14 میپردازیم. این بحثها به چالشها و تصمیمات طراحی مرتبط با این ویژگی جدید میپردازند.
نکات کلیدی
- تکامل ویژگیهای «افزونهها» (Extensions)
- سیشارپ از نسخهی 3، «متدهای افزونهای» (Extension Methods) را داشتهاست.
- گسترش این ویژگی به سایر انواع «افزونهها» (Extensions) مانند «خصوصیات افزونهای» (Extension Properties) و «ایندکسرهای افزونهای» (Extension Indexers) با چالشهایی روبرو بوده است.
- چالشهای طراحی «افزونهها» (Extensions)
- یافتن یک نحو (Syntax) مناسب که انواع مختلف «افزونهها» (Extensions) را پوشش دهد.
- ایجاد تعادل بین انعطافپذیری و پیچیدگی زبان.
- حفظ سازگاری با نسخههای قبلی (Backward Compatibility).
- رویکردهای طراحی و ملاحظات «افزونههای سطح عضو» (Member-Level Extensions):
- الصاق اطلاعات «افزونه» (Extension) به هر عضو.
- «افزونههای سطح نوع» (Type-Level Extensions):
- ایجاد «انواع افزونه» (Extension Types) جداگانه (مشکلساز با کلاسهای استاتیک موجود).
- «افزونههای گروهبندی شده» (Grouped Extensions):
- استفاده از «نواحی ناشناس» (Anonymous Regions) درون کلاسهای استاتیک برای گروهبندی «افزونهها» (Extensions) بر اساس نوع زیربنایی (رویکرد ترجیحی).
- نحو (Syntax) و معناشناسی (Semantics)
- رویکرد منتخب از یک پارامتر برای نمایش «گیرنده» (Receiver) درون بدنهی «افزونهها» (Extensions) استفاده میکند.
- این امر سازگاری با «متدهای افزونه» (Extension Methods) موجود را حفظ میکند.
- بحث در مورد اینکه آیا کلمهی کلیدی
extension یک تغییر ناسازگار (Breaking Change) خواهد بود یا خیر. - بحث در مورد اینکه آیا میتوان بستهبندی کلاس استاتیک را حذف کرد یا خیر.
- انواع عضو «افزونه» (Extension)
- پشتیبانی از انواع مختلف عضو «افزونه» (Extension)، از جمله «خصوصیات» (Properties)، «ایندکسرها» (Indexers)، «عملگرها» (Operators) و به طور بالقوه «سازندهها» (Constructors).
- «عملگرهای افزونه» (Extension Operators) و «سازندههای افزونه» (Extension Constructors) در حال بررسی هستند.
- سازگاری با نسخههای قبلی (Backward Compatibility)
- هدف، امکان پذیر ساختن پذیرش تدریجی نحو (Syntax) جدید «افزونه» (Extension) است.
- «متدهای افزونه» (Extension Methods) موجود باید سازگار باقی بمانند.
- بحث در مورد تمایل به حذف نحو (Syntax) قدیمیتر، اما دشواری انجام این کار.
بحث در مورد یونیونها (C# Unions)
- سخنران توضیح میدهد که #C 14 شامل یونیونها نخواهد بود، اما آنها در حال بررسی این ویژگی برای نسخههای آینده هستند.
- یونیونها به عنوان راهی برای تعریف نوعی که میتواند یکی از چندین نوع متمایز را در خود جای دهد، با یک ممیز (discriminator) یا برچسب (tag) برای نشان دادن اینکه کدام نوع در حال حاضر آن را نگه میدارد، توصیف میشوند.
- این با ارثبری (inheritance) متفاوت است، زیرا یونیونها جامعیت (exhaustiveness) را فراهم میکنند، به این معنی که همه انواع ممکن در یونیون باید مدیریت شوند.
- دو رویکرد اصلی در نظر گرفته شده است:
- یونیونهای مبتنی بر کلاس (Class-based unions): مشابه یونیونهای متمایز #F، با استفاده از ارثبری و بررسی جامعیت در سطح کامپایلر. اینها به انواع تشکیل دهنده یونیون اجازه میدهند انواع کاملاً توسعه یافته با متدها و ویژگیها باشند.
- یونیونهای ساختاری (Structural unions): مشابه یونیونهای TypeScript، که در آن انواع، بدون اعلان صریح، در لحظه ترکیب میشوند. این رویکرد با چالشهای نمایش زمان اجرا و عملکرد، روبرو است.
- رویکرد مبتنی بر کلاس در حال حاضر به دلیل مشکلات پیاده سازی کمتر شناخته شده، مورد علاقه است.
- یونیونهای مبتنی بر ساختار (Struct-based unions) به دلیل اندازه بالقوه و سربار کپی، چالشهای عملکردی را ارائه میدهند.
- بحث در مورد افزودن متدها به یونیونها و امکان رفتار با آنها به عنوان ارثبری پیشرفته.
- بحث در مورد جامعیت و امکان سطوح مختلف جامعیت.
- بحث در مورد مشکلات پیاده سازی یونیونهای مبتنی بر struct.
- بحث در مورد نحوه تعامل generics با یونیون ها.
پیادهسازی عبارات دیکشنری (Dictionary Expressions) در عبارات کالکشن (Collection Expressions) سی شارپ
این بخش به بررسی نحوه پیادهسازی عبارات دیکشنری در ویژگی عبارات کالکشن سی شارپ میپردازد و بر سینتکس (syntax) و روشهای ایجاد آنها تمرکز دارد.
تعریف عبارات دیکشنری به کمک عبارات کالکشن
- ادغام: عبارات دیکشنری به جای اینکه یک سینتکس جداگانه باشند، در عبارات کالکشن ادغام شدهاند.
- نوع هدف (target type) تعیین میکند که آیا یک عبارت کالکشن به عنوان دیکشنری در نظر گرفته شود یا خیر.
- سینتکس: جفتهای کلید-مقدار با استفاده از علامت دونقطه (:) نمایش داده میشوند (به عنوان مثال،
key: value). - این سینتکس به عنوان نوع جدیدی از عنصر در عبارات کالکشن عمل میکند.
مشاهده مطلب اصلی