9

シナリオ

stringプログラムで使用される定数を宣言するためのクラスがあります。

public static class StringConstants
{
    public const string ConstantA = "ConstantA";
    public const string ConstantB = "ConstantB";
    // ...
}

基本的に、定数の実際の値が何であるかは重要ではありません。これは、代入および消費時に使用されるためです。あくまでも確認用です。

定数名は一目瞭然ですが、同じ文字列値を複数回使用することは避けたいと思います。


やりたいこと

がコンパイル時に評価されることはわかっているので、の値をa メンバーnameof()に割り当てることは完全に可能です。const stringnameof()

これらの魔法の文字列を書き出す手間を省くためにnameof()、定数自体を使用することを考えました。

そのようです:

public static class StringConstants
{
    public const string ConstantA = nameof(ConstantA);
    public const string ConstantB = nameof(ConstantB);
    // ...
}

質問...

nameof()リファクタリング以外に、を使用する本当の利点はないと思いますか?

nameof()定数を割り当てるときに使用することには何か意味がありますか?

ハードコードされた文字列だけを使用する必要がありますか?

4

1 に答える 1

5

の使用nameofは賢いと思いますが、問題を引き起こす可能性のあるいくつかのシナリオを考えることができます (これらすべてが当てはまるわけではありません)。

1/ 名前と値を同じにすることができない文字列値がいくつかあります。たとえば、数字で始まる文字列値は、定数の名前として使用できません。したがって、使用できない例外がありますnameof

2/ これらの値の使用方法によっては (たとえば、データベースや xml ファイルなどに保存されている値の名前である場合)、値を自由に変更することはできません。これは、リファクタリングするまでは問題ありません。 . 読みやすくするために定数の名前を変更したい場合 (または以前の開発者のスペルミスを修正したい場合)、使用している場合は変更できませんnameof

3/ あなたのコードを保守しなければならない他の開発者については、どちらがより読みやすいかを検討してください。

public const string ConstantA = nameof(ContantA);

また

public const string ConstantA = "ConstantA";

個人的には後者だと思います。私の意見では、nameofあなたがその道をたどると、他の開発者が立ち止まり、なぜあなたがそのようにしたのか疑問に思うかもしれません. また、重要なのは定数の名前であることを暗示していますが、使用シナリオが私のようなものである場合、重要なのは値であり、名前は便宜上のものです。

を使用できない場合があることを認めた場合nameof、それを使用するメリットはありますか? 上記以外に特にデメリットは感じません。個人的には、従来のハード コードされた文字列定数に固執することをお勧めします。

とはいえ、同じ文字列値を複数回使用していないことを確認することが目的である場合は、(2 つの名前が同じ場合にコンパイラ エラーが発生するため) これは非常に効果的なソリューションです。

于 2018-10-31T16:42:07.770 に答える