آرام رحماني
آرام رحماني
خواندن ۶ دقیقه·۲ سال پیش

ویژگی های جدید در C# 11

C# 11
C# 11
فهرست مطالب


  • Required Members
  • Raw String Literals
  • UTF-8 String Literals
  • List Patterns
  • Newlines in String Interpolation Expressions
  • Auto-default Structs
  • Pattern Match Span<char> on a Constant String
  • Generic Attributes
  • Extended nameof Scope
  • An Unsigned Right-shift Operator
  • Static Abstract Members in Interfaces
  • Generic Math

Required Members

در C# 11 یک ویژگی جدید به نام Required بعد از سطح دسترسی به فیلد ها و پراپرتی ها اضافه شده است که با استفاده از آن می توانید سازنده ها و کسانی که از آن شی نمونه سازی می کنند را وادار به مقدار دهی اولیه کنید.

public class Person
{
public Guid Id { get; set; } = Guid.NewGuid();
public required string FirstName { get; set; }
public required string LastName { get; set; }
}
// Initializations with required properties - valid
var p1 = new Person { FirstName = "Aram", LastName = "Rahmani" };
Person p2 = new("Aram", "Rahmani");

// Initializations with missing required properties - compilation error
var p3 = new Person { FirstName = "Aram" };
Person p4 = new();

اگر می خواهید چندین پارامتر را در سازنده اجباری کنید کافی است که صفتSetsRequiredMembers

را به سازنده اضافه کنید.

public class Person
{
public Person() { }

[SetsRequiredMembers]
public Person(string firstName , string lastName )
{
FirstName = firstName ;
LastName = lastName ;
}

public Guid Id { get; set; } = Guid.NewGuid();
public required string FirstName { get; set; }
public required string LastName { get; set; }
}

Raw String Literals

در C# 11 ویژگی جدیدی نظیر string interpolation که در نسخه های قبل منتشر شد اضافه شده است که به شما امکان می دهد تا رشته های حاوی متن دلخواه بدون از دست رفتن ترکیب کنید. (ترجمه دقیق این ویژگی لفظ رشته ای خام)

این ویژگی جدید از سه دابل کوتیشن تشکیل شده است """...""" اگر متن شما شامل 3 تا دابل کوتیشن باشد جهت استفاده از این فرمت شما باید از چهار دابل کوتیشن استفاده کنید.

در مثال زیر ما چون از فرمت رشته ای Json استفاده کرده ایم و فرمت json شامل { } می باشد جهت جلوگیری از تداخل با فرمت String Interpolation ما از دو علامت $$ استفاده کرده ایم و جهت استفاده از {} دوتایی از {{ }} استفاده کرده ایم.

string firstName= "Aram", lastName= "Rahmani"

string jsonString =
$$"""
{
"FirstName": {{firstName}},
"LastName": {{lastName}}
}
"""

Console.WriteLine(jsonString);

UTF-8 String Literals

سی شارپ 11 رشته های UTF-8 را معرفی کرده است که اجازه می دهد تنها کاراکتر های UTF-8 به نمایش بایت آن ها تبدیل کنید.این تبدیل در زمان کامپایل انجام می شود.

// C# 10
byte[] array = Encoding.UTF8.GetBytes("Hello World");

// C# 11
byte[] array = "Hello World"

List Patterns

در C# 11 الگوهای لیست را معرفی شده است .این تطبیق الگو را برای مطابقت با توالی عناصر در یک آرایه یا یک لیست استفاده می شود.شما می توانید از الگوهای لیست با هر الگوی، از جمله الگوهای ثابت، نوع، ویژگی و رابطه ای استفاده کنید.

var numbers = new[] { 1, 2, 3, 4 };

// List and constant patterns
Console.WriteLine(numbers is [1, 2, 3, 4]); // True
Console.WriteLine(numbers is [1, 2, 4]); // False

// List and discard patterns
Console.WriteLine(numbers is [_, 2, _, 4]); // True
Console.WriteLine(numbers is [.., 3, _]); // True

// List and logical patterns
Console.WriteLine(numbers is [_, >= 2, _, _]); // True

Newlines in String Interpolation Expressions

