چه خبر در C# 9. 0

ساخت وبلاگ

C# 9. 0 ویژگی ها و پیشرفت های زیر را به زبان C# اضافه می کند:

  • سوابق
  • فقط تنظیم کننده ها
  • بیانیه های سطح بالا
  • پیشرفت های تطبیق الگوی
  • عملکرد و بین المللی
    • عدد صحیح با اندازه بومی
    • نشانگرهای عملکردی
    • سرکوب پرچم محلی محلی
    • عبارات جدید دارای نوع هدف
    • توابع ناشناس استاتیک
    • عبارات شرطی از نوع هدف
    • انواع بازگشت کواریان
    • پشتیبانی از GetEnumerator برای حلقه های Foreach
    • پارامترهای لامبدا را دور بیندازید
    • ویژگی های مربوط به عملکردهای محلی
    • اولیه سازهای اولیه ماژول
    • ویژگی های جدید برای روش های جزئی

    C# 9. 0 در . NET 5 پشتیبانی می شود. برای اطلاعات بیشتر ، به نسخه سازی زبان C# مراجعه کنید.

    می توانید آخرین . NET SDK را از صفحه . NET Downloads بارگیری کنید.

    ما به بازخورد شما در مورد این ویژگی ها علاقه مند هستیم. اگر با هر یک از این ویژگی های جدید مشکلی پیدا کردید ، مسئله جدیدی را در مخزن Dotnet/Roslyn ایجاد کنید.

    انواع ضبط

    C# 9. 0 انواع رکورد را معرفی می کند. شما از کلمه کلیدی Record برای تعریف نوع مرجع استفاده می کنید که عملکرد داخلی را برای محاصره کردن داده ها فراهم می کند. شما می توانید با استفاده از پارامترهای موقعیتی یا نحو خاصیت استاندارد ، انواع ضبط شده با خصوصیات تغییر ناپذیر را ایجاد کنید:

    شخص ضبط عمومی (رشته اول نام ، نام خانوادگی رشته) ؛ 
    شخص ضبط عمومینام مورد نیاز رشته نام مورد نیاز>; 

    همچنین می توانید انواع ضبط با خصوصیات و زمینه های قابل تغییر را ایجاد کنید:

    شخص ضبط عمومینام مورد نیاز رشته نام مورد نیاز>; 

    در حالی که سوابق قابل تغییر است ، آنها در درجه اول برای پشتیبانی از مدل های داده تغییر ناپذیر در نظر گرفته شده اند. نوع ضبط ویژگی های زیر را ارائه می دهد:

    • نحو مختصر برای ایجاد یک نوع مرجع با خصوصیات تغییر ناپذیر
    • رفتار مفید برای یک نوع مرجع داده محور:
      • برابری ارزش
      • نحو مختصر برای جهش غیر مخرب
      • قالب بندی داخلی برای نمایش

      شما می توانید از انواع ساختار برای طراحی انواع داده محور استفاده کنید که برابری ارزش و رفتاری کمی یا بدون آن را ارائه می دهند. اما برای مدلهای داده نسبتاً بزرگ ، انواع ساختار برخی از مضرات را دارند:

      • آنها از وراثت پشتیبانی نمی کنند.
      • آنها در تعیین برابری ارزش کارایی کمتری دارند. برای انواع ارزش ، روش ValueType. equals از بازتاب برای یافتن همه زمینه ها استفاده می کند. برای سوابق ، کامپایلر روش برابر را تولید می کند. در عمل ، اجرای برابری ارزش در سوابق به طور قابل اندازه گیری سریعتر است.
      • آنها در برخی از سناریوها از حافظه بیشتری استفاده می کنند ، زیرا در هر نمونه نسخه کاملی از تمام داده ها وجود دارد. انواع ضبط انواع مرجع هستند ، بنابراین یک نمونه ضبط فقط شامل مرجع داده ها است.

      نحو مثبت برای تعریف خاصیت

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

      شخص ضبط عمومی (رشته اول نام ، نام خانوادگی رشته) ؛عمومی استاتیک عمومی اصلی ()> 

      هنگامی که از نحو موقعیتی برای تعریف خاصیت استفاده می کنید ، کامپایلر ایجاد می کند:

      • یک خاصیت برنامه ریزی شده توسط خودکار فقط برای هر پارامتر موقعیت ارائه شده در اعلامیه ضبط. یک ویژگی فقط فقط می تواند در سازنده یا با استفاده از یک ویژگی اولیه خاص تنظیم شود.
      • سازنده اصلی که پارامترهای آن با پارامترهای موقعیتی در اعلامیه ضبط مطابقت دارد.
      • یک روش ساختارشکنی با یک پارامتر OUT برای هر پارامتر موقعیت ارائه شده در اعلامیه ضبط.

      برای اطلاعات بیشتر ، به نحو موقعیتی در مقاله مرجع C# زبان در مورد سوابق مراجعه کنید.

      تغییر ناپذیری

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

      تغییر ناپذیری می تواند مفید باشد وقتی می خواهید یک نوع داده محور از نظر موضوع یا کد هش در یک جدول هش یکسان باقی بماند. این می تواند از اشکالات اتفاق بیفتد که با مراجعه به یک روش آرگومان را منتقل می کنید ، و روش به طور غیر منتظره مقدار آرگومان را تغییر می دهد.

      ویژگی های منحصر به فرد برای انواع ضبط شده توسط روشهای سنتز کامپایلر اجرا می شوند و هیچ یک از این روشها با اصلاح وضعیت شیء ، تغییر ناپذیری را به خطر نمی اندازند.

      برابری ارزش

      برابری ارزش به این معنی است که اگر انواع مطابقت داشته باشند و تمام مقادیر خاصیت و میدانی با هم مطابقت داشته باشند ، دو متغیر از یک نوع رکورد برابر هستند. برای سایر انواع مرجع ، برابری به معنای هویت است. یعنی اگر به همان شیء مراجعه کنند ، دو متغیر از یک نوع مرجع برابر هستند.

      مثال زیر برابری ارزش انواع رکورد را نشان می دهد:

      شخص ضبط عمومی (نام رشته اول ، نامگذاری رشته ، رشته [] [] phonenumbers) ؛عمومی استاتیک عمومی اصلی ()

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

      برای اطلاعات بیشتر ، به برابری ارزش در مقاله مرجع C# زبان در مورد سوابق مراجعه کنید.

      جهش غیر مخرب

      اگر نیاز به جهش خواص غیرقابل تغییر در یک نمونه ضبط دارید ، می توانید برای دستیابی به جهش غیر مخرب از A با عبارت استفاده کنید. A با بیان یک نمونه رکورد جدید را ایجاد می کند که یک نسخه از یک نمونه رکورد موجود است ، با خصوصیات و زمینه های مشخص شده اصلاح شده است. شما از نحو اولیه شیء برای مشخص کردن مقادیر تغییر یافته استفاده می کنید ، همانطور که در مثال زیر نشان داده شده است:

      شخص ضبط عمومی (نام رشته اول ، نام خانوادگی رشته)>عمومی استاتیک عمومی اصلی ()؛Console. Writeline (person1) ؛// خروجی: شخصشخص شخص 2 = شخص 1 با؛Console. Writeline (person2) ؛// خروجی: شخصConsole. Writeline (person1 == person2) ؛// خروجی: شخص کاذب 2 = person1 با؛Console. Writeline (person2) ؛// خروجی: شخصConsole. Writeline (person1 == person2) ؛// خروجی: شخص کاذب 2 = person1 با<>; Console.WriteLine(person1 == person2); // output: True> 

      برای اطلاعات بیشتر ، به جهش غیر مخرب در مقاله مرجع زبان C# در مورد سوابق مراجعه کنید.

      قالب بندی داخلی برای نمایش

      انواع ضبط دارای یک روش toString تولید کامپایلر است که نام و مقادیر خصوصیات و زمینه های عمومی را نشان می دهد. روش toString رشته ای از قالب زیر را برمی گرداند:

      برای انواع مرجع ، نام نوع شیء که ویژگی به آن اشاره دارد به جای مقدار خاصیت نمایش داده می شود. در مثال زیر ، آرایه یک نوع مرجع است ، بنابراین System. String [] به جای مقادیر واقعی عنصر آرایه نمایش داده می شود:

      شخص

      برای اطلاعات بیشتر ، به قالب بندی داخلی در مقاله مرجع C# زبان در مورد سوابق مراجعه کنید.

      وراثت

      یک رکورد می تواند از یک رکورد دیگر به ارث ببرد. با این حال ، یک رکورد نمی تواند از یک کلاس به ارث ببرد ، و یک کلاس نمی تواند از یک رکورد به ارث ببرد.

      مثال زیر وراثت را با نحو خاصیت موقعیت نشان می دهد:

      شخص ضبط انتزاعی عمومی (نام رشته اول ، نام خانوادگی رشته) ؛معلم ضبط عمومی (نام رشته اول ، نامگذاری رشته ، درجه int): شخص (نام اول ، نام خانوادگی) ؛عمومی استاتیک عمومی اصلی ()> 

      برای دو متغیر رکورد برابر است ، نوع زمان اجرا باید برابر باشد. انواع متغیرهای حاوی ممکن است متفاوت باشد. این در مثال کد زیر نشان داده شده است:

      شخص ضبط انتزاعی عمومی (نام رشته اول ، نام خانوادگی رشته) ؛معلم ضبط عمومی (نام رشته اول ، نامگذاری رشته ، درجه int): شخص (نام اول ، نام خانوادگی) ؛دانش آموز ضبط عمومی (رشته اول ، نام رشته ، نام خانوادگی ، درجه int): شخص (نام اول ، نام خانوادگی) ؛عمومی استاتیک عمومی اصلی ()

      در مثال ، همه موارد دارای یک ویژگی یکسان و مقادیر خاصیت هستند. اما دانش آموز == معلم نادرست باز می گردد اگرچه هر دو متغیرهای نوع شخص هستند. و دانش آموز == student2 درست باز می گردد اگرچه یکی متغیر شخص و دیگری متغیر دانشجویی است.

      تمام خصوصیات عمومی و زمینه های هر دو نوع مشتق و پایه در خروجی toString گنجانده شده است ، همانطور که در مثال زیر نشان داده شده است:

      شخص ضبط انتزاعی عمومی (نام رشته اول ، نام خانوادگی رشته) ؛معلم ضبط عمومی (نام رشته اول ، نامگذاری رشته ، درجه int): شخص (نام اول ، نام خانوادگی) ؛دانش آموز ضبط عمومی (رشته اول ، نام رشته ، نام خانوادگی ، درجه int): شخص (نام اول ، نام خانوادگی) ؛عمومی استاتیک عمومی اصلی ()> 

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

      فقط تنظیم کننده ها

      فقط تنظیم کننده های INIT برای شروع اعضای یک شیء ، نحو مداوم را ارائه می دهند. اولیه سازهای خاصیت روشن می کنند که کدام ارزش را تعیین می کند که کدام خاصیت را تعیین می کند. نکته منفی این است که این خصوصیات باید قابل تنظیم باشند. با شروع C# 9. 0 ، می توانید به جای دسترسی به ویژگی ها و شاخص ها ، دسترسی های اولیه را ایجاد کنید. تماس گیرندگان می توانند از نحو اولیه سازنده خاصیت برای تنظیم این مقادیر در عبارات ایجاد استفاده کنند ، اما پس از اتمام ساخت و ساز ، این خصوصیات به صورت خوانده شده است. فقط تنظیم کننده ها پنجره ای برای تغییر حالت ارائه می دهند. با پایان یافتن مرحله ساخت ، آن پنجره بسته می شود. مرحله ساخت و ساز به طور موثری پس از تمام اولیه شدن ، از جمله ابتدای املاک و بیان با بیان به پایان می رسد.

      شما می توانید فقط در هر نوع که می نویسید ، فقط تنظیم کننده های اولیه را اعلام کنید. به عنوان مثال ، ساختار زیر یک ساختار مشاهده آب و هوا را تعریف می کند:

      ساختار عمومی WeatherObservationدما در اعشاری عمومیفشار عمومی اعشاری عمومیpublic override string ToString() => $"At on : " + $"Temp = , with pressure";> 

      تماس گیرندگان می توانند برای تنظیم مقادیر از نحو Propertisticizer استفاده کنند ، در حالی که هنوز هم ناپذیری را حفظ می کنند:

      var now = WeatherObservation جدید; 

      تلاش برای تغییر مشاهده پس از اولیه سازی منجر به خطای کامپایلر می شود:

      // خطا! CS8852. اکنون. temperatureincelsius = 18 ؛ 

      فقط تنظیم کننده های اولیه می توانند برای تنظیم خصوصیات کلاس پایه از کلاسهای مشتق مفید باشند. آنها همچنین می توانند خواص مشتق شده را از طریق یاران در یک کلاس پایه تنظیم کنند. سوابق موقعیتی با استفاده از فقط تنظیم کننده ها ، خواص را اعلام می کنند. از آن تنظیم کننده ها در بیان استفاده می شود. شما می توانید فقط برای هر کلاس ، ساختار یا ضبط شده تعریف کنید.

      برای اطلاعات بیشتر ، به Init (C# مرجع) مراجعه کنید.

      بیانیه های سطح بالا

      بیانیه های سطح بالا مراسم غیر ضروری را از بسیاری از برنامه ها حذف می کند."سلام جهان!" را در نظر بگیرید. برنامه:

      با استفاده از سیستم؛فضای نام HelloWorld>> 

      فقط یک خط کد وجود دارد که هر کاری را انجام می دهد. با دستورات سطح بالا، می توانید تمام دیگ بخار را با دستورالعمل استفاده و خط واحدی که کار را انجام می دهد جایگزین کنید:

      با استفاده از سیستم؛Console. WriteLine ("Hello World!"); 

      اگر می خواهید یک برنامه تک خطی داشته باشید، می توانید دستورالعمل استفاده را حذف کنید و از نام نوع کاملاً واجد شرایط استفاده کنید:

      System. Console. WriteLine("Hello World!"); 

      فقط یک فایل در برنامه شما ممکن است از عبارات سطح بالا استفاده کند. اگر کامپایلر عبارات سطح بالایی را در چندین فایل منبع پیدا کند، خطا است. همچنین اگر عبارات سطح بالا را با روش نقطه ورود برنامه اعلام شده ترکیب کنید، معمولاً یک روش اصلی، یک خطا است. به یک معنا، می توانید فکر کنید که یک فایل حاوی عباراتی است که معمولاً در متد Main یک کلاس Program وجود دارد.

      یکی از رایج ترین کاربردهای این ویژگی ایجاد مواد آموزشی است. توسعه دهندگان مبتدی سی شارپ می توانند "Hello World!" را بنویسند. در یک یا دو خط کدهیچ یک از مراسم اضافی لازم نیست. با این حال، توسعه دهندگان باتجربه کاربردهای زیادی برای این ویژگی نیز پیدا خواهند کرد. عبارات سطح بالا تجربه ای شبیه به اسکریپت را برای آزمایش مشابه آنچه که نوت بوک های Jupyter ارائه می دهند، امکان پذیر می کند. بیانیه های سطح بالا برای برنامه ها و برنامه های کاربردی کنسول کوچک عالی هستند. Azure Functions یک مورد استفاده ایده آل برای عبارات سطح بالا است.

      مهمتر از همه، عبارات سطح بالا دامنه یا پیچیدگی برنامه شما را محدود نمی کند. این عبارات می توانند به هر کلاس دات نت دسترسی داشته باشند یا از آنها استفاده کنند. آنها همچنین استفاده شما از آرگومان های خط فرمان یا مقادیر بازگشتی را محدود نمی کنند. عبارات سطح بالا می توانند به آرایه ای از رشته ها به نام args دسترسی داشته باشند. اگر عبارات سطح بالا یک مقدار صحیح را برگردانند، آن مقدار به کد برگشتی عدد صحیح از یک متد Main سنتز شده تبدیل می شود. عبارات سطح بالا ممکن است حاوی عبارات ناهمگام باشند. در آن صورت، نقطه ورودی سنتز شده یک Task یا Task را برمی گرداند.

      برای اطلاعات بیشتر، عبارات سطح بالا را در راهنمای برنامه نویسی سی شارپ ببینید.

      پیشرفت های تطبیق الگوی

      C# 9 شامل بهبودهای تطبیق الگوی جدید است:

      • الگوهای نوع منطبق با یک شی مطابق با یک نوع خاص است
      • الگوهای پرانتز شده بر تقدم ترکیب الگوها اعمال یا تأکید می کنند
      • ربط و الگوها نیاز به تطابق هر دو الگو دارند
      • تفکیک یا الگوها برای مطابقت با هر یک از الگوها نیاز دارند
      • الگوهای نفی شده مستلزم عدم تطابق الگو هستند
      • الگوهای رابطه ای نیاز دارند که ورودی کمتر از ، بیشتر از ، کمتر از یا مساوی یا بیشتر از یا مساوی با ثابت باشد.

      این الگوهای نحو را برای الگوهای غنی می کنند. این مثالها را در نظر بگیرید:

      public static bool IsLetter(this char c) => c is>= 'a' و = 'a' و

      با پرانتزهای اختیاری برای روشن شدن این امر و دارای برتری بالاتری از یا:

      public static bool IsLetterOrSeparator(this char c) => c is (>= 'a' و = 'a' و

      یکی از متداول ترین کاربردها ، نحو جدید برای بررسی تهی است:

      if (e تهی نیست)

      هر یک از این الگوهای در هر زمینه ای که الگوهای مجاز باشد قابل استفاده است: عبارات الگوی ، عبارات سوئیچ ، الگوهای تو در تو و الگوی برچسب پرونده یک سوئیچ است.

      برای اطلاعات بیشتر ، به بخش های رابطه و الگوهای منطقی مقاله الگوها مراجعه کنید.

      عملکرد و بین المللی

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

      عدد صحیح با اندازه بومی ، nint و nuint ، انواع عدد صحیح هستند. آنها توسط انواع اساسی System. intptr و System. uintptr بیان شده اند. این کامپایلر تبدیل و عملیات اضافی را برای این نوع به عنوان INT های بومی تنظیم می کند. عدد صحیح با اندازه بومی خواص MaxValue یا minvalue را تعریف می کند. این مقادیر را نمی توان به عنوان ثابت زمان کامپایل بیان کرد زیرا به اندازه بومی یک عدد صحیح در دستگاه هدف بستگی دارد. این مقادیر در زمان اجرا به صورت خواندن هستند. شما می توانید از مقادیر ثابت برای nint در محدوده [int. minvalue .. int. maxValue] استفاده کنید. شما می توانید از مقادیر ثابت برای nuint در محدوده [uint. minvalue .. uint. maxValue] استفاده کنید. کامپایلر با استفاده از انواع System. int32 و System. uint32 تاشو ثابت را برای همه اپراتورهای باینری و باینری انجام می دهد. اگر نتیجه در 32 بیت مناسب نباشد ، این عملیات در زمان اجرا اجرا می شود و ثابت محسوب نمی شود. عدد صحیح با اندازه بومی می تواند عملکرد را در سناریوهایی که در آن از ریاضی عدد صحیح استفاده می شود ، افزایش دهد و نیاز به سریعترین عملکرد ممکن داشته باشد. برای اطلاعات بیشتر ، به انواع NINT و Nuint مراجعه کنید.

      نشانگرهای عملکردی یک نحو آسان برای دسترسی به IL Opcodes LDFTN و CALLI فراهم می کنند. می توانید نشانگرهای عملکردی را با استفاده از نماینده جدید* نحو اعلام کنید. یک نماینده* نوع اشاره گر است. با استفاده از نماینده* از Calli ، بر خلاف نماینده ای که از CallVirt در روش Invoke () استفاده می کند ، استفاده می کند. از نظر نحوی ، دعوت ها یکسان هستند. فراخوان نشانگر عملکرد از کنوانسیون فراخوانی مدیریت شده استفاده می کند. شما کلمه کلیدی بدون کنترل را پس از نماینده* نحو اضافه می کنید تا اعلام کنید که می خواهید کنوانسیون فراخوانی بدون کنترل را بخواهید. سایر کنوانسیون های فراخوان را می توان با استفاده از ویژگی های اعلامیه* نماینده* مشخص کرد. برای اطلاعات بیشتر ، به کد ناامن و انواع اشاره گر مراجعه کنید.

      سرانجام ، می توانید System. Runtime. compilerservice. skiplocalsinitattribute را اضافه کنید تا به کامپایلر دستور دهد که پرچم محلی را منتشر نکند. این پرچم به CLR دستور می دهد تا تمام متغیرهای محلی را صفر کند. پرچم LocalSinit از 1. 0 رفتار پیش فرض C# بوده است. با این حال ، شروع صفر اضافی ممکن است تأثیر عملکرد قابل اندازه گیری در برخی از سناریوها داشته باشد. به طور خاص ، هنگامی که از StackAlloc استفاده می کنید. در این موارد ، می توانید skiplocalsinitattribute را اضافه کنید. ممکن است آن را به یک روش یا خاصیت واحد یا به یک کلاس ، ساختار ، رابط یا حتی یک ماژول اضافه کنید. این ویژگی بر روشهای انتزاعی تأثیر نمی گذارد. این کد تولید شده برای اجرای را تحت تأثیر قرار می دهد. برای اطلاعات بیشتر ، به ویژگی SkiplocalSinit مراجعه کنید.

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

      ویژگی های متناسب و پایان

      بسیاری از ویژگی های دیگر به شما در نوشتن کارآمدتر کد کمک می کنند. در C# 9. 0 ، وقتی نوع شیء ایجاد شده از قبل شناخته شده است ، می توانید نوع را در یک عبارت جدید حذف کنید. متداول ترین استفاده در اعلامیه های میدانی است:

      لیست خصوصی _observations = جدید () ؛ 

      Target Typed New همچنین می تواند در صورت نیاز به ایجاد یک شی جدید برای عبور به عنوان یک آرگومان به یک روش استفاده شود. یک روش پیش بینی () را با امضای زیر در نظر بگیرید:

      پیش بینی عمومی Weatherforecast (DateTime Forecastdate ، گزینه های WeatherforecastOptions) 

      شما می توانید آن را به شرح زیر بنامند:

      var forecast = station. forecastfor (dateTime. Now. Adddays (2) ، جدید ()) ؛ 

      یکی دیگر از کاربردهای خوب این ویژگی ، ترکیب آن با ویژگی های INIT فقط برای اولیه کردن یک شیء جدید است:

      ایستگاه Weatherstation = جدید (); 

      شما می توانید نمونه ای را که توسط سازنده پیش فرض با استفاده از یک بازگشت جدید () ایجاد شده است ، برگردانید. بیانیه.

      یک ویژگی مشابه ، وضوح نوع هدف عبارات شرطی را بهبود می بخشد. با این تغییر ، دو عبارت نیازی به تبدیل ضمنی از یک به دیگری ندارند ، اما ممکن است هر دو تبدیل ضمنی به یک نوع هدف داشته باشند. احتمالاً متوجه این تغییر نخواهید شد. آنچه متوجه خواهید شد این است که برخی از عبارات مشروط که قبلاً به بازیگران نیاز داشتند یا اکنون کامپایل نمی کردند فقط کار می کنند.

      با شروع C# 9. 0 ، می توانید اصلاح کننده استاتیک را به عبارات Lambda یا روش های ناشناس اضافه کنید. عبارات لامبدا استاتیک مشابه عملکردهای محلی استاتیک است: یک لامبدا استاتیک یا روش ناشناس نمی تواند متغیرهای محلی یا حالت نمونه را ضبط کند. اصلاح کننده استاتیک مانع از گرفتن تصادفی متغیرهای دیگر می شود.

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

      علاوه بر این ، حلقه foreach یک روش پسوند را به رسمیت می شناسد و از آن استفاده می کند که در غیر این صورت الگوی پیشانی را برآورده می کند. این تغییر به این معنی است که foreach با سایر سازه های مبتنی بر الگوی مانند الگوی ANYNC و ساختارشکنی مبتنی بر الگوی سازگار است. در عمل ، این تغییر به این معنی است که می توانید پشتیبانی Foreach را به هر نوع اضافه کنید. شما باید هنگام شمارش یک شیء در طراحی شما ، استفاده از آن را محدود کنید.

      در مرحله بعد ، می توانید به عنوان پارامترهای عبارات Lambda از Despars استفاده کنید. این راحتی شما را قادر می سازد تا از نامگذاری استدلال خودداری کنید و کامپایلر ممکن است از استفاده از آن خودداری کند. شما از _ برای هر استدلال استفاده می کنید. برای اطلاعات بیشتر ، به پارامترهای ورودی یک بخش بیان لامبدا از مقاله عبارات Lambda مراجعه کنید.

      سرانجام ، اکنون می توانید ویژگی هایی را برای عملکردهای محلی اعمال کنید. به عنوان مثال ، می توانید حاشیه نویسی ویژگی های قابل تهی را در توابع محلی اعمال کنید.

      پشتیبانی از ژنراتورهای کد

      دو ویژگی نهایی از ژنراتور کد C# پشتیبانی می کنند. C# ژنراتورهای کد مؤلفه ای هستند که می توانید بنویسید که شبیه به آنالایزر Roslyn یا Fix است. تفاوت این است که ژنراتورهای کد کد را تجزیه و تحلیل کرده و پرونده های کد منبع جدید را به عنوان بخشی از فرآیند تدوین می نویسند. یک ژنراتور کد معمولی کد را برای ویژگی ها یا سایر کنوانسیون ها جستجو می کند.

      یک ژنراتور کد با استفاده از API های آنالیز Roslyn ، ویژگی ها یا سایر عناصر کد را می خواند. از آن اطلاعات ، کد جدیدی را به تدوین اضافه می کند. ژنراتورهای منبع فقط می توانند کد را اضافه کنند. آنها مجاز به اصلاح هر کد موجود در این مجموعه نیستند.

      دو ویژگی اضافه شده برای ژنراتورهای کد ، پسوند به نحو با روش جزئی و اولیه سازی ماژول هستند. اول ، تغییرات در روش های جزئی. قبل از C# 9. 0 ، روش های جزئی خصوصی هستند اما نمی توانند یک اصلاح کننده دسترسی را مشخص کنند ، بازگشت باطل داشته باشند و نمی توانند پارامترهایی داشته باشند. این محدودیت ها به این معنی است که در صورت عدم اجرای روش ، کامپایلر تمام تماس ها را به روش جزئی حذف می کند. C# 9. 0 این محدودیت ها را حذف می کند ، اما مستلزم آن است که اعلامیه های روش جزئی اجرای آن را داشته باشند. ژنراتورهای کد می توانند این اجرای را ارائه دهند. برای جلوگیری از معرفی تغییر شکستن ، کامپایلر هر روش جزئی را بدون اصلاح کننده دسترسی در نظر می گیرد تا قوانین قدیمی را رعایت کند. اگر روش جزئی شامل اصلاح کننده دسترسی خصوصی باشد ، قوانین جدید آن روش جزئی را حاکم می کنند. برای اطلاعات بیشتر ، به روش جزئی (مرجع C#) مراجعه کنید.

      دومین ویژگی جدید برای ژنراتورهای کد ، اولیه سازی ماژول است. اولیه سازهای ماژول روشهایی هستند که دارای ویژگی ماژولیتیالایزر هستند که به آنها وصل شده است. این روشها قبل از هرگونه دسترسی به زمینه یا فراخوانی روش در کل ماژول توسط زمان اجرا فراخوانی می شوند. یک روش اولیه ساز ماژول:

      • باید استاتیک باشد
      • باید بدون پارامتر باشد
      • باید باطل برگردد
      • نباید یک روش عمومی باشد
      • نباید در یک کلاس عمومی باشد
      • باید از ماژول حاوی در دسترس باشد

      این نقطه آخر گلوله به طور مؤثر به معنای روش و کلاس حاوی آن باید داخلی یا عمومی باشد. این روش نمی تواند یک عملکرد محلی باشد. برای اطلاعات بیشتر ، به ویژگی ModuleInitializer مراجعه کنید.

کتاب آموزش بورس...
ما را در سایت کتاب آموزش بورس دنبال می کنید

برچسب : نویسنده : محمود استادمحمد بازدید : 27 تاريخ : پنجشنبه 19 مرداد 1402 ساعت: 18:58