Unity_Lesson

in キーワードは、C# で引数を参照渡し(by reference)する際に使用されますが、特に「入力専用」であることを示します。つまり、この引数は読み取り専用であり、メソッド内でその値を変更することはできません。

具体的に言うと、in ActionBuffers actionBuffers と書かれていることで、actionBuffers は参照渡しされていますが、メソッド内で変更することはできません。これは、actionBuffers のコピーを作らずに直接参照することで、パフォーマンスを向上させつつ、安全に値を操作できるというメリットがあります。

したがって、in キーワードを使うと以下の特徴があります:

  1. 参照渡し:パフォーマンスの最適化に繋がる(値のコピーが不要)。
  2. 読み取り専用:メソッド内で値を変更することはできない。

この場合、actionBuffers は参照として渡されますが、メソッド内で変更することはできないため、読み取るだけという意味になります。


inの使用例

in キーワードの使用例は、特にパフォーマンスを最適化したい場合や、引数を参照渡しで渡したいが変更は許可したくない場合に役立ちます。以下は簡単な例です。

例1: ベクトルの計算で in を使用

大きなデータ構造(例えばベクトルや行列など)を参照渡しし、パフォーマンスを向上させたいが、誤ってその値が変更されないようにしたい場合に in を使います。

using System;

public class Program
{
    public static void Main()
    {
        Vector3 vec1 = new Vector3(1.0f, 2.0f, 3.0f);
        Vector3 vec2 = new Vector3(4.0f, 5.0f, 6.0f);

        float result = DotProduct(in vec1, in vec2);
        Console.WriteLine("Dot Product: " + result);
    }

    public static float DotProduct(in Vector3 v1, in Vector3 v2)
    {
        // ここで v1 や v2 を変更することはできません
        return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
    }
}

public struct Vector3
{
    public float x, y, z;
    public Vector3(float x, float y, float z) => (this.x, this.y, this.z) = (x, y, z);
}

説明:

例2: メモリ節約とパフォーマンス最適化

大きな構造体を渡す際に in を使うと、値のコピーを避けてメモリを節約し、パフォーマンスを向上させることができます。以下は、重たい構造体を渡すときの例です。

public struct LargeStruct
{
    public int Field1;
    public int Field2;
    public int Field3;
    public int Field4;
    // 他に多くのフィールド
}

public class Program
{
    public static void Main()
    {
        LargeStruct large = new LargeStruct { Field1 = 10, Field2 = 20, Field3 = 30, Field4 = 40 };

        // in で参照渡し
        PrintFields(in large);
    }

    public static void PrintFields(in LargeStruct largeStruct)
    {
        // largeStruct を変更することはできないが、値を参照できる
        Console.WriteLine(largeStruct.Field1);
        Console.WriteLine(largeStruct.Field2);
    }
}

説明:

このように、in キーワードは特にパフォーマンス最適化やメモリ管理が重要な場面でよく使われます。