連載:[完全版]究極のC#プログラミング

Chapter13 自動実装と自動定義

川俣 晶
2010/02/17

13.7 匿名型の簡易記法

 匿名型は、より少ない文字数で記述する簡易記法の一種であるが、さらに短く書くための手段が用意されている

 たとえば、あるメソッドで、引数として渡された値を使用して匿名型インスタンスを作りたいと思ったとしよう。通常の表記であれば、次のリスト13.14のように記述する。

using System;

class 座標
{
  public double 緯度;
  public double 経度;
}

class Program
{
  private static void Sample( string name, 座標 pos )
  {
    var a = new {
        補足 = "井の頭通り沿い",
        name = name,
        緯度 = pos.緯度,
        経度 = pos.経度
    };

    // ……
    // aを使用した何かの処理があるとする
    // ……

    Console.WriteLine("{0}, 緯度経度={1}, {2}, {3}",
                        a.name, a.緯度, a.経度, a.補足);
  }

  static void Main(string[] args)
  {
    var pos = new 座標();
    pos.緯度 = 35.669569;
    pos.経度 = 139.657581;
    Sample("和田堀給水所", pos);
  }
}
リスト13.14 通常の匿名型インスタンスの書き方

 しかし、匿名型の記述は、次のリスト13.15のようにさらに簡素化できる。

var a = new { 補足 = "井の頭通り沿い", name, pos.緯度, pos.経度 };
リスト13.15 簡易表記による匿名型インスタンスの書き方

 このとおり、name、緯度、経度の記述が大幅に簡素化された。実は、「=」を使わないで名前のみを記述すると、次のような解釈が行われる。

a → a = a

b.c → c = b.c

 これらは、指定された変数などの名前と値を持つプロパティを匿名型に生成する表記である。つまり、すでに存在する変数などがあって、使用したい名前と同じ名前で宣言されていれば、その名前を書くだけで匿名型に取り込まれるわけである。

 しかし、このような表記は、あくまで「同じ名前のプロパティ」を作る機能であり、値は初期化時にコピーされるにすぎないことに注意が必要である。つまり、もとになった変数を書き換えても、その値が反映されるわけではない。リスト13.16にその例を示す。

using System;

class Program
{
  static void Main(string[] args)
  {
    var a = 123;
    var x = new { a };

    Console.WriteLine("a={0} x.a={1}", a, x.a);
    // 出力:a=123 x.a=123

    a = 456;
    Console.WriteLine("a={0} x.a={1}", a, x.a);
    // 出力:a=456 x.a=123
  }
}
リスト13.16 もとになる変数を書き換えたとき


 INDEX
  [完全版]究極のC#プログラミング
  Chapter13 自動実装と自動定義
    1.13.1 ラムダ式を使ったダーティテク―refの代役
    2.13.2 自動実装プロパティ
    3.13.3 自動実装プロパティのアクセス制御
    4.13.4 読み出し専用、書き込み専用はない
    5.13.5 “名無し”のクラス―匿名型
    6.13.6 匿名型の等価性
  7.13.7 匿名型の簡易記法
    8.13.8 匿名型の使用目的
    9.13.9 オブジェクト初期化子
    10.13.10 オブジェクト初期化子の本質とは?
    11.13.11 コレクションはreadonlyでも初期化できる
    12.13.12 オブジェクト初期化子の使用例/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間