CA1304: Menentukan CultureInfo
Properti | Nilai |
---|---|
ID Aturan | CA1304 |
Judul | Tentukan CultureInfo |
Golongan | Globalisasi |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Metode atau konstruktor memanggil anggota yang memiliki kelebihan beban yang menerima System.Globalization.CultureInfo parameter, dan metode atau konstruktor tidak memanggil kelebihan beban yang mengambil CultureInfo parameter. Aturan ini mengabaikan panggilan ke metode berikut:
Anda juga dapat mengonfigurasi lebih banyak simbol untuk dikecualikan oleh aturan ini.
Deskripsi aturan
Ketika objek CultureInfo atau System.IFormatProvider tidak disediakan, nilai default yang disediakan oleh anggota yang overload mungkin tidak memiliki efek yang Anda inginkan di semua lokal. Selain itu, anggota .NET memilih kultur dan pemformatan default berdasarkan asumsi yang mungkin tidak benar untuk kode Anda. Untuk memastikan kode berfungsi seperti yang diharapkan untuk skenario Anda, Anda harus menyediakan informasi khusus budaya sesuai dengan pedoman berikut:
Jika nilai akan ditampilkan kepada pengguna, gunakan kultur saat ini. Lihat CultureInfo.CurrentCulture.
Jika nilai akan disimpan dan diakses oleh perangkat lunak, yaitu, bertahan ke file atau database, gunakan budaya invarian. Lihat CultureInfo.InvariantCulture.
Jika Anda tidak mengetahui tujuan nilai, minta konsumen atau penyedia data menentukan kultur.
Meskipun perilaku default anggota yang overload sesuai untuk kebutuhan Anda, lebih baik memanggil secara eksplisit overload khusus kultur sehingga kode Anda mendokumentasikan sendiri dan lebih mudah dipertahankan.
Catatan
CultureInfo.CurrentUICulture hanya digunakan untuk mengambil sumber daya yang dilokalkan dengan menggunakan instans System.Resources.ResourceManager kelas .
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, gunakan kelebihan beban yang mengambil CultureInfo argumen.
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini ketika dipastikan bahwa budaya default adalah pilihan yang benar, dan di mana pemeliharaan kode bukan prioritas pengembangan yang penting.
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 CA1304
// The code that's violating the rule is on this line.
#pragma warning restore CA1304
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1304.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Mengonfigurasi kode yang akan dianalisis
Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku, atau untuk semua aturan dalam kategori ini (Globalisasi) yang diterapkannya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Mengecualikan simbol tertentu
Anda dapat mengecualikan simbol tertentu, seperti jenis dan metode, dari analisis dengan mengatur opsi excluded_symbol_names. Misalnya, untuk menentukan bahwa aturan tidak boleh berjalan pada kode apa pun dalam jenis bernama MyType
, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Catatan
Ganti bagian XXXX
CAXXXX
dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |
):
- Nama simbol saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol. Setiap nama simbol memerlukan awalan jenis simbol, seperti
M:
untuk metode,T:
untuk jenis, danN:
untuk namespace. -
.ctor
untuk konstruktor dan.cctor
untuk konstruktor statik.
Contoh:
Nilai Opsi | Ringkasan |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Mencocokkan semua simbol bernama MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Mencocokkan semua simbol bernama MyType1 atau MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Mencocokkan MyMethod metode tertentu dengan tanda tangan yang sepenuhnya memenuhi syarat yang ditentukan. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Mencocokkan MyMethod1 dan MyMethod2 metode tertentu dengan masing-masing tanda tangan yang sepenuhnya memenuhi syarat. |
Mengecualikan jenis tertentu dan jenis turunannya
Anda dapat mengecualikan jenis tertentu dan jenis turunannya dari analisis dengan mengatur opsi excluded_type_names_with_derived_types. Misalnya, untuk menentukan bahwa aturan tidak boleh dijalankan pada metode apa pun dalam jenis bernama MyType
dan jenis turunannya, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Catatan
Ganti bagian XXXX
CAXXXX
dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |
):
- Nama jenis saja (mencakup semua jenis dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol, dengan awalan
T:
opsional.
Contoh:
Nilai opsi | Ringkasan |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Mencocokkan semua jenis bernama MyType dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Mencocokkan semua jenis bernama MyType1 atau MyType2 dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Mencocokkan MyType jenis tertentu dengan nama yang sepenuhnya memenuhi syarat tertentu dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Mencocokkan MyType1 dan MyType2 jenis tertentu dengan masing-masing nama yang sepenuhnya memenuhi syarat, dan semua jenis turunannya. |
Contoh yang menunjukkan cara memperbaiki pelanggaran
Dalam contoh berikut, BadMethod
menyebabkan dua pelanggaran aturan ini.
GoodMethod
memperbaiki pelanggaran pertama dengan meneruskan budaya invarian ke String.Compare, dan memperbaiki pelanggaran kedua dengan meneruskan budaya saat ini ke String.ToLower karena string3
ditampilkan kepada pengguna.
public class CultureInfoTest
{
public void BadMethod(String string1, String string2, String string3)
{
if (string.Compare(string1, string2, false) == 0)
{
Console.WriteLine(string3.ToLower());
}
}
public void GoodMethod(String string1, String string2, String string3)
{
if (string.Compare(string1, string2, false,
CultureInfo.InvariantCulture) == 0)
{
Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
}
}
}
Contoh memperlihatkan output yang diformat
Contoh berikut menunjukkan efek budaya saat ini pada default IFormatProvider yang dipilih oleh DateTime jenis.
public class IFormatProviderTest
{
public static void Main1304()
{
string dt = "6/4/1900 12:15:12";
// The default behavior of DateTime.Parse is to use
// the current culture.
// Violates rule: SpecifyIFormatProvider.
DateTime myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
// Change the current culture to the French culture,
// and parsing the same string yields a different value.
Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
}
}
Contoh ini menghasilkan output berikut:
6/4/1900 12:15:12 PM
06/04/1900 12:15:12