Yang baru di C# 11

Fitur berikut ditambahkan dalam C# 11:

C# 11 didukung pada .NET 7. Untuk informasi selengkapnya lihat pembuatan versi bahasa C#.

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

Atribut generik

Anda dapat mendeklarasikan kelas generik yang kelas dasarnya adalah System.Attribute. Fitur ini menyediakan sintaks yang lebih nyaman untuk atribut yang memerlukan parameter System.Type. Sebelumnya, Anda harus membuat atribut yang mengambil Type sebagai parameter konstruktornya:

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

Dan untuk menerapkan atribut, Anda akan menggunakan operator typeof:

[TypeAttribute(typeof(string))]
public string Method() => default;

Dengan menggunakan fitur baru ini, Anda dapat membuat atribut generik:

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Kemudian, tentukan parameter jenis untuk menggunakan atribut:

[GenericAttribute<string>()]
public string Method() => default;

Anda harus menyediakan semua parameter jenis saat menerapkan atribut. Dengan kata lain, jenis generik harus sepenuhnya dibangun. Dalam contoh di atas, tanda kurung kosong (( dan )) dapat dihilangkan karena atribut tidak memiliki argumen apa pun.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

Argumen jenis harus memenuhi batasan yang sama dengan operator typeof. Jenis yang memerlukan anotasi metadata tidak diizinkan. Misalnya, jenis berikut tidak diizinkan sebagai parameter jenis:

  • dynamic
  • string? (atau jenis referensi apa pun yang dapat diubah ke null)
  • (int X, int Y) (atau jenis tuple lain yang menggunakan sintaks tuple C#).

Jenis ini tidak diwakili secara langsung dalam metadata. Jenis tersebut menyertakan anotasi yang menggambarkan jenisnya. Dalam semua kasus, Anda dapat menggunakan jenis yang mendasarinya:

  • object untuk dynamic.
  • string bukan string?.
  • ValueTuple<int, int> bukan (int X, int Y).

Dukungan kecocokan umum

Ada beberapa fitur bahasa yang memungkinkan dukungan kecocokan umum:

  • static virtual anggota dalam antarmuka
  • operator yang ditentukan pengguna yang diperiksa
  • operator shift santai
  • operator shift kanan yang tidak ditandatangani

Anda dapat menambahkan static abstract atau static virtual anggota dalam antarmuka untuk menentukan antarmuka yang mencakup operator yang dapat kelebihan beban, anggota statis lainnya, dan properti statis. Skenario utama untuk fitur ini adalah menggunakan operator matematika dalam jenis generik. Misalnya, Anda dapat mengimplementasikan System.IAdditionOperators<TSelf, TOther, TResult> antarmuka dalam jenis yang mengimplementasikan operator +. Antarmuka lain menentukan operasi matematika lain atau nilai yang ditentukan dengan baik. Anda dapat mempelajari tentang sintaks baru dalam artikel tentang antarmuka. Antarmuka yang menyertakan static virtual metode biasanya merupakan antarmuka generik. Selain itu, sebagian besar akan menyatakan batasan bahwa parameter jenis mengimplementasikan antarmuka yang dideklarasikan.

Anda dapat mempelajari selengkapnya dan mencoba fitur sendiri dalam tutorial Menjelajahi anggota antarmuka abstrak statis, atau posting blog Fitur pratinjau di .NET 6 – matematika generik.

Kecocokan umum membuat persyaratan lain terkait bahasa.

  • operator pergeseran kanan yang tidak ditandatangani: Sebelum C# 11, untuk memaksa pergeseran kanan yang tidak ditandatangani, Anda harus mentransmisikan jenis bilangan bulat yang bertanda ke jenis yang tidak bertanda, melakukan pergeseran, lalu mentransmisikan hasilnya kembali ke jenis yang bertanda. Mulai dari C# 11, Anda dapat menggunakan >>>, operator pergeseran yang tidak bertanda.
  • persyaratan operator pergeseran longgar: C# 11 menghapus persyaratan bahwa operand kedua harus berupa int atau secara implisit dapat dikonversi ke int. Perubahan ini memungkinkan jenis yang mengimplementasikan antarmuka matematika generik untuk digunakan di lokasi ini.
  • operator yang ditentukan pengguna yang diperiksa dan tidak diperiksa: Pengembang sekarang dapat menentukan operator aritmatika checked dan unchecked. Pengompilasi menghasilkan panggilan ke varian yang tepat berdasarkan konteks saat ini. Anda dapat membaca selengkapnya tentang operator checked pada artikel tentang Operator aritmatika.

Numerik IntPtr dan UIntPtr

Jenis nint dan nuint kini memberi alias System.IntPtr dan System.UIntPtr.

Baris baru dalam interpolasi string

Teks di dalam karakter { dan } untuk interpolasi string sekarang dapat menjangkau beberapa baris. Teks di antara penanda { dan } diurai sebagai C#. Setiap C# yang sah, termasuk baris baru, diizinkan. Fitur ini memudahkan untuk membaca interpolasi string yang menggunakan ekspresi C# yang lebih panjang, seperti ekspresi switch pencocokan pola, atau kueri LINQ.

Anda dapat mempelajari selengkapnya tentang fitur baris baru di artikel interpolasi string dalam referensi bahasa.

Pola daftar

Pola daftar memperluas pencocokan pola agar sesuai dengan urutan elemen dalam daftar atau array. Misalnya, sequence is [1, 2, 3] adalah true jika sequence adalah array atau daftar tiga bilangan bulat (1, 2, dan 3). Anda dapat mencocokkan elemen menggunakan pola apa pun, termasuk pola konstanta, jenis, properti, dan relasional. Pola buang (_) cocok dengan setiap elemen tunggal, dan pola rentang baru (..) cocok dengan urutan nol atau beberapa elemen.

Anda dapat mempelajari detail selengkapnya tentang pola daftar dalam artikel pencocokan pola dalam referensi bahasa.

Konversi grup metode yang disempurnakan untuk didelegasikan

Standar C# pada Konversi grup metode sekarang menyertakan item berikut:

  • Konversi diizinkan (tetapi tidak diperlukan) untuk menggunakan instans delegasi yang ada yang sudah berisi referensi ini.

Versi standar sebelumnya melarang pengompilasi menggunakan kembali objek delegasi yang dibuat untuk konversi grup metode. Pengompilasi C# 11 meng-cache objek delegasi yang dibuat dari konversi grup metode dan menggunakan kembali objek delegasi tunggal tersebut. Fitur ini pertama kali tersedia di Visual Studio 2022 versi 17.2 sebagai fitur pratinjau, dan di Pratinjau .NET 7 2.

Literal string mentah

Literal string mentah adalah format baru untuk literal string. Literal string mentah dapat berisi teks arbitrer, termasuk spasi kosong, baris baru, tanda kutip yang disematkan, dan karakter khusus lainnya tanpa memerlukan urutan escape. Literal string mentah dimulai dengan setidaknya tiga karakter tanda kutip ganda ("""). Ini diakhiri dengan jumlah karakter kutipan ganda yang sama. Biasanya, literal string mentah menggunakan tiga tanda kutip ganda pada satu baris untuk mengawali string, dan tiga tanda kutip ganda pada baris terpisah untuk mengakhiri string. Baris baru yang mengikuti tanda kutip pembukaan dan sebelum tanda kutip penutup tidak disertakan dalam konten terakhir:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

Setiap spasi kosong di sebelah kiri tanda kutip ganda penutup akan dihapus dari literal string. Literal string mentah dapat digabungkan dengan interpolasi string untuk menyertakan kurung kurawal dalam teks output. Beberapa karakter $ menunjukkan berapa banyak kurung kurawal berurutan mengawali dan mengakhiri interpolasi:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

Contoh sebelumnya menentukan bahwa dua kurung kurawal mengawali dan mengakhiri interpolasi. Kurung kurawal pembuka dan penutup berulang ketiga disertakan dalam string output.

Anda dapat mempelajari selengkapnya tentang literal string mentah dalam artikel tentang string dalam panduan pemrograman, dan artikel referensi bahasa pada string literal dan string terinterpolasi.

Struktur default otomatis

Pengompilasi C# 11 memastikan bahwa semua bidang jenis struct diinisialisasi ke nilai defaultnya sebagai bagian dari menjalankan konstruktor. Perubahan ini berarti bidang atau properti otomatis apa pun yang tidak diinisialisasi oleh konstruktor secara otomatis diinisialisasi oleh pengompilasi. Struktur tempat konstruktor tidak secara pasti menetapkan semua bidang sekarang dikompilasi, dan bidang apa pun yang tidak diinisialisasi secara eksplisit diatur ke nilai defaultnya. Anda dapat membaca lebih lanjut tentang bagaimana perubahan ini memengaruhi inisialisasi struktur dalam artikel tentang struktur.

Kecocokan pola Span<char> atau ReadOnlySpan<char> pada konstanta string

Anda dapat menguji apakah string memiliki nilai konstanta tertentu menggunakan pencocokan pola untuk beberapa rilis. Sekarang, Anda dapat menggunakan logika pencocokan pola yang sama dengan variabel Span<char> atau ReadOnlySpan<char>.

Cakupan nameof yang diperluas

Nama parameter jenis dan nama parameter kini berada dalam cakupan saat digunakan di ekspresi nameof dalam deklarasi atribut pada metode tersebut. Fitur ini memungkinkan Anda menggunakan operator nameof untuk menentukan nama parameter metode dalam atribut pada deklarasi parameter atau metode. Fitur ini sangat berguna untuk menambahkan atribut untuk analisis yang dapat diubah ke null.

Literal string UTF-8

Anda dapat menentukan akhiran u8 pada string literal untuk menentukan pengodean karakter UTF-8. Jika aplikasi Anda memerlukan string UTF-8, untuk konstanta string HTTP atau protokol teks serupa, Anda dapat menggunakan fitur ini untuk menyederhanakan pembuatan string UTF-8.

Anda dapat mempelajari selengkapnya tentang literal string UTF-8 di bagian literal string artikel tentang jenis referensi bawaan.

Anggota yang diperlukan

Anda dapat menambahkan pengubah required ke properti dan bidang untuk memberlakukan konstruktor dan pemanggil untuk menginisialisasi nilai-nilai tersebut. System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute dapat ditambahkan ke konstruktor untuk memberi tahu kompilator bahwa konstruktor menginisialisasi semua anggota yang diperlukan.

Untuk informasi selengkapnya tentang anggota yang diperlukan, Lihat bagian init-only dari artikel properti.

ref bidang dan ref scoped variabel

Anda dapat mendeklarasikan ref bidang di dalam ref struct. Ini mendukung jenis seperti System.Span<T> tanpa atribut khusus atau jenis internal tersembunyi.

Anda dapat menambahkan pengubah scoped ke deklarasi apa pun ref . Ini membatasi cakupan tempat referensi dapat lolos.

Jenis lokal file

Mulai dari C# 11, Anda dapat menggunakan pengubah file akses untuk membuat jenis yang visibilitasnya tercakup ke file sumber tempat file dideklarasikan. Fitur ini membantu pembuat generator sumber menghindari penamaan tabrakan. Anda dapat mempelajari selengkapnya tentang fitur ini di artikel tentang jenis cakupan file dalam referensi bahasa.

Lihat juga