Mengapa ReSharper menilai saya untuk kode ini?
private Control GetCorrespondingInputControl(SupportedType supportedType, object settingValue)
{
this.ValidateCorrespondingValueType(supportedType, settingValue);
switch(supportedType)
{
case SupportedType.String:
return new TextBox { Text = (string)settingValue };
case SupportedType.DateTime:
return new MonthPicker { Value = (DateTime)settingValue, ShowUpDown = true };
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding user control defined.", supportedType));
}
}
private void ValidateCorrespondingValueType(SupportedType supportedType, object settingValue)
{
Type type;
switch(supportedType)
{
case SupportedType.String:
type = typeof(string);
break;
case SupportedType.DateTime:
type = typeof(DateTime);
break;
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding Type defined.", supportedType));
}
string exceptionMessage = string.Format("The specified setting value is not assignable to the supported type, [{0}].", supportedType);
if(settingValue.GetType() != type)
{
throw new InvalidOperationException(exceptionMessage);
}
}
Metode kedua ValidateCorrespondingValueType parameter "settingValue" berwarna abu-abu dengan pesan berikut oleh ReSharper: "Parameter 'settingValue' hanya digunakan untuk pemeriksaan prakondisi."
c#
resharper
preconditions
Korpsekicker
sumber
sumber
exceptionMessage
ke dalamif
-block :)Jawaban:
Itu tidak menghakimi, itu mencoba membantu :)
Jika ReSharper melihat bahwa sebuah parameter hanya digunakan sebagai cek untuk menampilkan pengecualian, itu menjadi abu-abu, menunjukkan bahwa Anda tidak benar-benar menggunakannya untuk pekerjaan "nyata". Ini kemungkinan besar adalah kesalahan - mengapa memasukkan parameter yang tidak akan Anda gunakan? Ini biasanya menunjukkan bahwa Anda telah menggunakannya dalam prasyarat, tetapi kemudian lupa (atau tidak perlu lagi) untuk menggunakannya di tempat lain dalam kode.
Karena metode ini adalah metode pernyataan (artinya, yang dilakukannya hanyalah menegaskan bahwa itu valid), Anda dapat menyembunyikan pesan dengan menandai
ValidateCorrespondingValueType
sebagai metode pernyataan, menggunakan atribut anotasi ReSharper , khususnya[AssertionMethod]
atribut:sumber
settingValue
tidak mungkin menjadi prakondisi , karena hal yang diperiksa tidak diketahui sampai beberapa pekerjaan telah dilakukan di dalam tubuh metode![AssertionMethod]
.Menariknya, ReSharper mundur jika Anda menggunakan
nameof
fungsionalitas baru di C # 6:sumber
Berikut ini perbaikan masalah (di ReSharper 2016.1.1, VS2015), tetapi saya tidak yakin ini menyelesaikan masalah 'benar'. Bagaimanapun, ini menunjukkan ambiguitas dalam mekanisme ReSharper mengenai topik ini:
Ini menghasilkan peringatan:
Tapi ini tidak:
Sangat menarik bahwa kode ekivalen (pembalikan dilakukan oleh ReSharper: D) memberikan hasil yang berbeda. Tampaknya pencocokan pola tidak mengambil versi kedua.
sumber
Solusi yang saya sukai untuk masalah ini adalah membuat resharper berpikir bahwa parameter tersebut digunakan. Ini memiliki keuntungan lebih dengan menggunakan atribut seperti
UsedImplicitly
karena jika pernah Anda lakukan berhenti menggunakan parameter itu, resharper akan mulai peringatan Anda lagi. Jika Anda menggunakan atribut, resharper juga tidak akan menangkap peringatan nyata di masa mendatang.Cara mudah untuk membuat resharper berpikir bahwa parameter yang digunakan adalah dengan menggantinya
throw
dengan suatu metode. Jadi, bukannya ......Anda menulis:
Ini mendokumentasikan diri sendiri dengan baik untuk programmer masa depan, dan resharper berhenti merengek.
Penerapan ThrowPreconditionViolation itu sepele:
Metode ekstensi pada Exception adalah polusi namespace, tetapi cukup berisi.
sumber
[UsedImplicitly]
, saya tidak ingin menggunakan[AssertionMethod]
sebagaimana adanya, dan digunakan secara implisit terdengar lebih akurat dalam kasus saya (saya mengirimkan nilai ke callback dalam konstruktor dan mengembalikan objek yang dibangun).Orang lain telah menjawab pertanyaan itu, tetapi tidak ada yang menyebutkan cara mematikan peringatan berikut.
Tambahkan ini di atas tanda tangan metode untuk mematikannya hanya untuk metode itu:
Tambahkan ini di atas deklarasi kelas untuk menonaktifkannya untuk seluruh file:
sumber