前提・実現したいこと
こちらの記事を見てみると、コレクションは普通は参照渡しにならないみたいなことが書かれていますが、
自分が検証してみた所、refを付けなくても参照渡しのような挙動となりました。
同じコードを書いているはずなのですが、何が違うのでしょうか?
また、上記の記事は間違っていて、コレクションはrefを付けなくても普通に参照渡しになるという認識で大丈夫でしょうか?
試したこと
試したところ、参照渡しのような挙動に見えました。
コレクションは普通に参照渡しですか?
C#
1 void Start () { 2 3 List<string> listNotRef = new List<string>(); 4 listNotRef.Add("1"); 5 DoNotRef(listNotRef); 6 7 foreach(var item in listNotRef){ 8 Debug.Log(item); 9 } 10 11 //1,2と出力される。 12 13 } 14 15 void DoNotRef (List<string> list) { 16 list.Add ("2"); 17 }
追記。
ChangeNoRef()で、l = new List<string>();したとき、何が起こっているのか分かりません。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample : MonoBehaviour { 6 7 // Use this for initialization 8 void Start () { 9 var list = new List<string>(); 10 list.Add("Hello"); 11 DebugList (list); //Hello 12 13 Debug.Log("変更します"); 14 ChangeNoRef (list); 15 DebugList (list); //Hello 16 17 18 Debug.Log("変更します"); 19 ChangeRef(ref list); 20 DebugList (list); //World 21 } 22 23 static void ChangeNoRef(List<string> l) 24 { 25 l = new List<string>(); //この行をコメントアウトしたら、Hello, Worldになる。 26 l.Add("World"); 27 } 28 29 30 static void ChangeRef(ref List<string> l) 31 { 32 l = new List<string>(); 33 l.Add("World"); 34 } 35 36 void DebugList(List<string> l){ 37 foreach (string s in l) { 38 Debug.Log (s); 39 } 40 } 41}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/02/18 12:58
退会済みユーザー
2018/02/18 15:45
2018/02/18 21:40
2018/02/18 22:53
退会済みユーザー
2018/02/19 14:28 編集
2018/02/19 14:32
退会済みユーザー
2018/02/20 15:45