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

Chapter13 自動実装と自動定義

川俣 晶
2010/02/17

13.4 読み出し専用、書き込み専用はない

 自動実装プロパティはつねにgetアクセサとsetアクセサの双方が必要とされることに注意が必要である。したがって、以下のケースはどちらもエラーになる。

public int A { get; }

public int A { set; }

 なぜ、読み出し専用、書き込み専用のプロパティは許可されないのだろうか? その理由は構造を考えれば明らかだろう。

 暗黙的に確保されるフィールド(バッキングフィールド)にアクセスする手段がない以上、すべての書き込みと読み出しはプロパティ経由になる。ということは、読み出し専用プロパティはデフォルト値しか読み出せないし、書き込み専用プロパティに書き込んだ内容は永遠に読み出すことができない。つまり、たとえ可能になったとしても存在意義はないのである。

 ただし、プロパティ経由ではなく、リフレクション経由でバッキングフィールドにアクセスできることに注意が必要である。

 次のリスト13.9は、通常の手段ではアクセスできないバッキングフィールドをリフレクションで検出し、その値を書き換えてしまう例である。もちろん、リフレクションを使えばクラス内部の詳細にいくらでも介入できるわけで、バッキングフィールドも例外ではない。しかし、通常の手段ではソースコード上にいっさい姿を見せることがないバッキングフィールドの書き換えは、ソースコード上での操作と結果の因果関係がわかりにくくなり、保守性を下げる可能性がある。

using System;
using System.Reflection;

class SomeClass
{
  public int A { get; private set; }
}

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

    Console.WriteLine("a.A={0}", a.A);
    Type t = a.GetType();

    foreach (FieldInfo f in t.GetFields(BindingFlags.NonPublic
                                      | BindingFlags.Instance))
    {
      Console.WriteLine("found: {0}", f.Name);
      f.SetValue(a, (object)123);
    }
    Console.WriteLine("a.A={0}", a.A);
  }
}
リスト13.9 リフレクションによるバッキングフィールドへのアクセス

a.A=0
found: <A>k__BackingField
a.A=123
リスト13.9の実行結果


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

本日 月間