Bagikan melalui


CA2241: Memberikan argumen yang benar untuk metode pemformatan

Properti Nilai
ID Aturan CA2241
Judul Sediakan argumen yang benar untuk metode pemformatan
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Argumen format string diteruskan ke metode seperti WriteLine, , Writeatau System.String.Format tidak berisi item format yang sesuai dengan setiap argumen objek, atau sebaliknya.

Secara default, aturan ini hanya menganalisis panggilan ke tiga metode yang disebutkan sebelumnya, tetapi ini dapat dikonfigurasi.

Deskripsi aturan

Argumen ke metode seperti WriteLine, , dan Format terdiri dari string format diikuti oleh beberapa System.Object instansWrite. String format terdiri dari teks dan item format yang disematkan dari formulir {index[,alignment][:formatString]}. 'indeks' adalah bilangan bulat berbasis nol yang menunjukkan objek mana yang akan diformat. Jika objek tidak memiliki indeks yang sesuai dalam string format, objek diabaikan. Jika objek yang ditentukan oleh 'indeks' tidak ada, objek System.FormatException dilemparkan pada waktu proses.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, berikan item format untuk setiap argumen objek dan berikan argumen objek untuk setiap item format.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi metode tambahan untuk menjalankan aturan ini.

Metode pemformatan string tambahan

Anda dapat mengonfigurasi nama metode pemformatan string tambahan yang harus dianalisis oleh aturan ini. Misalnya, untuk menentukan semua metode bernama MyFormat sebagai metode pemformatan string, Anda dapat menambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat

Format nama metode yang diizinkan pada nilai opsi (dipisahkan oleh |):

  • Nama metode saja (mencakup semua metode dengan nama, terlepas dari jenis atau namespace layanan yang berisi)
  • Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol, dengan awalan M: opsional.

Contoh:

Nilai Opsi Ringkasan
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat Cocok dengan semua metode yang dinamai MyFormat dalam kompilasi.
dotnet_code_quality.CA2241.additional_string_formatting_methods = MyFormat1|MyFormat2 Cocok dengan semua metode bernama baik MyFormat1 atau MyFormat2 dalam kompilasi.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS.MyType.MyFormat(ParamType) Cocok dengan metode MyFormat tertentu dengan tanda tangan yang sepenuhnya memenuhi syarat.
dotnet_code_quality.CA2241.additional_string_formatting_methods = NS1.MyType1.MyFormat1(ParamType)|NS2.MyType2.MyFormat2(ParamType) Cocok dengan metode MyFormat1 tertentu dan MyFormat2 dengan masing-masing tanda tangan yang sepenuhnya memenuhi syarat.

Menentukan metode pemformatan string tambahan secara otomatis

Alih-alih menentukan daftar eksplisit metode pemformatan string tambahan, Anda dapat mengonfigurasi penganalisis untuk secara otomatis mencoba menentukan metode pemformatan string. Secara default, opsi ini dinonaktifkan. Jika opsi diaktifkan, metode apa pun yang memiliki string format parameter diikuti oleh params object[] parameter dianggap sebagai metode pemformatan string:

dotnet_code_quality.CA2241.try_determine_additional_string_formatting_methods_automatically = true

Contoh

Contoh berikut menunjukkan dua pelanggaran aturan.

Imports System

Namespace ca2241

    Class CallsStringFormat

        Sub CallFormat()

            Dim file As String = "file name"
            Dim errors As Integer = 13

            ' Violates the rule.
            Console.WriteLine(String.Format("{0}", file, errors))

            Console.WriteLine(String.Format("{0}: {1}", file, errors))

            ' Violates the rule and generates a FormatException at runtime.
            Console.WriteLine(String.Format("{0}: {1}, {2}", file, errors))

        End Sub

    End Class

End Namespace
class CallsStringFormat
{
    void CallFormat()
    {
        string file = "file name";
        int errors = 13;

        // Violates the rule.
        Console.WriteLine(string.Format("{0}", file, errors));

        Console.WriteLine(string.Format("{0}: {1}", file, errors));

        // Violates the rule and generates a FormatException at runtime.
        Console.WriteLine(string.Format("{0}: {1}, {2}", file, errors));
    }
}