差分
循環参照
,循環参照(英:circular reference)とは、ある複数の[[データ]]が相互に参照しあっている状態のことである。
2つの[[データ]]が相互に参照するのみならず、何個ものデータが巡り巡って循環しているということも多々ある。
また、[[自己参照]]も循環参照のひとつである。
== 概要 ==
[[プログラミング]]において循環参照を適切に処理できなければ、たとえば[[シリアライズ]]を行うさいに[[永久ループ]]に陥り、[[アウトオブメモリー]](メモリ不足)や[[スタックマシン]]であれば[[スタックオーバーフロー]]が発生したりといったことになる。
また[[参照カウンター]]方式の[[ガベージコレクター]]を採用する[[プログラミング言語]]や[[実行環境]]では、循環参照により[[参照]]しあう[[オブジェクト]]は半永久的に参照カウントが減らないという問題に遭遇し、[[UNIX]]の[[デーモン]]や[[Windowsサービス]]、[[常駐プログラム]]のような長時間起動し続ける[[プログラム]]においてメモリー不足や[[スタックオーバーフロー]]が発生する。
== 循環参照の例 ==
=== スプレッドシートでの循環参照 ===
[[スプレッドシート]]の代名詞である[[Excel]]で以下のような入力を行うと「循環参照に関する警告」というダイアログが表示され怒られる。
{|class="wikitable"
|+
! !! A !! B
|-
! 1 !! =A1 !! =B2
|-
! 2 !! !! =B1
|}
* セルA1は自己参照(=循環参照のひとつ)。
* セルB1はセルB2を参照し、セルB2はセルB1を参照しており、永久に参照を繰り返す。
=== C#での循環参照 ===
[[C Sharp|C#]]と[[ASP.NET MVC]]、[[Knockout.JS]]で[[ウェブアプリ]]を書いてるわけだが、循環参照するモデルクラス(オブジェクト)を[[JSON.NET]]で「簡単」に[[シリアライズ]]する方法を模索中。いまのところ解決方法が思いつかない。
== 関連項目 ==
* [[永久ループ]]
* [[スタックオーバーフロー]]
* [[参照カウンター]]
* [[再帰]]
== 参考文献 ==
<references/>
== 外部リンク ==
{{stub}}
2つの[[データ]]が相互に参照するのみならず、何個ものデータが巡り巡って循環しているということも多々ある。
また、[[自己参照]]も循環参照のひとつである。
== 概要 ==
[[プログラミング]]において循環参照を適切に処理できなければ、たとえば[[シリアライズ]]を行うさいに[[永久ループ]]に陥り、[[アウトオブメモリー]](メモリ不足)や[[スタックマシン]]であれば[[スタックオーバーフロー]]が発生したりといったことになる。
また[[参照カウンター]]方式の[[ガベージコレクター]]を採用する[[プログラミング言語]]や[[実行環境]]では、循環参照により[[参照]]しあう[[オブジェクト]]は半永久的に参照カウントが減らないという問題に遭遇し、[[UNIX]]の[[デーモン]]や[[Windowsサービス]]、[[常駐プログラム]]のような長時間起動し続ける[[プログラム]]においてメモリー不足や[[スタックオーバーフロー]]が発生する。
== 循環参照の例 ==
=== スプレッドシートでの循環参照 ===
[[スプレッドシート]]の代名詞である[[Excel]]で以下のような入力を行うと「循環参照に関する警告」というダイアログが表示され怒られる。
{|class="wikitable"
|+
! !! A !! B
|-
! 1 !! =A1 !! =B2
|-
! 2 !! !! =B1
|}
* セルA1は自己参照(=循環参照のひとつ)。
* セルB1はセルB2を参照し、セルB2はセルB1を参照しており、永久に参照を繰り返す。
=== C#での循環参照 ===
[[C Sharp|C#]]と[[ASP.NET MVC]]、[[Knockout.JS]]で[[ウェブアプリ]]を書いてるわけだが、循環参照するモデルクラス(オブジェクト)を[[JSON.NET]]で「簡単」に[[シリアライズ]]する方法を模索中。いまのところ解決方法が思いつかない。
== 関連項目 ==
* [[永久ループ]]
* [[スタックオーバーフロー]]
* [[参照カウンター]]
* [[再帰]]
== 参考文献 ==
<references/>
== 外部リンク ==
{{stub}}