چه چیزی در C# 11 جدید است

سه شنبه 7 تیر 1401

مواردی که در اینجا ذکر می کنیم در حال حاضر ویژگی های پیش نمایش هستند. شما باید "<LangVersion>" را برای preview تنظیم کنید تا این ویژگی ها را فعال کنید. هر ویژگی ممکن است قبل از انتشار نهایی تغییر کند. همه این ویژگی ها ممکن است در سی شارپ 11 منتشر نشوند. یا برخی موارد ممکن است بر اساس بازخورد آن ویژگی، برای مدت بیشتری در مرحله پیش نمایش باقی بماند.

چه چیزی در C# 11 جدید است

اتربیوت های عمومی (جنریک)

شما می توانید یک کلاس جنریک را که کلاس پایه آن System.Attribute است را اعلان کنید. این ویژگی برای اتربیوت هایی که به پارامتر System.Type نیاز دارند سینتکس راحت تری ارائه می‌دهد. قبلا باید اتربیوتی می‌ساختید که یک Type را به عنوان پارامتر سازنده خود در نظر می گرفت:

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

و برای اعمال اتربیوت، از عملگر typeof استفاده می کنید:

[TypeAttribute(typeof(string))]
public string Method() => default;

با استفاده از این ویژگی، می توانید یک اتربیوت جنریک ایجاد کنید:

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

سپس پارامتر type را برای استفاده از اتربیوت مشخص کنید:

[GenericAttribute<string>()]
public string Method() => default;

هنگام اعمال اتربیوت، باید تمام پارامترهای type را ارائه دهید. به عبارت دیگر، generic type باید به طور کامل ساخته  شود.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

آرگومان‌های type

آرگومان های type باید همان محدودیت‌های عملگر typeof را رعایت کنند. Typeهایی که به metadata annotations نیاز دارند مجاز نیستند. به عنوان مثال، typeهای زیر به عنوان پارامتر type مجاز نیستند:

·        dynamic

·        ?string (یا هر reference type ی null پذیر)

·        (int X, int Y) (یا هر tuple type دیگر با استفاده از سینتکس C# tuple)

UIntPtr یا IntPtr عددی

نوع های nint و nuint اکنون به ترتیب با نام مستعار System.IntPtr و System.UIntPtr هستند.

خطوط جدید در الحاق رشته ای

متن داخل کاراکترهای { and } برای الحاق رشته ای اکنون می تواند چندین خط را پوشش دهد. متن بین نشانگرهای { and } به سی شارپ تبدیل می شود. هر گونه سی شارپ قانونی، از جمله خطوط جدید، مجاز است. این ویژگی خواندن الحاق رشته ای که از عبارات سی شارپ طولانی تر، مانند عبارت switch تطبیق الگو، یا کوئری‌های LINQ، استفاده می کند را آسان‌تر می سازد.

الگوهای List

الگوهای List تطبیق الگو را برای مطابقت با توالی عناصر در یک لیست یا در یک آرایه گسترش می‌دهد. مثلا، sequence is [1, 2, 3] زمانی درست است که sequence آرایه یا لیستی از سه عدد صحیح (1,2and 3) باشد. می توانید عناصر را با استفاده از هر الگویی، از جمله constant، type، property و الگوهای رابطه ای مطابقت دهید. الگوی (_) با هر عنصر واحدی، و الگوی محدوده جدید (...) با هر دنباله ای از عناصر صفر یا بیشتر مطابقت دارد.

method group conversion بهبود یافته به delegate

استاندارد سی شارپ در مورد Method group conversions اکنون شامل موارد زیر است:

نکته: conversion برای استفاده از نمونه delegate موجود که از قبل حاوی این رفرنس‌ها است مجاز است (اما الزامی نیست).

نسخه های قبلی استاندارد، کامپایلر را از استفاده مجدد از آبجکت delegate ایجاد شده برای method group conversion منع می‌کرد. کامپایلر سی شارپ 11 آبجکت delegate ایجاد شده از method group conversion را کش می کند و از آن delegate object استفاده مجدد می‌کند. این ویژگی برای اولین بار در Visual Studio 17.2 به عنوان یک ویژگی پیش نمایش در دسترس است. این برای اولین بار در NET 7 preview 2. در دسترس است.

Raw string literals

Raw string literals یک فرمت جدید برای لیترال‌های رشته ای هستند. Raw string literals می‌توانند حاوی متن دلخواه، از جمله فضای خالی، خطوط جدید، کوتیشن‌های جاسازی شده، و سایر کاراکترهای خاص بدون نیاز به دنباله هایی برای گریز (escape sequences) باشند. یک  raw string literal با حداقل سه کاراکتر دابل کوتیشن (""") شروع می شود. با همان تعداد دابل کوتیشن به پایان می‌رسد. به طور معمول یک raw string literal از سه دابل کوتیشن در یک خط برای شروع رشته، و از سه دابل کوتیشن در یک خط جداگانه برای پایان رشته استفاده می کند. خطوط جدید بعد از کوتیشن ابتدایی و قبل از کوتیشن پایانی در محتوای نهایی گنجانده نشده است:

string longMessage = 
"""
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

هر فضای خالی در سمت چپ دابل کوتیشن‌های پایانی از string literal حذف می شوند. Raw string literals می‌توانند با الحاق رشته ای ترکیب شوند تا بریس‌ها را در متن خروجی قرار دهند. کاراکترهای چندگانه $ نشان می‌دهند که چند بریس متوالی شروع و پایان الحاقی هستند:

var location 
= $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

مثال قبل مشخص می کند که دو بریس شروع و پایان الحاقی هستند. سومین بریس باز و بسته در رشته خروجی گنجانده می شود.

Struct با پیش فرض اتوماتیک

کامپایلر C# 11 تضمین می‌کند که تمام فیلدهای نوع struct با مقادیر پیش فرض‌شان به عنوان بخشی از اجرای کانستراکتور، مقداردهی اولیه می شوند. این تغییر به این معنی است که هر فیلد یا پراپرتی خودکار که توسط کانستراکتور (سازنده) مقداردهی نشده است، به صورت اتوماتیک توسط کامپایلر مقداردهی اولیه می‌شود. Structهایی که کانستراکتور قطعا همه فیلدها را به آن اختصاص نمی‌دهد اکنون کامپایل می‌شوند، و هر فیلدی که به صراحت مقداردهی اولیه نشده باشد، با مقدار پیش فرض خودش تنظیم می‌شود.

تطبیق الگوی Span<char> یا ReadOnlySpan<char> روی رشته ثابت

با استفاده از تطبیق الگو در چندین انتشار، می‌توانید تست کنید ببینید آیا یک رشته دارای مقدار ثابت خاصی است. اکنون می‌توانید از همان منطق تطبیق الگو با متغیرهایی که Span<char> یا ReadOnlySpan<char> هستند استفاده کنید.

محدوده nameof توسعه یافته

اکنون نام‌های پارامتر و نوع نام های پارامتر وقتی که در عبارت nameof در اعلان اتربیوت بر روی آن متد استفاده می‌شوند در محدوده (scope) هستند. این ویژگی به این معناست که اکنون شما می‌توانید از عملگر nameof برای تعیین نام پارامتر متد در اتربیوتی بر روی اعلان متد یا پارامتر استفاده کنید. این ویژگی اغلب برای افزودن اتربیوت‌ها برای تحلیل nullable مفید است.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 6 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید