より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

クラスは参照渡し、構造体は値渡し

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

構造体だと値がそのままコピーされます。ある意味、これは便利ではあります。

しかし、あまりプロパティが多いとコピーする分、負荷がかかるという問題点もあります。

f:id:rimever:20210501195640p:plain