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.
Konstruktor utama - Diperkenalkan di Visual Studio 2022 versi 17.6 Pratayang 2.
Ekspresi koleksi - Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 5.
Array Inline - Diperkenalkan di Visual Studio 2022 Versi 17.7 Pratinjau 3.
Parameter opsional dalam ekspresi lambda - Diperkenalkan di Visual Studio 2022 versi 17.5 Pratinjau 2.
ref readonly
parameter - Diperkenalkan di Visual Studio 2022 versi 17.8 Pratinjau 2.Alias jenis apa pun - Diperkenalkan pada Visual Studio 2022 versi 17.6 Pratinjau 3.
Atribut eksperimental - Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 3.
Interceptors - Fitur Pratinjau Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 3.
C# 12 didukung pada .NET 8. Untuk informasi selengkapnya, lihat 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.
Nota
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
Sekarang Anda dapat membuat konstruktor utama pada class
dan struct
mana pun. Konstruktor utama tidak lagi terbatas pada tipe record
. Parameter konstruktor utama tercakup untuk seluruh isi kelas. Untuk memastikan bahwa semua parameter konstruktor utama pasti ditetapkan, semua konstruktor yang dinyatakan secara eksplisit harus memanggil konstruktor utama menggunakan sintaks this()
. Menambahkan konstruktor utama ke class
mencegah pengkompilasi mendeklarasikan konstruktor tanpa parameter implisit. Dalam struct
, 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 jenis record
, baik jenis record class
atau record struct
. 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 singkat baru untuk membuat nilai koleksi umum. Menginlin koleksi lain ke dalam nilai-nilai ini dimungkinkan menggunakan elemen spread ..e
.
Beberapa tipe yang mirip koleksi dapat dibuat tanpa memerlukan dukungan BCL eksternal. Jenis-jenis ini adalah:
- Jenis array, seperti
int[]
. - System.Span<T> dan System.ReadOnlySpan<T>.
- Jenis yang mendukung penginisialisasi koleksi, seperti System.Collections.Generic.List<T>.
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];
Elemen penyebaran , ..e
dalam suatu ekspresi koleksi akan menambahkan semua elemen dari ekspresi tersebut. Argumen harus berupa tipe koleksi. Contoh berikut menunjukkan cara kerja elemen 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,
Elemen spread mengevaluasi setiap elemen ekspresi enumerasi. Setiap elemen disertakan dalam koleksi output.
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 tentang ekspresi koleksi atau spesifikasi fitur .
parameter ref readonly
C# menambahkan parameter in
sebagai cara untuk meneruskan referensi baca-saja.
in
parameter memungkinkan penggunaan kedua-duanya: variabel dan nilai, dan dapat digunakan tanpa anotasi pada argumen.
Penambahan parameter ref readonly
memungkinkan lebih banyak kejelasan untuk API yang mungkin menggunakan parameter ref
atau parameter in
:
- API yang dibuat sebelum
in
diperkenalkan mungkin menggunakanref
meskipun argumen tidak dimodifikasi. API tersebut dapat diperbarui denganref readonly
. Ini tidak akan menjadi perubahan yang signifikan bagi penelepon, sebagaimana jika parameterref
diubah menjadiin
. Contohnya adalah System.Runtime.InteropServices.Marshal.QueryInterface. - API yang mengambil parameter
in
, tetapi secara logis memerlukan variabel. Ekspresi nilai tidak berfungsi. Contohnya adalah System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - API yang menggunakan
ref
karena memerlukan variabel, tetapi jangan bermutasi variabel tersebut. Contohnya adalah System.Runtime.CompilerServices.Unsafe.IsNullRef.
Untuk mempelajari selengkapnya tentang parameter ref readonly
, lihat artikel tentang pengubah parameter dalam referensi bahasa, atau spesifikasi fitur parameter ref readonly .
Parameter standar lambda
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 alias using
untuk membuat alias untuk jenis apa pun, bukan hanya jenis yang diberi nama. 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 . Untuk contoh panduan pemfaktoran ulang, lihat Refaktor kode Anda menggunakan alias jenis apa pun di blog .NET.
Array dalam satu baris
Array sebaris digunakan oleh tim runtime dan pengembang pustaka lainnya untuk meningkatkan performa aplikasi Anda. Array sebaris memungkinkan pengembang untuk membuat array berukuran tetap dalam jenis struct
. 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 akan menggunakannya secara otomatis saat array tersebut diekspos sebagai objek System.Span<T> atau System.ReadOnlySpan<T> melalui API runtime.
Array sebaris dideklarasikan mirip dengan struct
berikut:
[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 menggunakan array sebaris seperti yang Anda lakukan pada array lainnya. Untuk informasi selengkapnya tentang cara mendeklarasikan array sebaris, lihat referensi bahasa tentang jenis-jenis struct
.
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 diannotasi dengan ExperimentalAttribute. Semua jenis yang disertakan dalam rakitan yang ditandai dengan atribut Experimental
bersifat eksperimental. Anda dapat membaca lebih lanjut di artikel tentang atribut umum yang dibaca oleh kompilator, atau spesifikasi fitur .
Pencegat
Peringatan
Pencegat adalah fitur eksperimental, tersedia dalam mode pratinjau dengan C# 12. Fitur ini mungkin akan mengalami perubahan yang dapat mengganggu atau dihapus dalam rilis mendatang. Oleh karena itu, tidak disarankan untuk aplikasi yang akan diproduksi atau dirilis.
Untuk menggunakan interseptor, proyek pengguna harus menentukan properti <InterceptorsPreviewNamespaces>
. Ini adalah daftar namespace yang diizinkan untuk mengandung 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 interceptor sebagai bagian dari pembangkit sumber untuk memodifikasi kode pada kompilasi sumber yang ada, daripada menambahkan kode baru. Generator sumber daya menggantikan panggilan ke metode yang bisa diintersepsi dengan panggilan ke metode penyadap .
Jika Anda tertarik untuk bereksperimen dengan interseptor, Anda dapat mempelajari lebih lanjut dengan membaca spesifikasi fitur dari. 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.