در C# 11 امکان رفتن به خط جدید در فرمت String InterPolation اضافه شده است. این امکان به شما کمک می کند تا کد های C# و خطوط جدید داخل { } خوانایی و فرمت بهتری داشته باشند.

هنگام استفاده از عبارات C# طولانی تر در داخل String InterPolitaion، مانند عبارات سوئیچ تطبیق الگو یا پرس و جوهای LINQ، مفید است.

// switch expression in string interpolation
int month = 5;
string season = $"The season is {month switch
{
1 or 2 or 12 => "winter",
> 2 and < 6 => "spring",
> 5 and < 9 => "summer",
> 8 and < 12 => "autumn",
_ => "unknown. Wrong month number",
}}."

Console.WriteLine(season);
// The season is spring.

// LINQ query in string interpolation
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6 };
string message = $"The reversed even values of {nameof(numbers)} are {string.Join(", ", numbers.Where(n => n % 2 == 0)
.Reverse())}."

Console.WriteLine(message);
// The reversed even values of numbers are 6, 4, 2.

Auto-default Structs

کامپایلر C# 11 به طور خودکار هر فیلد یا ویژگی را که توسط سازنده در ساختارها مقداردهی نشده است، مقداردهی اولیه می کند.

struct Person
{
public Person(string name)
{
Name = name;
}

public string Name { get; set; }
public int Age { get; set; }
}

Pattern Match Span<char> on a Constant String

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

ReadOnlySpan<char> str = "Oleg".AsSpan();

if (str is "Oleg")
{
Console.WriteLine("Hey, Oleg");
}

Generic Attributes

در سی شارپ، اگر می خواهید نوع را به یک Propertyمنتقل کنید، می توانید از عبارت typeof استفاده کنید.
با این حال، هرچند هیچ راهی برای محدود کردن انواعی که مجاز به استفاده هستید وجود ندارد. سی شارپ 11 اجازه استفاده از Generic Attributes را می دهد.

class MyType { }

class GenericAttribute<T> : Attribute
where T: MyType
{
private T _type;
}

[Generic<MyType>]
class MyClass { }

Extended nameof Scope

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

public class MyAttr : Attribute
{
private readonly string _paramName;
public MyAttr(string paramName)
{
_paramName = paramName;
}
}
public class MyClass
{
[MyAttr(nameof(param))]
public void Method(int param, [MyAttr(nameof(param))] int anotherParam)
{ }
}

An Unsigned Right-shift Operator

در C# 11 یک عملگر بدون علامت شیفت به سمت راست <<< معرفی شده است.این عملگر بیت ها هرکدام به سمت راست شیفت می دهد بدون اینکه با ارزش ترین بیت یا همان بیت علامت عوض شود.

int n = -32;
Console.WriteLine($"Before shift: bin = {Convert.ToString(n, 2),32}, dec = {n}");

int a = n >> 2;
Console.WriteLine($"After >>: bin = {Convert.ToString(a, 2),32}, dec = {a}");

int b = n >>> 2;
Console.WriteLine($"After >>>: bin = {Convert.ToString(b, 2),32}, dec = {b}");

// Output:
// Before shift: bin = 11111111111111111111111111100000, dec = -32
// After >>: bin = 11111111111111111111111111111000, dec = -8
// After >>>: bin = 111111111111111111111111111000, dec = 1073741816

Static Abstract Members in Interfaces

در C# 11 اعضای انتزاعی ایستا را در رابط ها معرفی می کند.
می توانید اعضای انتزاعی ایستا را در واسط ها اضافه کنید تا رابط هایی را تعریف کنید که شامل عملگرهای قابل بارگذاری، سایر اعضای استاتیک و ویژگی های استاتیک می شود.

public interface IAdditionOperator<TSelf, TOther, TResult>
where TSelf : IAdditionOperator<TSelf, TOther, TResult>
{
static abstract TResult operator +(TSelf left, TOther right);
}

Generic Math

ویژگی اعضای انتزاعی ایستا برای فعال کردن پشتیبانی ریاضی عمومی اضافه شده است.

source code
source code




Net Developer.
شاید از این پست‌ها خوشتان بیاید