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 Pratinjau 2.
Ekspresi koleksi - Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 5.
Array sebaris - 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 di Visual Studio 2022 versi 17.6 Pratinjau 3.
Atribut eksperimental - Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 3.
Fitur Pratinjau Pencegat - Diperkenalkan di Visual Studio 2022 versi 17.7 Pratinjau 3.
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. struct
Dalam , 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:
- 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];
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:
- API yang dibuat sebelum
in
diperkenalkan mungkin digunakanref
meskipun argumen tidak dimodifikasi. API tersebut dapat diperbarui denganref readonly
. Ini tidak akan menjadi perubahan yang melanggar untuk penelepon, seperti halnyaref
jika parameter diubah menjadiin
. Contohnya System.Runtime.InteropServices.Marshal.QueryInterface. - API yang mengambil
in
parameter, tetapi secara logis memerlukan variabel. Ekspresi nilai tidak berfungsi. Contohnya System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - API yang digunakan
ref
karena memerlukan variabel, tetapi jangan bermutasi variabel tersebut. Contohnya System.Runtime.CompilerServices.Unsafe.IsNullRef.
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.