2024/2/29 追記 参照渡しという言葉を使っていましたが、言葉の使い方が適切ではないので、修正しました。
C#の細かい挙動ですが、大事なことなのでメモ。
クラスと構造体を代入された後の挙動について。
using System; public class Program { public static void Main() { var aClass = new AClass() { X = 1 }; var aStruct = new AStruct() { X = 1}; Console.WriteLine($"aClass.X = {aClass.X}"); Console.WriteLine($"aStruct.X = {aStruct.X}"); Console.WriteLine($"---------------------------"); var bClass = aClass; var bStruct = aStruct; Console.WriteLine($"aClass.X = {aClass.X}"); Console.WriteLine($"aStruct.X = {aStruct.X}"); Console.WriteLine($"bClass.X = {bClass.X}"); Console.WriteLine($"bStruct.X = {bStruct.X}"); Console.WriteLine($"---------------------------"); bClass.X = bStruct.X = 2; Console.WriteLine($"aClass.X = {aClass.X}"); Console.WriteLine($"aStruct.X = {aStruct.X}"); Console.WriteLine($"bClass.X = {bClass.X}"); Console.WriteLine($"bStruct.X = {bStruct.X}"); } public class AClass { public int X {get; set;} } public struct AStruct { public int X { get; set;} } }
上記のソースでは、BにAを代入して、その後にAのプロパティを変更しています。
クラスで宣言すると、Aのプロパティ変更に伴いBのプロパティも変更されます。
構造体で宣言すると、Aのプロパティ変更はBのプロパティに影響はありません。
結果は以下。
aClass.X = 1 aStruct.X = 1 --------------------------- aClass.X = 1 aStruct.X = 1 bClass.X = 1 bStruct.X = 1 --------------------------- aClass.X = 2 aStruct.X = 1 bClass.X = 2 bStruct.X = 2
構造体だと値がそのままコピーされます。ある意味、これは便利ではあります。
しかし、あまりプロパティが多いとコピーする分、負荷がかかるという問題点もあります。