Bagikan melalui


CA1844: Memberikan penggantian metode asinkron berbasis memori saat membuat subkelas 'Stream'

Properti Nilai
ID Aturan CA1844
Judul Menyediakan penggantian metode asinkron berbasis memori saat subkelas 'Stream'
Golongan Performa
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Jenis yang berasal dari Stream penimpaan ReadAsync(Byte[], Int32, Int32, CancellationToken) tetapi tidak mengambil alih ReadAsync(Memory<Byte>, CancellationToken). Atau, jenis yang berasal dari Stream penimpaan WriteAsync(Byte[], Int32, Int32, CancellationToken) tetapi tidak mengambil alih WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).

Deskripsi aturan

Metode dan WriteAsync berbasis ReadAsync memori ditambahkan untuk meningkatkan performa, yang mereka capai dengan berbagai cara:

  • Mereka kembali ValueTask dan ValueTask<int> bukan Task dan Task<int>, masing-masing.
  • Mereka memungkinkan semua jenis buffer untuk diteruskan tanpa harus melakukan salinan tambahan ke array.

Untuk mewujudkan manfaat performa ini, jenis yang berasal dari Stream harus memberikan implementasi berbasis memori mereka sendiri. Jika tidak, implementasi default akan dipaksa untuk menyalin memori ke dalam array untuk memanggil implementasi berbasis array, yang mengakibatkan penurunan performa. Saat penelepon melewati instans Memory<T> atau ReadOnlyMemory<T> yang tidak didukung oleh array, performa akan terpengaruh lebih banyak.

Cara memperbaiki pelanggaran

Cara term mudah untuk memperbaiki pelanggaran adalah dengan menulis ulang implementasi berbasis array Anda sebagai implementasi berbasis memori, lalu menerapkan metode berbasis array dalam hal metode berbasis memori.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika salah satu situasi berikut berlaku:

  • Hit performa tidak menjadi perhatian.
  • Anda tahu bahwa subkelas Anda Stream hanya akan pernah menggunakan metode berbasis array.
  • Subkelas Anda Stream memiliki dependensi yang tidak mendukung buffer berbasis memori.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1844
// The code that's violating the rule is on this line.
#pragma warning restore CA1844

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1844.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Baca juga