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

Chapter13 自動実装と自動定義

川俣 晶
2010/02/17

13.8 匿名型の使用目的

 さて、ここで「匿名型」は何に使えるのか、という問題について考えてみよう。

 実は、これは非常に難しい問題となる。なぜなら、JavaScriptのオブジェクトリテラルと比較してあまりにも制約が厳しく、用途は著しく制限されてしまうからだ。それは、アバウトで危険な用法を予防的に強く抑止する効能を持つ。

 C#は、「危険なポインタがあるおかしな言語」といった「無節操に何でもあり」と見られることがあるが、これはまったくの間違いである。これは、典型的な知ったかぶりの発言なので、そのような発言をする者には、ほかの発言も十分に疑ってかかるほうがよいだろう。C#でのポインタは、何重にも使用制限、機能制限が設けられていて、C言語のポインタと同じようには扱うことができない。危険な行為に対する予防的な制約が厳しく設けられているわけである(その点で、ポインタが要求される低レベル操作を記述する際、C言語によるコード記述を要求するほかの言語よりもよほど安全である)。

 匿名型も同様であり、実質的に、「局所的」かつ「変更不可能」なデータの集まりとして使用することしかできないようになっている。広域的なデータ交換にすら使用されるJavaScriptのオブジェクトリテラルとはまったく違うわけである。

 では、匿名型は何に使えばよいのだろうか?

 1つのメソッド内で、データのまとまりを瞬時に差し替えて使う、というのが典型的な使い方だろうか? 匿名型の値をメソッド外に持ち出すことは、object型にキャストすれば可能ではあるが、持ち出した値を活用することは現実的にはかなり難しいだろう。

 ただ、1つだけ可能性があるのはラムダ式(ないし匿名メソッド)である。ラムダ式で変数をキャプチャしてしまえば、ラムダ式内部からでも匿名型の値を扱うことができる(リスト13.17参照)。

using System;

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

    Action lambda = () =>
      {
        Console.WriteLine(a.b);
      };
    lambda(); // 出力:123
  }
}
リスト13.17 ラムダ式で匿名型を使う

 さらに型推論を使うと、ラムダ式の引数や戻り値に匿名型を使うことも不可能ではない。そこまでして、あえて匿名型を受け渡すことにどこまで意義があるかはわからないが、NyaRuRu氏がブログで詳しく解説されているので、興味のある方はそちらを参照願いたい。

NyaRuRuの日記:匿名型と型推論(C# 3.0)
http://d.hatena.ne.jp/NyaRuRu/20070623/p1

 さて、これほど制約の多い匿名型が存在する理由はいったい何だろうか? 上記のような面倒を抱え込んでまで、あえて使う機会がどれほどあるのだろうか?

 その答えは簡単である。

 それは、C# 3.0の目玉機能の1つであるLINQのselect句で使用するためである。LINQによるクエリの結果から、選択した情報だけをまとめる場合、そこでどうしても「select句で列挙した値だけを含むオブジェクト」を作り出す機能が必要とされるのだが、それは誰も明示的に名前を付けない匿名的な存在なのである。

 このあたりの詳しい話は、第15章でLINQを取り上げる際に再び扱う。


 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 記事ランキング

本日 月間