Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| Nama jenis | ForwardCancellationTokenToInvocations |
| ID Aturan | CA2016 |
| Judul | Meneruskan parameter CancellationToken ke metode yang mengambilnya |
| Golongan | Keandalan |
| Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
| Diaktifkan secara default di .NET 10 | Sebagai saran |
Penyebab
Aturan ini menemukan pemanggilan metode yang dapat menerima parameter CancellationToken, tetapi tidak meneruskan apa pun, dan menyarankan untuk meneruskan CancellationToken metode induk ke parameter tersebut.
Deskripsi aturan
Aturan ini menganalisis definisi metode yang mengambil CancellationToken sebagai parameter terakhirnya, lalu menganalisis semua metode yang dipanggil dalam isinya. Jika salah satu pemanggilan metode dapat menerima CancellationToken sebagai parameter terakhir, atau memiliki overload yang mengambil CancellationToken sebagai parameter terakhir, maka aturan menyarankan penggunaan opsi tersebut sebagai gantinya untuk memastikan bahwa pemberitahuan pembatalan disebarluaskan ke semua operasi yang dapat mendengarkannya.
Catatan
Aturan CA2016 tersedia di semua versi .NET tempat jenis CancellationToken tersedia. Untuk versi yang berlaku, lihat bagian CancellationToken "Berlaku untuk".
Cara memperbaiki pelanggaran
Anda dapat memperbaiki pelanggaran secara manual, atau menggunakan perbaikan kode yang tersedia di Visual Studio. Arahkan kursor ke bola lampu yang muncul di samping pemanggilan metode dan pilih perubahan yang disarankan.
Contoh berikut menunjukkan dua deklarasi yang disarankan tersebut:
Anda dapat menyembunyikan pelanggaran aturan ini jika tidak khawatir tentang meneruskan pemberitahuan operasi yang dibatalkan ke pemanggilan metode yang lebih rendah. Anda juga dapat secara eksplisit meneruskan default di C# (Nothing di Visual Basic) atau None untuk menyembunyikan pelanggaran aturan.
Aturan ini dapat mendeteksi berbagai pelanggaran. Contoh berikut menunjukkan kasus yang dapat dideteksi aturan ini:
Contoh 1
Aturan akan menyarankan penerusan parameter ct dari MyMethod ke pemanggilan MyMethodWithDefault, karena metode tersebut menentukan parameter token opsional:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Perbaikan:
Teruskan parameter ct:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(ct);
}
Jika Anda tidak khawatir tentang meneruskan pemberitahuan pembatalan ke pemanggilan yang lebih rendah, Anda dapat:
Meneruskan default secara eksplisit:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(default);
}
Atau meneruskan CancellationToken.None secara eksplisit:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(CancellationToken.None);
}
Contoh 2
Aturan akan menyarankan penerusan parameter ct dari MyMethod ke pemanggilan MyMethodWithOverload, karena metode tersebut memiliki overload yang mengambil parameter CancellationToken:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload()
{
}
public static void MyMethodWithOverload(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
Perbaikan:
Teruskan parameter ct:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(ct);
}
Jika Anda tidak khawatir tentang meneruskan pemberitahuan pembatalan ke pemanggilan yang lebih rendah, Anda dapat:
Meneruskan default secara eksplisit:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(default);
}
Atau meneruskan CancellationToken.None secara eksplisit:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(CancellationToken.None);
}
Contoh non-pelanggaran
Parameter CancellationToken dalam metode induk tidak berada di posisi terakhir:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct, int lastParameter)
{
MyMethodWithDefault();
}
}
}
Parameter CancellationToken dalam metode default tidak berada di posisi terakhir:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Parameter CancellationToken dalam metode overload tidak berada di posisi terakhir:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(int lastParameter)
{
}
public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
Metode induk menentukan lebih dari satu parameter CancellationToken:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct1, CancellationToken ct2)
{
MyMethodWithDefault();
}
}
}
Metode default menentukan lebih dari satu parameter CancellationToken:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct1 = default, CancellationToken ct2 = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Metode overload menentukan lebih dari satu parameter CancellationToken:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(CancellationToken ct1, CancellationToken ct2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
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 CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.