旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
遥か昔、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": { ... } } } }
双方向の鎖の、悲劇的な結末
次に、双方向の鎖を水晶玉に映そうと試みる。しかし、その瞬間、水晶玉は「自己参照ループを検出した」という断末魔を上げて、砕け散ってしまった。
PrevとNextが互いを参照し合う、無限の輪。それは、JSONという有限の器では、到底表現しきれない、矛盾した存在だったのだ。
この悲劇を回避する唯一の方法は、[JsonIgnore]という封印の呪文を使い、PrevかNext、どちらかの道を、水晶玉から見えなくすることだけだった。
public class SelfRef { // ... [JsonIgnore] // この道は、水晶玉には映らない public SelfRef? Prev { get; set; } = null; public SelfRef? Next { get; set; } = null; }
羊皮紙を巻く前に
C言語の時代には、ポインタという難解な獣を乗りこなさねばならなかった、自己参照の魔法。それが、C#の時代では、これほどまでに手軽に、そして安全に扱えるようになった。時代の進化を、まざまざと見せつけられた旅だった。
そして、その産物をJSONという水晶玉に映すことで、片方向の鎖は美しい入れ子構造を描き、双方向の鎖は「循環参照」という、この世界の理そのものを我々に教えてくれた。
この羊皮紙が、同じように古の魔法の、現代における姿に興味を抱く、未来の冒険者の助けとなることを願う。
東の空が白んできた。次のオアシスへ向けて、そろそろ荷造りを始めるとしよう。
砂漠で見つけた魔法のランプ
この旅で用いた、JSONという名の水晶玉を操るための魔法は、以下の古文書に記されている。
- Newtonsoft.Json | JSONを操るための、最もポピュラーな魔導書
ラクダの独り言
ご主人が「じこさんしょうがー」とか言って、何やら数珠つなぎの鎖みたいなものを創っては、それを水晶玉に映して、一人でニヤニヤしている。俺に言わせりゃ、そんなややこしい鎖で繋がってなくても、俺たちはちゃんと一列に並んで歩けるぜ。まったく、人間ってのは、簡単なことを難しくするのが好きだな。やれやれだぜ。