たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

古の魔法、現代に蘇る ~C#自己参照クラスをJSONという水晶玉に映す~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

遥か昔、C言語という古の魔法が支配した時代。私は「自己参照構造体」という、極めて難解な術を操っていた。構造体の中に、自分自身の構造体を指し示すポインタという名の魂を宿し、数珠つなぎにデータを連結させる。それは、複雑なポインタ制御を要求される、まさに上級者向けの秘儀だった。

しかし、時代は流れた。現代のC#という言葉を使えば、あの苦労が嘘のように、いとも簡単に自己参照クラスを創り出せる。 ならば、その現代に蘇った古の魔法の産物を、JSONという名の「真実の水晶玉」に映し出すと、一体どんな景色が見えるのだろうか?これは、その好奇心から始まった、ささやかな実験の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • C#で、自己参照クラスという古の魔法を使ってみたいと願う者
  • その魔法の産物を、JSONという現代の言葉で表現した結果に興味がある探求者
  • C#という名の魔法の、さらなる可能性の扉を開きたい冒険者

魂の鎖を紡ぐ:自己参照クラスの二つの形

古の時代から、自己参照には二つの流派が存在した。

片方向の鎖

Nextという名の、未来への道だけを持つ、シンプルな鎖だ。一度進めば、もう過去には戻れない。

public class SelfRef
{
    public int Id { get; set; }
    public string Name { get; set; } = String.Empty;
    public SelfRef? Next { get; set; } = null;
}

双方向の鎖

Nextに加え、Prevという名の、過去への道も持つ、より強力な鎖だ。未来へも過去へも、自由自在に行き来できる。

public class SelfRef
{
    public int Id { get; set; }
    public string Name { get; set; } = String.Empty;
    public SelfRef? Prev { get; set; } = null;
    public SelfRef? Next { get; set; } = null;
}

儀式の実践:魂の鎖をJSONに映す

さあ、この二つの鎖を実際に紡ぎ、真実の水晶玉(JSON)に映してみよう。

片方向の鎖を映す

1から9までの魂を、Nextの鎖で繋ぎ、その先頭の魂をJsonConvert.SerializeObjectの呪文で水晶玉に映す。

// 1から9までの魂を、Nextの鎖で繋ぐ
SelfRef? firstData = null;
var lastData = firstData;
for (int i = 1; i < 10; i++)
{
    var current = new SelfRef() { Id = i, Name = $"Name{i}" };
    if (firstData == null) firstData = current;
    if (lastData != null) lastData.Next = current;
    lastData = current;
}

// 魂の鎖を、水晶玉に映し出す
var jsonText = JsonConvert.SerializeObject(firstData);

すると、水晶玉には、Nextプロパティが入れ子状に連なる、美しい段々畑のような景色が映し出された。

{
    "Id": 1, "Name": "Name1",
    "Next": {
        "Id": 2, "Name": "Name2",
        "Next": {
            "Id": 3, "Name": "Name3",
            "Next": { ... }
        }
    }
}

双方向の鎖の、悲劇的な結末

次に、双方向の鎖を水晶玉に映そうと試みる。しかし、その瞬間、水晶玉は「自己参照ループを検出した」という断末魔を上げて、砕け散ってしまった。 PrevNextが互いを参照し合う、無限の輪。それは、JSONという有限の器では、到底表現しきれない、矛盾した存在だったのだ。

この悲劇を回避する唯一の方法は、[JsonIgnore]という封印の呪文を使い、PrevNext、どちらかの道を、水晶玉から見えなくすることだけだった。

public class SelfRef
{
    // ...
    [JsonIgnore] // この道は、水晶玉には映らない
    public SelfRef? Prev { get; set; } = null;
    public SelfRef? Next { get; set; } = null;
}

羊皮紙を巻く前に

C言語の時代には、ポインタという難解な獣を乗りこなさねばならなかった、自己参照の魔法。それが、C#の時代では、これほどまでに手軽に、そして安全に扱えるようになった。時代の進化を、まざまざと見せつけられた旅だった。

そして、その産物をJSONという水晶玉に映すことで、片方向の鎖は美しい入れ子構造を描き、双方向の鎖は「循環参照」という、この世界の理そのものを我々に教えてくれた。

この羊皮紙が、同じように古の魔法の、現代における姿に興味を抱く、未来の冒険者の助けとなることを願う。

東の空が白んできた。次のオアシスへ向けて、そろそろ荷造りを始めるとしよう。

砂漠で見つけた魔法のランプ

この旅で用いた、JSONという名の水晶玉を操るための魔法は、以下の古文書に記されている。

  • Newtonsoft.Json | JSONを操るための、最もポピュラーな魔導書

ラクダの独り言

ご主人が「じこさんしょうがー」とか言って、何やら数珠つなぎの鎖みたいなものを創っては、それを水晶玉に映して、一人でニヤニヤしている。俺に言わせりゃ、そんなややこしい鎖で繋がってなくても、俺たちはちゃんと一列に並んで歩けるぜ。まったく、人間ってのは、簡単なことを難しくするのが好きだな。やれやれだぜ。