Apa yang baru di C# 12

C# 12 menyertakan fitur baru berikut. Anda dapat mencoba fitur-fitur ini menggunakan versi Visual Studio 2022 terbaru atau .NET 8 SDK.

C# 12 didukung pada .NET 8. Untuk informasi selengkapnya lihat pembuatan versi bahasa C#.

Anda dapat mengunduh .NET 8 SDK terbaru dari halaman unduhan .NET. Anda juga dapat mengunduh Visual Studio 2022, yang mencakup .NET 8 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.

Konstruktor utama

Anda sekarang dapat membuat konstruktor utama di apa pun class dan struct. Konstruktor utama tidak lagi dibatasi untuk record jenis. Parameter konstruktor utama berada dalam cakupan untuk seluruh isi kelas. Untuk memastikan bahwa semua parameter konstruktor utama pasti ditetapkan, semua konstruktor yang dinyatakan secara eksplisit harus memanggil konstruktor utama menggunakan this() sintaks. Menambahkan konstruktor utama ke class mencegah pengkompilasi mendeklarasikan konstruktor tanpa parameter implisit. structDalam , konstruktor tanpa parameter implisit menginisialisasi semua bidang, termasuk parameter konstruktor utama ke pola 0-bit.

Pengkompilasi menghasilkan properti publik untuk parameter konstruktor utama hanya dalam record jenis, baik record class atau record struct jenis. Kelas dan struktur nonrekord mungkin tidak selalu menginginkan perilaku ini untuk parameter konstruktor utama.

Anda dapat mempelajari lebih lanjut tentang konstruktor utama dalam tutorial untuk menjelajahi konstruktor utama dan dalam artikel tentang konstruktor instans.

Ekspresi koleksi

Ekspresi koleksi memperkenalkan sintaks terse baru untuk membuat nilai koleksi umum. Menginlin koleksi lain ke dalam nilai-nilai ini dimungkinkan menggunakan operator ..spread .

Beberapa jenis seperti koleksi dapat dibuat tanpa memerlukan dukungan BCL eksternal. Jenis-jenisnya adalah:

Contoh berikut menunjukkan penggunaan ekspresi koleksi:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];

// Create a list:
List<string> b = ["one", "two", "three"];

// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];

// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

Operator spread, .. dalam ekspresi koleksi mengganti argumennya dengan elemen dari koleksi tersebut. Argumen harus berupa jenis koleksi. Contoh berikut menunjukkan cara kerja operator spread:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
    Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

Operan operator spread adalah ekspresi yang dapat dijumlahkan. Operator spread mengevaluasi setiap elemen ekspresi enumerasi.

Anda dapat menggunakan ekspresi koleksi di mana saja Anda memerlukan kumpulan elemen. Mereka dapat menentukan nilai awal untuk koleksi atau diteruskan sebagai argumen ke metode yang mengambil jenis koleksi. Anda dapat mempelajari selengkapnya tentang ekspresi koleksi di artikel referensi bahasa pada ekspresi koleksi atau spesifikasi fitur.

Parameter ref readonly

C# menambahkan in parameter sebagai cara untuk meneruskan referensi baca-saja. in parameter memungkinkan variabel dan nilai, dan dapat digunakan tanpa anotasi pada argumen.

Penambahan parameter memungkinkan lebih banyak ref readonly kejelasan untuk API yang mungkin menggunakan ref parameter atau in parameter:

Untuk mempelajari selengkapnya tentang ref readonly parameter, lihat artikel tentang pengubah parameter dalam referensi bahasa, atau spesifikasi fitur parameter readonly ref.

Parameter lambda default

Anda sekarang dapat menentukan nilai default untuk parameter pada ekspresi lambda. Sintaks dan aturan sama dengan menambahkan nilai default untuk argumen ke metode atau fungsi lokal apa pun.

Anda dapat mempelajari selengkapnya tentang parameter default pada ekspresi lambda dalam artikel tentang ekspresi lambda.

Alias jenis apa pun

Anda dapat menggunakan direktif using alias untuk alias jenis apa pun, bukan hanya jenis bernama. Itu berarti Anda dapat membuat alias semantik untuk jenis tuple, jenis array, jenis pointer, atau jenis tidak aman lainnya. Untuk informasi selengkapnya, lihat spesifikasi fitur.

Array sebaris

Array sebaris digunakan oleh tim runtime dan penulis pustaka lainnya untuk meningkatkan performa di aplikasi Anda. Array sebaris memungkinkan pengembang untuk membuat array ukuran tetap dalam satu struct jenis. Struct dengan buffer sebaris harus memberikan karakteristik performa yang mirip dengan buffer ukuran tetap yang tidak aman. Anda mungkin tidak akan mendeklarasikan array sebaris Anda sendiri, tetapi Anda menggunakannya secara transparan saat diekspos sebagai System.Span<T> atau System.ReadOnlySpan<T> objek dari API runtime.

Array sebaris dinyatakan mirip dengan berikut inistruct:

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
    private int _element0;
}

Anda menggunakannya seperti array lainnya:

var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
    buffer[i] = i;
}

foreach (var i in buffer)
{
    Console.WriteLine(i);
}

Perbedaannya adalah bahwa pengkompilasi dapat memanfaatkan informasi yang diketahui tentang array sebaris. Anda mungkin mengonsumsi array sebaris seperti yang Anda lakukan pada array lainnya. Untuk informasi selengkapnya tentang cara mendeklarasikan array sebaris, lihat referensi bahasa pada struct jenis.

Atribut eksperimental

Jenis, metode, atau rakitan dapat ditandai dengan System.Diagnostics.CodeAnalysis.ExperimentalAttribute untuk menunjukkan fitur eksperimental. Pengompilasi mengeluarkan peringatan jika Anda mengakses metode atau mengetik yang dianotasi dengan ExperimentalAttribute. Semua jenis yang disertakan dalam rakitan yang ditandai dengan Experimental atribut bersifat eksperimental. Anda dapat membaca lebih lanjut di artikel tentang Atribut umum yang dibaca oleh pengkompilasi, atau spesifikasi fitur.

Interseptor

Peringatan

Pencegat adalah fitur eksperimental, tersedia dalam mode pratinjau dengan C# 12. Fitur ini mungkin dapat merusak perubahan atau penghapusan dalam rilis mendatang. Oleh karena itu, tidak disarankan untuk aplikasi produksi atau dirilis.

Untuk menggunakan pencegat, proyek pengguna harus menentukan properti <InterceptorsPreviewNamespaces>. Ini adalah daftar namespace yang diizinkan untuk berisi pencegat.

Misalnya: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

Pencegat adalah metode yang dapat secara deklaratif mengganti panggilan ke metode yang dapat dicegat dengan panggilan ke dirinya sendiri pada waktu kompilasi. Penggantian ini terjadi dengan meminta pencegat mendeklarasikan lokasi sumber panggilan yang disadapnya. Pencegat menyediakan fasilitas terbatas untuk mengubah semantik kode yang ada dengan menambahkan kode baru ke kompilasi, misalnya dalam generator sumber.

Anda menggunakan pencegat sebagai bagian dari generator sumber untuk memodifikasi, daripada menambahkan kode ke kompilasi sumber yang ada. Generator sumber menggantikan panggilan ke metode yang dapat dicegat dengan panggilan ke metode pencegat .

Jika Anda tertarik untuk bereksperimen dengan pencegat, Anda dapat mempelajari lebih lanjut dengan membaca spesifikasi fitur. Jika Anda menggunakan fitur ini, pastikan untuk tetap terkini dengan perubahan apa pun dalam spesifikasi fitur untuk fitur eksperimental ini. Jika fitur difinalisasi, kami akan menambahkan lebih banyak panduan di situs ini.

Lihat juga