質問: new List(); l.Add("World"); } void DebugList(List l){ foreach (string s in l) { Debug.Log (s); } } } ```
回答: 質問のコードでの動作は値渡し(call by value)の一種である**共有渡し**(call by sharing、「オブジェクト渡し」や「参照の値渡し」とも言われる)と言われるものです。`ref`キーワードを使用した場合の動作である参照渡し(call by reference)とは異なる動作になります。 なぜ、そのような動作になるのかを理解するには、Listが参照型であるということ、そして、C#の参照型はどのように変数に格納されているのかと言うことを理解できなくてはなりません。参照型の場合、変数に入っているのはそのデータそのものではなく、そのデータの実体を参照する**何か**(参考文献に載せているMSDNのドキュメントでは「参照(reference)」と書かれています、同様の仕組みがあるJavaでは「参照値(reference value)」と呼ばれているため、一般的に「参照値」と言われる場合が多いです)です。この**何か**を値渡しするのが、共有渡し(なので、「参照の値渡し」とも言われるますが、C#やJava以外の言語も考えると、実装上は「参照の値」というものではない場合もありえるため、適切かどうかは微妙なところです)になります。 注意して欲しいのは、参照渡しと参照型は全く異なる概念であるということです。ref (C# リファレンス) | Microsoft Docsにも混同することがないように注意事項がわざわざ書いてあります。 参考文献 * 参照型 (C# リファレンス) | Microsoft Docs * 2-3 値型と参照型 古い資料ですが、わかりやすイメージ図が載っています。