Yang baru di C# 10

C# 10 menambahkan fitur dan peningkatan berikut ke bahasa C#:

C# 10 didukung di .NET 6. Untuk informasi selengkapnya lihat pembuatan versi bahasa C#.

Anda dapat mengunduh SDK .NET 6 terbaru dari halaman unduhan .NET. Anda juga dapat mengunduh Visual Studio 2022, yang mencakup .NET 6 SDK.

Catatan

Kami tertarik dengan umpan balik Anda tentang fitur-fitur ini. Jika Anda menemukan masalah dengan salah satu fitur baru ini, buat masalah baru di repositori dotnet/roslyn.

Struktur rekaman

Anda bisa mendeklarasikan rekaman jenis nilai menggunakan deklarasi record struct atau readonly record struct. Anda sekarang dapat mengklarifikasi bahwa adalah record jenis referensi dengan deklarasi record class.

Penyempurnaan jenis struktur

C# 10 memperkenalkan peningkatan berikut yang terkait dengan jenis struktur:

  • Anda dapat mendeklarasikan konstruktor tanpa parameter instans dalam jenis struktur dan menginisialisasi bidang instans atau properti pada deklarasinya. Untuk informasi lebih lanjut, lihat bagian Inisialisasi struktur dan nilai default dari artikel Jenis struktur.
  • Operand kiri with dari ekspresi dapat berupa jenis struktur apa pun atau jenis anonim (referensi).

Penangan string terinterpolasi

Anda dapat membuat jenis yang menyusun string yang dihasilkan dari ekspresi string terinterpolasi. Pustaka .NET menggunakan fitur ini di banyak API. Anda dapat membuatnya dengan mengikuti tutorial ini.

Direktif penggunaan global

Anda dapat menambahkan pengubah global ke apa pun menggunakan direktif untuk menginstruksikan pengkompilasi bahwa direktif berlaku untuk semua file sumber dalam kompilasi. Ini biasanya semua file sumber dalam proyek.

Deklarasi namespace bercakupan file

Anda dapat menggunakan bentuk namespace baru deklarasi untuk menyatakan bahwa semua deklarasi yang mengikuti adalah anggota namespace yang dideklarasikan:

namespace MyNamespace;

Sintaks baru ini menyimpan ruang horizontal dan vertikal untuk deklarasi namespace.

Pola properti yang diperluas

Dimulai dengan C# 10, Anda dapat mereferensikan properti atau bidang berlapis dalam pola properti. Misalnya, pola formulir

{ Prop1.Prop2: pattern }

berlaku di C# 10 dan yang lebih baru dan setara dengan

{ Prop1: { Prop2: pattern } }

berlaku di C # 8.0 dan yang lebih baru.

Untuk informasi selengkapnya, lihat catatan proposal fitur Pola properti yang diperluas. Untuk informasi selengkapnya, lihat bagian Pola properti dari artikel Pola.

Peningkatan ekspresi Lambda

C# 10 mencakup banyak peningkatan cara ekspresi lambda ditangani:

  • Ekspresi Lambda mungkin memiliki jenis alami, di mana pengkompilasi dapat menyimpulkan jenis delegasi dari ekspresi lambda atau grup metode.
  • Ekspresi Lambda dapat mendeklarasikan jenis pengembalian ketika pengkompilasi tidak dapat menyimpulkannya.
  • Atribut dapat diterapkan ke ekspresi lambda.

Fitur-fitur ini membuat ekspresi lambda lebih mirip dengan metode dan fungsi lokal. Mereka mempermudah penggunaan ekspresi lambda tanpa mendeklarasikan variabel jenis delegasi, dan mereka bekerja lebih mulus dengan api ASP.NET Core Minimal baru.

String terinterpolasi konstanta

