◆ const 定数: 参照型のインスタンスとか設定できない
◆ readonly: フィールドにしか使えない
◆ {get;}: プロパティにしか使えない 

{get;} だけのプロパティばかりしか使ってませんでしたが 考えてみると readonly キーワードもあるし方法がいくつかあるようです


軽く調べたところ

  • const
  • readonly
  • { get; }

の 3 つみたい

const

定数です

コンパイル時に値が決まらないといけないようで クラス型は使えないです
class C {}
class Class
{
public const int a = 1;
public const string b = "aa" + "bb";
public const C c = null;
public const C d = new C(); // エラー
}

null だとおっけいでした

readonly

フィールド用でプロパティには使えませんでした
class Class
{
public readonly C a = new C();
public readonly int b { get; set; } // エラー
}

定数じゃなくてもよくて 通常のフィールドが書き込み禁止になってるだけみたい

{ get; }

プロパティのみ
プロパティの書き方ですしね

getter しかないので リフレクションで SetValue しようとするとエラーになります
読み取り専用だから SetValue は普通しないかもしれませんが コンストラクタ中でもエラーになります

値を書き込むには自動プロパティが裏側で作ってるフィールドに代入する必要があります
class Class
{
public int abc { get; }

public void abc1()
{
this.GetType().GetProperty("abc").SetValue(this, 1);
}
}

Property Set メソッドが見つかりません。

まずは裏側で自動で作られているフィールドの名前を知らないといけません
GetFields で NonPublic を見てみると

<aaa>k__BackingField

という名前みたい

aaa のところがプロパティの名前になります
ここまでわかれば後は簡単
class Class
{
public int abc { get; }

public void abc1()
{
this.GetType().GetField("<abc>k__BackingField", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).SetValue(this, 1);
}
}
var c = new Class();
Console.WriteLine(c.abc);
// 0

c.abc1();
Console.WriteLine(c.abc);
// 1

まとめ

{get;} と readonly はプロパティかフィールドの違いだし const は読み取り専用(イミュータブル変数)というよりは「定数」というちょっと違うもの

色々あってどれを使えばいいのかなー と思いながら調べはじめましたが
特にこういう場合はこっち~とか悩むことはほぼなさそうです