
Sharplab は 2016 年後半ごろに「TryRoslyn」という名前で「C# を Web 上で試せるサイト」として一番よさそうなサイトとして有名になりだしたと思います。
今さらですが、Sharplab には、おまけで追加されている機能 Inspect があったりします。今回の記事では Inspect が、どういったことができるのか要点を整理しておこうという記事です。
余談ですが、Microsoft が公式に .NET Framework のソースコードを公開したのもこのくらいの時期だったように思います。(.NET は GitHub)この時期の C# は、今思うと大きな変化のあった時期になってますね。 - Microsoft Reference Source
1.実行コードの「Run」
コードの実行テストをするときは、まずこれ。このときに後述する Inspect を知っているとすこしだけ得をすることがあるかもしれません。
Result を「Run」に設定して、結果を確認します。コードが実行された結果が、思い通りかどうかをチェックします。
/* SharpLab tools in Run mode: • value.Inspect() • Inspect.Heap(object) • Inspect.Stack(value) • Inspect.MemoryGraph(value1, value2, …) */ using System; Console.WriteLine("🌄");
output:
🌄
sharplab のコードの記入するところに「Run」モード中に使える sharplab の tools 機能 Inspect の紹介が書いてあります。しかし、使い方のドキュメントらしいものがありませんでした。とりあえず「Inspect」の機能は次の7個のうち3個です。
Allocations(Func action) Allocations(Action action)Equals -> NotSupportedException- Heap
- MemoryGraph
ReferenceEquals -> NotSupportedException- Stack
Inspect
value.Inspect()
値のチェックをしたいときは、サンプルコードのように Console.WriteLine でもいいですが、変数の値を見たいだけなら value.Inspect() もけっこう便利です。
1.Inspect(); "aaa".Inspect(); "aaa".Inspect("title");

定義:
変数の値を Result に出力してくれます。引数はタイトルの名前を変える。デフォルトは "Inspect" になる。
引数:
- Inspect()
- Inspect(string)
- string = タイトルの名前
Inspect.Heap(object)
指定したオブジェクトがヒープにどのように配置されているかを調べるためのメソッドです。特定のオブジェクトについて、メモリ上での配置や構造を視覚化できます。
using System; var obj = new { Name = "abc", Value = 404 }; Inspect.Heap(obj);

定義:
対象のオブジェクトを受け取り、ヒープ内でのメモリ配置を調査します。
引数:
- Heap(object)
- object = 調査をする対象オブジェクト
Inspect.Stack(value)
指定した値がスタック上にどのように配置されているかを確認するためのメソッドです。構造体やローカル変数など、スタックに格納される値(値型)について、メモリ上の配置や内容を視覚化します。
using System; var point = new Point { X = 10, Y = 20 }; Inspect.Stack(point); struct Point { public int X; public int Y; }

定義:
任意の型 T の値を受け取り、その値がスタックにどのように配置されているかを調査します。
引数:
- Stack(object)
- object = 調査をする対象オブジェクト
Inspect.MemoryGraph(value1, value2, …)
指定されたオブジェクトのメモリレイアウトをグラフィカルに表示します。オブジェクトのフィールド、配列の要素、参照先などのメモリ上での関係を可視化することができます。
using System; Node node1 = new Node { Value = 1 }; Node node2 = new Node { Value = 2, Next = node1 }; Inspect.MemoryGraph(node1, node2); class Node { public int Value; public Node Next; }

定義:
複数のオブジェクトを受け取り、それらのメモリ上の相互関係をグラフとして視覚化します。
引数:
- MemoryGraph(T value)
- value = 調査をする対象オブジェクト
- MemoryGraph(T1 value1, T2 value2)
- value1 = 調査をする対象オブジェクト1
- value2 = 調査をする対象オブジェクト2
- MemoryGraph(T1 value1, T2 value2, T3 value3)
- value1 = 調査をする対象オブジェクト1
- value2 = 調査をする対象オブジェクト2
- value3 = 調査をする対象オブジェクト3
- MemoryGraph(T1 value1, T2 value2, T3 value3, T4 value4)
- value1 = 調査をする対象オブジェクト1
- value2 = 調査をする対象オブジェクト2
- value3 = 調査をする対象オブジェクト3
- value4 = 調査をする対象オブジェクト4
- MemoryGraph(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5)
- value1 = 調査をする対象オブジェクト1
- value2 = 調査をする対象オブジェクト2
- value3 = 調査をする対象オブジェクト3
- value4 = 調査をする対象オブジェクト4
- value5 = 調査をする対象オブジェクト5
値型と参照型の学習にとても役にたつツールだと思います。
Inspect.Allocations(補足)
Allocations は、現状ただしく動作していないように思います。
using System; int Calculate() { int[] numbers = new int[10]; return numbers.Length; } void RunAction() { string text = new string('a', 100); Console.WriteLine(text); } Inspect.Allocations(() => Calculate()); Inspect.Allocations(() => RunAction());
System.NullReferenceException: Object reference not set to an instance of an object.
定義: