ساده سازی تعریف فضاهای نام در C# 10.0
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

در ادامه‌ی طراحی مبتنی بر مینی‌مالیسم C# 10.0، پس از پیش‌فرض شدن «top level programs» و همچنین «کاهش تعداد بار تعاریف usingها»، تغییر سوم صورت گرفته‌ی در قالب‌های پروژه‌های مبتنی بر دات نت 6، ساده سازی تعاریف فضاهای نام است. برای مثال یک کنترلر، به این صورت تعریف شده‌است:
namespace mvc.Controllers;

public class HomeController : Controller
{
}
که به آن «File-Scoped Namespaces» هم گفته می‌شود.


بررسی مفهوم «File-Scoped Namespaces»

یکی از اهداف مهم C# 10.0، کاهش نویز موجود در فایل‌های cs. است. اگر قرار است صدها بار در فایل‌های مختلف برنامه، using System نوشته شود، چرا یکبار آن‌را به صورت عمومی تعریف نکنیم و یا اگر در 99 درصد موارد، توسعه دهنده‌ها به ازای یک فایل، تنها یک فضای نام را تعریف می‌کنند، چرا باید یک فضای اضافی خالی، برای تعریف آن اختصاص داده شود و تمام فایل‌ها به همراه یک «tab فاصله‌ی» اضافی مختص به این فضای نام باشند؟
تعریف فعلی فضاهای نام در #C به صورت زیر است:
namespace MyNamespace
{
    public class MyClass
    {
        public void MyMethod()
        {
            //...Method implementation
        }
    }
}
در این حالت هر شیءای که داخل {} این فضای نام قرار گیرد، متعلق به آن است.
در C# 10.0، می‌توان این تعریف را ساده کرد؛ از آنجائیکه به ندرت چند فضای نام در یک تک فایل تعریف می‌شوند، می‌توان تعریف فضای نام را در یک سطر، در ابتدای فایل ذکر کرد، تا به صورت خودکار به کل فایل و اشیاء موجود در آن اعمال شود:
namespace MyNamespace;
public class MyClass
{
    public void MyMethod()
    {
        //...Method implementation
    }
}
در این حالت، روش استفاده‌ی از یک چنین اشیایی هیچ تغییری نخواهد کرد؛ فقط یک tab space و فاصله از کنار صفحه، صرفه‌جویی می‌شود!


محدویت‌های «File-Scoped Namespaces»

- بدیهی است در این حالت دیگر نمی‌توان چندین فضای نام را همانند قبل در یک فایل cs. تعریف کرد:
namespace Name1
{
    public class Class1
    {
    }
}

namespace Name1.Name2
{
  public class Class2
  {
  }
}
 و البته این موردی است که جزو best practices توسعه‌ی برنامه‌های #C به هیچ عنوان توصیه نمی‌شود.
- همچنین امکان ترکیب روش قبلی تعریف فضاهای نام، با روش جدید، در یک فایل وجود ندارد.
- به علاوه امکان تعریف فضاهای نام تو در تو که با روش قدیمی وجود دارد:
namespace Name1
{
    public class Class1
    {
    }

    namespace Name1.Name2
    {
        public class Class2
        {
        }
    }
}
در این حالت جدید پشتیبانی نمی‌شود.
  • #
    ‫۳ سال قبل، یکشنبه ۲ آبان ۱۴۰۰، ساعت ۰۷:۱۸
    در کنار این مطلب، موضوع  global modifier  برای عدم تکرار namespace ها جذاب هست.
  • #
    ‫۳ سال قبل، پنجشنبه ۶ آبان ۱۴۰۰، ساعت ۱۰:۴۷
    یک نکته‌ی تکمیلی: وادار کردن خود به استفاده‌ی یک‌دست از این قابلیت در سراسر Solution

    می‌توان با تنظیم فایل editorconfig. که در کنار فایل sln. قرار دارد، زیر تمام فضاهای نام پیشین، یک خط اخطار جهت ارتقاء به روش جدید کشید. برای اینکار تنها کافی است تنظیم زیر را به آن اضافه کنید:
    [*.cs]
    
    csharp_style_namespace_declarations = file_scoped:warning

    و همچنین اگر می‌خواهید پس از این تغییر، تمام فایل‌ها را یکجا به روز رسانی کنید، در NET 6.، برنامه‌ی dotnet-format، جزء استاندارد SDK است. به همین جهت در همان ریشه‌ی sln.، دستور زیر را صادر کنید:
    dotnet format
    البته اگر فقط می‌خواهید لیست تغییراتی را که صورت می‌گیرند مشاهده کنید، دستور زیر را صادر کنید:
    dotnet format --verify-no-changes