Pertanyaan CA1305: Verbosity saat menentukan budaya


CA1305  dibangkitkan ketika ada kelebihan beban yang membutuhkan IFormatProvider tapi kelebihan ini tidak digunakan dalam kode.

Misalnya, kode berikut menimbulkan peringatan ini:

string.Format("{0} - {1}", id, name);

Cara yang jelas untuk menyingkirkan peringatan ini adalah dengan menentukan budaya yang akan digunakan:

string.Format(CultureInfo.InvariantCulture, "{0} - {1}", id, name);

Namun, saya pikir ini terlalu verbose.

Alternatif apa yang ada?


6
2017-10-22 11:31


asal


Jawaban:


Cukup banyak satu-satunya alternatif yang akan menyebabkan penurunan verbositas sementara masih melestarikan penyedia format eksplisit lewat akan menggunakan metode façade budaya-spesifik. Untungnya, biasanya hanya ada format untuk InvariantCulture dan CurrentCulture, jadi hanya dua metode façade yang diperlukan untuk setiap metode pemformatan yang mendasari.

Metode façade khas untuk kode contoh Anda mungkin memiliki tanda tangan seperti ini:

public static string FormatForInvariantCulture(this string template, params object[] substitutions)

dan disebut sebagai berikut:

"{0} - {1}".FormatForInvariantCulture(id, name);

Pendekatan lain untuk mengatur metode façade akan menjadi jenis formatter khusus budaya yang dapat disuntikkan menggunakan teknik IoC. Misalnya, antarmuka seperti berikut ini dapat didefinisikan untuk pemformatan:

public interface IFormatter
{
    string Format(string template, params object[] substitutions);
}

Contoh spesifik budaya dapat disuntikkan ke dalam jenis yang perlu melakukan pemformatan menggunakan konstruktor seperti berikut:

public SomeClass(IFormatter systemFormatter, IFormatter uiFormatter)
{
    // ...
}

Terlepas dari cara metode façade dikemas, penting untuk mempertimbangkan bahwa CA2241 (ProvideCorrectArgumentsToFormattingMethods) tidak akan memeriksa penggunaan metode, jadi mungkin bermanfaat mempertimbangkan menambahkan aturan khusus untuk melakukannya.


2
2017-10-22 11:48