読者です 読者をやめる 読者になる 読者になる

万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

参照実験 Unity C#

using UnityEngine;
using System.Collections;

public class Skill 
{
    public string name;
    public int power;

    public string ToString()
    {
        return "[" + name + " (" + power + ")]";
    }
}

public class Person
{
    public string name; // 名前.
    public int age;  // 年齢.
    public Skill skill;  // スキル,

    public void Say()
    {
        Debug.Log(name + " (" + age + "): " + skill.ToString());
    }
}

public class RefTester : MonoBehaviour {
    void Start () {
        Person p1 = new Person();
        p1.name = "YAMADA ICHIRO";
        p1.age  = 11;
        p1.skill = new Skill{name="MATH", power=10};
        NonRefMethodAndChangeSkill(p1);
        p1.Say(); // => HENKO (100): [MIRACLE (200)]

        Person p2 = new Person();
        p2.name = "YAMADA JIRO";
        p2.age  = 21;
        p2.skill = new Skill{name="ENGLISH", power=20};
        RefMethodAndChangeSkill(ref p2);
        p2.Say(); // => HENKO (100): [MIRACLE (200)]
    }

    void NonRefMethodAndChangeSkill(Person p) {
        p.name = "HENKO";
        p.age  = 100;
        ChangeSkill(p.skill);
        // 更にこっちも可能で同じ(refの更にref)
        // RefChangeSkill(ref p.skill);
    }

    void RefMethodAndChangeSkill(ref Person p) {
        p.name = "HENKO";
        p.age  = 100;
        ChangeSkill(p.skill);
        // 更にこっちも可能で同じ(refの更にref)
        // RefChangeSkill(ref p.skill);
    }
    void ChangeSkill(Skill s) {
        s.name = "MIRACLE";
        s.power = 200;
    }

    // ここもやってOK
    void RefChangeSkill(ref Skill s) {
        s.name = "MIRACLE";
        s.power = 200;
    }
}

同じ結果になった。 オブジェクトの中身のプロパティを変えても同じ。