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

C# 11 فهرست مطالبRequired MembersRaw String LiteralsUTF-8 String LiteralsList PatternsNewlines in String Interpolation ExpressionsAuto-default StructsPattern Match Span<char> on a Constant StringGeneric AttributesExtended nameof ScopeAn Unsigned Right-shift OperatorStatic Abstract Members in InterfacesGeneric MathRequired 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 - validvar p1 = new Person { FirstName = "Aram", LastName = "Rahmani" };Person p2 = new("Aram", "Rahmani");// Initializations with missing required properties - compilation errorvar 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# 10byte[] array = Encoding.UTF8.GetBytes("Hello World");// C# 11byte[] array = "Hello World"List Patternsدر C# 11 الگوهای لیست را معرفی شده است .این تطبیق الگو را برای مطابقت با توالی عناصر در یک آرایه یا یک لیست استفاده می شود.شما می توانید از الگوهای لیست با هر الگوی، از جمله الگوهای ثابت، نوع، ویژگی و رابطه ای استفاده کنید.var numbers = new[] { 1, 2, 3, 4 };// List and constant patternsConsole.WriteLine(numbers is [1, 2, 3, 4]); // TrueConsole.WriteLine(numbers is [1, 2, 4]); // False// List and discard patternsConsole.WriteLine(numbers is [_, 2, _, 4]); // TrueConsole.WriteLine(numbers is [.., 3, _]); // True// List and logical patternsConsole.WriteLine(numbers is [_, >= 2, _, _]); // TrueNewlines in String Interpolation Expressionsدر C# 11 امکان رفتن به خط جدید در فرمت String InterPolation اضافه شده است. این امکان به شما کمک می کند تا کد های C# و خطوط جدید داخل { } خوانایی و فرمت بهتری داشته باشند.هنگام استفاده از عبارات C# طولانی تر در داخل String InterPolitaion، مانند عبارات سوئیچ تطبیق الگو یا پرس و جوهای LINQ، مفید است.// switch expression in string interpolationint 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 interpolationint[] 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 = 1073741816Static 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