List<T>
一般に、参照型 ( など)を で渡すことは避けたいと考えていますref
。sを渡して、List<T>
必要なメソッドを呼び出すと、変更がうまくいきます ( .Add()
、.Remove()
、.Sort()
など)。List<T>
一度 (コンストラクターなどで)を渡すだけでよく、 を使用しなくても、参照はオブジェクトの存続期間中有効なままになりますref
。
違いは、List<T>
byを渡すときに、 objectではなく変数引数ref
への参照 (ポインター) を渡すことです。これは、変数に newを割り当てたい場合にのみ違いがあります。List<T>
この違いを説明する小さなプログラムを作成しました。
class Program
{
static void Main(string[] args)
{
List<int> listA = new List<int> { 1, 2, 3 };
List<int> listB = new List<int> { 1, 2, 3 };
Update(listA);
UpdateRef(ref listB);
Console.WriteLine("listA");
foreach (var val in listA)
Console.WriteLine(val);
Console.WriteLine("listB");
foreach (var val in listB)
Console.WriteLine(val);
}
static void Update(List<int> list)
{
list = new List<int>() { 4, 5, 6 };
}
static void UpdateRef(ref List<int> list)
{
list = new List<int>() { 4, 5, 6 };
}
}
プログラムによって生成される出力は次のとおりです。
listA
1
2
3
listB
4
5
6
listB
newList<T>
が含まれているのに含まれていないことに注意しlistA
てください。これは、変数 listB
への参照があったためです。