Dalam C# 10, string const dapat diinisialisasi menggunakan interpolasi string jika semua tempat penampung adalah string konstan. Interpolasi string dapat membuat string konstanta yang lebih mudah dibaca saat Anda membangun string konstanta yang digunakan dalam aplikasi Anda. Ekspresi tempat penampung tidak dapat berupa konstanta numerik karena konstanta tersebut dikonversi ke string pada durasi. Budaya saat ini dapat memengaruhi representasi string mereka. Pelajari selengkapnya dalam referensi bahasa pada const ekspresi.

Jenis catatan dapat menyegel ToString

Di C# 10, Anda dapat menambahkan pengubah sealed saat anda mengambil alih ToString dalam jenis rekaman. Menyegel ToString metode mencegah pengkompilasi mensintesis ToString metode untuk setiap jenis rekaman turunan. sealedToString memastikan semua jenis rekaman turunan menggunakan ToString metode yang ditentukan dalam jenis catatan dasar umum. Anda bisa mempelajari selengkapnya tentang fitur ini di artikel tentang rekaman.

Penugasan dan deklarasi dalam dekonstruksi yang sama

Perubahan ini menghapus pembatasan dari versi C#yang lebih lama. Sebelumnya, dekonstruksi dapat menetapkan semua nilai ke variabel yang ada, atau menginisialisasi variabel yang baru dideklarasikan:

// Initialization:
(int x, int y) = point;

// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;

C# 10 menghapus pembatasan ini:

int x = 0;
(x, int y) = point;

Penugasan pasti yang ditingkatkan

Sebelum C# 10, ada banyak skenario di mana penugasan yang pasti dan analisis status null menghasilkan peringatan yang positif palsu. Ini umumnya melibatkan perbandingan dengan konstanta boolean, mengakses variabel hanya dalam pernyataan true atau false dalam pernyataan if, dan ekspresi coalescing null. Contoh-contoh ini menghasilkan peringatan dalam versi C#sebelumnya, tetapi tidak di C# 10:

string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{
   representation = obj.ToString(); // undesired error
}

Dampak utama dari peningkatan ini adalah bahwa peringatan untuk penugasan yang pasti dan analisis status null lebih akurat.

Izinkan atribut AsyncMethodBuilder pada metode

Di C# 10 dan yang lebih baru, Anda dapat menentukan penyusun metode asinkron yang berbeda untuk satu metode, selain menentukan jenis penyusun metode untuk semua metode yang mengembalikan jenis seperti tugas tertentu. Penyusun metode asinkron kustom memungkinkan skenario penyetelan performa tingkat lanjut di mana metode tertentu dapat memperoleh manfaat dari penyusun kustom.

Untuk mempelajari lebih lanjut, lihat bagian di artikel AsyncMethodBuilder tentang atribut yang dibaca oleh pengkompilasi.

Diagnostik atribut CallerArgumentExpression

Anda dapat menggunakan System.Runtime.CompilerServices.CallerArgumentExpressionAttribute untuk menentukan parameter yang diganti pengkompilasi dengan representasi teks argumen lain. Fitur ini memungkinkan pustaka untuk membuat diagnostik yang lebih spesifik. Kode berikut menguji kondisi. Jika kondisinya salah, pesan pengecualian berisi representasi teks dari argumen yang diteruskan ke condition:

public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new InvalidOperationException($"Argument failed validation: <{message}>");
    }
}

Anda dapat mempelajari selengkapnya tentang fitur ini di artikel tentang atribut informasi Penelepon di bagian referensi bahasa.

Pragma #line yang ditingkatkan

C# 10 mendukung format baru untuk pragma #line. Anda mungkin tidak akan menggunakan format baru, tetapi Anda akan melihat efeknya. Penyempurnaan memungkinkan output yang lebih halus dalam bahasa khusus domain (DLL) seperti Razor. Mesin Razor menggunakan peningkatan ini untuk meningkatkan pengalaman debugging. Anda akan menemukan debugger dapat menyoroti sumber Razor Anda dengan lebih akurat. Untuk mempelajari selengkapnya tentang sintaks baru, lihat artikel tentang Direktif pra-prosesor dalam referensi bahasa. Anda juga dapat membaca spesifikasi fitur untuk contoh berbasis Razor.