i-school - データ型 ー値型と参照型ー

データ型


 C# プログラミング言語には、値型と参照型の 2 種類のデータ型があります。


参考サイト
MicroSoft
値型
MicroSoft
参照型


値型


 値型は、値をメモリに直接格納するデータ型です。それらは単純で自己完結型であり、追加のポインターや参照を必要とせずにそれらの値に直接アクセスできます。

C# の値の型の例は次のとおりです。

数値型: int、long、float、double、decimal、byte、short、および ushort。
ブール型: bool
文字タイプ: char
構造体:構造体
通常、値型はサイズが小さく、スタックに格納されます。値型の変数を作成すると、変数は値を直接格納します。

int num = 5;
上記の例では、値 5 が変数「num」に直接格納されます。


参照型


 一方、参照型は値をメモリに直接保存しません。代わりに、実際のデータが格納されているメモリ位置への参照を格納します。

C# の参照型の例は次のとおりです。

string
クラス:クラス
配列: int[]、string[]
デリゲート:デリゲート
参照型は一般にサイズが大きく、ヒープに格納されます。参照型の変数を作成すると、その変数には、データが格納されている場所への参照 (またはポインター) が格納されます。

string str = "Hello World!";

上記の例では、変数 "str" は値 "Hello World!" を直接格納していません。代わりに、実際の文字列データが格納されているメモリ内の場所への参照を格納します。

値型と参照型の違い


 値型と参照型の主な違いは、メモリ内での格納方法アクセス方法にあります。

 値型はメモリに直接格納され、その値に直接アクセスできます。値型のコピーに加えられた変更は、元の変数には影響しません

 参照型は、データが格納されているメモリ位置への参照を格納します。
参照型のコピーに加えられた変更は、コピーとオリジナルの両方がメモリ内の同じ場所を参照するため、元のオブジェクトに影響を与える可能性があります



 値型と参照型の違いを示す例です。

using UnityEngine;

public class ValueTypeReferenceTypeExample : MonoBehaviour
{
    void Start()
    {
        // Example of a value type
        int num1 = 5;
        int num2 = num1;
        num2 = 10;

        Debug.Log("num1: " + num1); // Output: num1: 5
        Debug.Log("num2: " + num2); // Output: num2: 10

        // Example of a reference type
        int[] array1 = new int[] { 1, 2, 3 };
        int[] array2 = array1;
        array2[0] = 5;

        Debug.Log("array1[0]: " + array1[0]); // Output: array1[0]: 5
        Debug.Log("array2[0]: " + array2[0]); // Output: array2[0]: 5
    }
}

 上記の例では、num1 と num2 の 2 つの変数を定義しています。
これらの変数は両方とも、値をメモリに直接格納するため、値型です。

 値 5 を num1 に割り当て、num2 という num1 のコピーを作成します。
次に、num2 の値を 10 に変更しますが、num1 の値は 5 のままです。

 これは、値型のコピーに加えられた変更が元の変数に影響しないことを示しています。



 次に、array1 と array2 の 2 つの配列を定義します。
これらの変数はどちらも、実際のデータが格納されているメモリ位置への参照を格納するため、参照型です。

 3 つの整数の配列を array1 に割り当て、array2 という名前の array1 への参照を作成します。
次に、array2 の最初の要素を 5 に変更します。これにより、array1 の最初の要素も変更されます。
これは、コピーと元の両方がメモリ内の同じ場所を参照するため、参照型のコピーに加えられた変更が元のオブジェクトに影響を与える可能性があることを示しています。


 
 値型と参照型の違いを理解することで、Unity C# でより効率的かつ効果的なコードを記述できます。


サンプルコード


 プログラムで値型と参照型を使用する方法を示すサンプルコードです。


using UnityEngine;

public class GameController : MonoBehaviour
{
    public int score;
    public GameObject[] pickups;

    void Start()
    {
        // Set the score to 0
        score = 0;

        // Find all of the pickups in the scene
        pickups = GameObject.FindGameObjectsWithTag("Pickup");

        // Set the initial position of the pickups
        foreach (GameObject pickup in pickups)
        {
            pickup.transform.position = new Vector3(Random.Range(-5f, 5f), 0.5f, Random.Range(-5f, 5f));
        }
    }

    void Update()
    {
        // Check for player input to pick up the pickups
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Loop through all of the pickups
            foreach (GameObject pickup in pickups)
            {
                // Get the distance between the player and the pickup
                float distance = Vector3.Distance(transform.position, pickup.transform.position);

                // If the distance is less than 1.5, pick up the pickup and increase the score
                if (distance < 1.5f)
                {
                    // Destroy the pickup
                    Destroy(pickup);

                    // Increase the score by 1
                    score += 1;
                }
            }
        }
    }
}



 プレーヤーのスコアを追跡するスコア変数と、シーン内のすべてのピックアップ オブジェクトを保持するピックアップの配列を定義します。

 Start メソッドでは、score 変数を 0 に設定し、GameObject.FindGameObjectsWithTag メソッドを使用してシーン内のすべてのピックアップを見つけます。
次に、ピックアップをループして、特定の範囲内のランダムな位置に初期位置を設定します。

 Update メソッドでは、ピックアップをピックアップするためのプレーヤーの入力を確認します。
プレーヤーがスペース キーを押すと、すべてのピックアップをループして、プレーヤーと各ピックアップの間の距離を確認します。
距離が 1.5 未満の場合、ピックアップ オブジェクトを破棄し、スコアを 1 増やします。

 int や float などの値型を使用してスコアや距離などの単純なデータを格納し、
GameObject や Vector3 などの参照型を使用してピックアップやその位置などのより複雑なデータを操作していることに注意してください。