C# では、と語ろうとした場合、「えーっと、どうだったかな?www」と言いかねない自分がいることに気づいたので、ちょっとまとめておく。
基本値渡しで、値のコピー
次のコードの場合、「参照型」の「値渡し」ということになり、器「x」に入っている参照情報を、器「dest」にコピーするというイメージでいいだろう。using System; public class Foo { private string message; public Foo(string s) { message = s; } public override string ToString() { return message; } } public class ExecFoo { public static void Main(string[] args) { Foo x = new Foo("foo"); Console.WriteLine(x); ExecFoo.f(x, "bar"); Console.WriteLine(x); } public static void f(Foo dest, string message) { dest = new Foo(message); } } /* * Build: * * gmcs foo.cs * * Run: * * mono foo.exe * */
$ mono foo.exe foo foo
器「dest」の参照情報が入れ代わっただけなので、器「x」に影響はない。
値渡しだけど
参照先は同じなので、using System; public class Foo { private string message; public Foo(string s) { message = s; } public string Message { get { return message; } set { message = value; } } public override string ToString() { return message; } } public class ExecFoo { public static void Main(string[] args) { Foo x = new Foo("foo"); Console.WriteLine(x); ExecFoo.f(x, "bar"); Console.WriteLine(x); } public static void f(Foo dest, string message) { dest.Message = message; } }
$ mono foo.exe foo bar
参照渡し
「ref」キーワードをつけることで、「参照渡し」になる。この場合、値のコピーではなく、値の参照情報を渡す。つまり、器「x」using System; public class Foo { private string message; public Foo(string s) { message = s; } public override string ToString() { return message; } } public class ExecFoo { public static void Main(string[] args) { Foo x = new Foo("foo"); Console.WriteLine(x); ExecFoo.f(ref x, "bar"); Console.WriteLine(x); } public static void f(ref Foo dest, string message) { dest = new Foo(message); } }
$ mono foo.exe foo bar
0 件のコメント:
コメントを投稿