in
キーワードは、C# で引数を参照渡し(by reference)する際に使用されますが、特に「入力専用」であることを示します。つまり、この引数は読み取り専用であり、メソッド内でその値を変更することはできません。
具体的に言うと、in ActionBuffers actionBuffers
と書かれていることで、actionBuffers
は参照渡しされていますが、メソッド内で変更することはできません。これは、actionBuffers
のコピーを作らずに直接参照することで、パフォーマンスを向上させつつ、安全に値を操作できるというメリットがあります。
したがって、in
キーワードを使うと以下の特徴があります:
この場合、actionBuffers
は参照として渡されますが、メソッド内で変更することはできないため、読み取るだけという意味になります。
in
の使用例in
キーワードの使用例は、特にパフォーマンスを最適化したい場合や、引数を参照渡しで渡したいが変更は許可したくない場合に役立ちます。以下は簡単な例です。
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);
}
DotProduct
メソッドに in
キーワードを使って、ベクトル v1
と v2
を参照渡ししています。in
を使うことで、メソッド内で v1
や v2
を変更することを防ぎ、安全性も確保しています。大きな構造体を渡す際に 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);
}
}
LargeStruct
はフィールドが多い構造体です。通常、構造体は値渡しされるのでコピーが作られますが、in
を使うと参照渡しになります。このように、in
キーワードは特にパフォーマンス最適化やメモリ管理が重要な場面でよく使われます。