List<>
を試すことができますが、変更可能な参照型であることを行うことができます。
List<>
をメソッドに渡すときは、のコピーを渡します。だからあなたはただそれがList<>
だと言うだけです。それはList<>
の内容全体をコピー(複製)しません。
あなたはStack<>
上(Push
)List<>
を入れた場合、どのようなStack<>
が本当に保持するList<>
のこのインスタンスへの参照のコピーです。このインスタンスが後で.Add("asd")
や.Clear()
などのように後で変更された場合は、Stack<>
または他のリファレンスが保持する参照をローカル変数に従うかどうかにかかわらず、この「突然変異」が表示されます。 両方の参照は、同じインスタンスList<>
に "ポイント"します。
すると、あなたのコードでは、あなたが言う:
List<>
の既存のインスタンスは、それが空になる(変異する)変更します
letterList.Clear(); // do not change reference, follow reference and mutate the instance it refers to
。この変更は、List<>
のこの特定のインスタンスへの参照を保持している人に見られます。
あなたが行っていた代わりにした場合:
letterList = new List<string>(); // create new instance, change reference to point there (reference assignment), old instance is unchanged
をList<>
の新しいインスタンスを指すようにletterList
の参照を「移動」しているということ。これは、「古い」インスタンスへの他の参照を持つ人々には影響しません。
リファレンス使用ことでタイトルパスが誤解を招くおそれがあります。参照型や参照渡しなど、そのようなものだったはずです。
「私は間違っていますか?はい、表示されたコードには参照渡しがありません。あなたは 'ref'と'out'の欠如によってそれを知ることができます。 http://jonskeet.uk/csharp/parameters.htmlとhttp://jonskeet.uk/csharp/references.htmlを参照することをお勧めします。値による参照の受け渡しは、参照渡しと同じではありません。 –