در دنیای برنامهنویسی داتنت، همیشه جزئیات کوچکی وجود دارند که ممکن است به نظر پیشپاافتاده بیایند، اما برای توسعهدهندگان حرفهای، مثل خاری در چشم عمل میکنند. یکی از این جزئیات، نحوه گسترش اشیاء موجود با استفاده از متدهای اکستنشن (Extension Methods) در زبان #C بوده است. خوشبختانه، نسخه 14 زبان #C – که همراه با پیشنمایشهای .NET 10 عرضه شده – ابزاری جدید و انعطافپذیرتر به نام پروپرتیهای اکستنشن (Extension Properties) معرفی کرده است. این ویژگی نه تنها کد را تمیزتر و خواناتر میکند، بلکه به توسعهدهندگان اجازه میدهد کتابخانههای کمکی (Helper Libraries) را به شکلی طبیعیتر و زیباتر بنویسند. در این مقاله، به بررسی این مسئله آزاردهنده قدیمی و راهحل نوین C# 14 میپردازیم.
مسئله چیست؟
در اکوسیستم .NET، مایکروسافت ابزارها و کلاسهایی را فراهم کرده که توسعهدهندگان میتوانند آنها را گسترش دهند. یکی از رایجترین مثالها، شیء HtmlHelper در ASP.NET است که مجموعهای از متدهای مفید برای برنامهنویسی وب ارائه میدهد. اما محصولات و ابزارهای ثالث، مانند Sitecore (یک سیستم مدیریت محتوای محبوب)، ویژگیهای اضافی را با استفاده از متدهای اکستنشن به این شیء اضافه میکنند.
برای مثال، در کد Razor (زبان قالبنویسی ASP.NET)، نمایش یک فیلد Sitecore در یک رندرینگ (Rendering) چیزی شبیه به این است:
<h1>
@Html.Sitecore().Field("Title")
</h1>اینجا، Sitecore() یک متد اکستنشن است که یک شیء کمکی سفارشی برمیگرداند. اما مشکل کجاست؟ آن پرانتزهای اضافی () در انتهای Sitecore! این پرانتزهای هرچند کوچک، همیشه حس ناخوشایندی به من میدادند. چرا؟ چون این متد اکستنشن باید به عنوان یک متد تعریف شود، نه یک پروپرتی. کامپایلر #C تا پیش از این، فقط از متدها برای گسترش اشیاء دیگران پشتیبانی میکرد. نتیجه؟ کد نهایی همیشه با این پرانتزهای زائد، کمی نامرتب به نظر میرسد – مثل اینکه بخواهید یک در زیبا را با یک قفل زنگزده ببندید.
راهحل قدیمی: متدهای اکستنشن
در گذشته، برای تعریف چنین اکستنشنهایی، باید از سینتکس زیر استفاده میکردیم. فرض کنید یک کلاس استاتیک به نام SitecoreExtensions داریم:
public static class SitecoreExtensions
{
public static SitecoreExtensionClass Sitecore(this IHtmlHelper helper)
{
// بازگشت شیء کمکی سفارشی
return new SitecoreExtensionClass(helper);
}
}کامپایلر #C این متد را به عنوان اکستنشن به شیء Html (از ASP.NET) تفسیر میکند و در پشت صحنه، آن را به Sitecore(helper) تبدیل میکند. این کار عالی عمل میکند، اما الزام به استفاده از پرانتزها باعث میشود کد مصرفکننده (مانند Razor) همیشه با این “نقص زیباییشناختی” روبرو باشد. تصور کنید در پروژههای بزرگ، جایی که صدها بار از چنین اکستنشنهایی استفاده میشود – این جزئیات کوچک میتواند انباشته شود و خوانایی کد را کاهش دهد.
نوآوری C# 14: پروپرتیهای اکستنشن
خبر خوب اینجاست: C# 14 با معرفی پروپرتیهای اکستنشن، این مشکل را به شکلی هوشمندانه حل کرده است. حالا میتوانید اکستنشنها را نه تنها به صورت متد، بلکه به عنوان پروپرتی هم تعریف کنید. سینتکس کمی متفاوت است، زیرا پروپرتیها پارامتر this را به طور مستقیم نمیپذیرند، اما با استفاده از کلمه کلیدی extension، میتوانید آن را مدیریت کنید.
در نسخه جدید، تعریف اکستنشن Sitecore چیزی شبیه به این میشود:
public static class SitecoreExtensions
{
extension(IHtmlHelper helper)
{
public SitecoreExtensionClass Sitecore
{
get
{
// بازگشت شیء کمکی سفارشی
return new SitecoreExtensionClass(helper);
}
}
}
}حالا، در کد Razor، نیازی به پرانتزهای اضافی نیست! کد به این شکل تمیز و طبیعی میشود:
<h1>
@Html.Sitecore.Field("Title")
</h1>به نظر من، این تغییر کوچک، تفاوت بزرگی ایجاد میکند. Html.Sitecore حالا مثل یک پروپرتی واقعی رفتار میکند – بدون هیچ زوائد نحوی. این ویژگی نه تنها در Sitecore، بلکه در هر جایی که از Razor یا HtmlHelper استفاده میشود (مانند پروژههای ASP.NET Core)، کاربرد دارد.
محدودیتها و آینده
البته کدهای قدیمی (مانند DXP در Sitecore) همچنان به متدهای اکستنشن وابسته هستند و نمیتوانید آنها را بدون بازنویسی مهاجرت دهید. اما برای پروژههای جدید، به ویژه در رویکردهای headless (مانند Sitecore Headless)، این قابلیت میتواند استاندارد جدیدی بسازد. تصور کنید کتابخانههای کمکی که به طور طبیعیتر با APIهای مایکروسافت ادغام میشوند – این دقیقاً چیزی است که C# 14 وعده میدهد.
در نهایت، C# 14 نشان میدهد که حتی تغییرات کوچک میتوانند تأثیر بزرگی بر تجربه توسعه داشته باشند. اگر شما هم از آن دسته توسعهدهندگانی هستید که به جزئیات زیباییشناختی کد اهمیت میدهید، این ویژگی را در پیشنمایشهای .NET 10 امتحان کنید. شاید زمان آن رسیده که کتابخانههای کمکیتان را “شکلدارتر” کنید!