nameofの使い道は?リファクタリングを助けるnameofを有効利用しよう!

スポンサーリンク

nameofとは?使い方は?

nameofはC#6.0で追加された演算子です。
変数名やクラス名、関数名などを、
文字列のリテラルとして取得することができます。

次のように使います。

static void Main(string[] args)
{
    var methodName = nameof(Main);
    // Mainと出力される
    Console.WriteLine(methodName);     
}

nameofはリファクタリングに使える

nameofはパッと見た感じ
全然便利そうじゃないですよね。

普通に”Main”って書いた方が早いやん!みたいな(笑)

でも、後々のことを考えると
断然nameofを使ったほうがいいんです。

さんさめは職場のVisualStudioが、
nameofを使えるバージョンになった瞬間、
置き換えるべきところを片っ端から置き換えました。

おすすめする理由は以下の3点です。

  • typo(打ち間違え)の心配がない
  • その変数を使っている場所として扱われる
  • 名前の変更に対して追従漏れがない

1つずつ見ていきましょう

typo(打ち間違え)の心配がない

たとえば先程のこのコード、nameof(Main)
と打ったつもりが、
nameof(Mein)になってたとしましょう

static void Main(string[] args)
{
    var methodName = nameof(Mein);
    // ↑ここでコンパイルエラーになる!
    Console.WriteLine(methodName);

    Console.WriteLine("Mein");
    // ↑これはコンパイルエラーにはならない…(当たり前だけど)
}

nameofの場合は、
該当する変数や関数が存在しない場合は
コンパイルエラーになります!

もし直接”Mein”と打ってしまっていたら、
コンパイラは、

  • 誤字?
  • 意図して「Mein」と入力した?

のどちらなのか判断できません。
コードを実行する前からエラーにしてくれるので
すぐに間違いに気づけますね!

Console.Writeline()くらい結果がはっきりしている
メソッドの場合はまだ良いですが、
PropertyChangedの発火をしようとしてtypoしていると、
結構気づきにくいバグになります。

private int age;

public int Age
{
    get { return age; }
    set 
    {
        if (SetProperty(ref age, value))
        {
            OnPropertyChanged("IsAdulr");
            // ↑IsAdulr になってる!!
        }
    }
}

public bool IsAdult => Age >= 20;

また、そもそもnameofで記述する場合は
インテリセンスも働くため、よりtypoしづらいです。

その変数を使っている場所として扱われる

2つ目のメリットは、
nameofで参照している変数や関数は、
それを使っているものとして計上されることです。

それなりの規模の関数をリファクタリングしていると、
「あれ?この引数もう使ってないかも?」

みたいなことがよくありますよね。

そんな時は、
「すべての参照を検索」
を使うなどして使用箇所を洗い出せます。

そんな便利な「すべての参照を検索」ですが、
実はnameofによって参照している箇所も
この検索結果に表れます。

使用箇所を調べたらnameofだけだった、
となったら安心してリファクタリングできますね。

名前の変更に対して追従漏れがない

最後は、名前を変えたくなった場合のケアです。

たとえば、プロパティの名前が実態に沿ってなかったので
変えたくなったとしましょう。

プロパティの「名前の変更」を行うと、
プロジェクト内のすべての使用箇所の名前を、
置換してくれます。

このとき、nameofを使っていればその中身も
しっかり置換されます。

まとめ

nameofを使うと、以下の利点があります。

nameofを使うことで、
リファクタリングに役立ったり、
コンパイルエラーにすぐに気づけたりできます。

つまり、コードの保守性を高めることができます。

nameofを積極的に使って、
後から実装を追いやすいコードを書きましょう!

コメント

タイトルとURLをコピーしました