0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

外部から配列型のプロパティに添字を指定してアクセスした場合、その添字に対応したメンバ変数の配列にアクセスしてくれるのか

Posted at

確認したいこと

プロパティを定義した配列型のメンバ変数を設定する。
このとき外部から、プロパティに対して添字を指定してget/setすると、その添字に対応したメンバ変数の値にアクセスできるのか確認してみた。

つまりメンバ変数_valueとプロパティValue[]を定義したときに、
Value[n] = 1 と代入すると_value[n]にも 1 が代入されるのか。

確認用コード

Unityで確認したため、Unityの機能色々使ってます。

ListTest.cs内のflagについて

flag をtrueにすると、Data.SetValueData.GetValueを用いてData._valueに直接get/setする。
flag をfalseにすると、プロパティに添字を指定してData._valueを行う。

前者では添字を指定したData._valueにアクセスしていることに対し、後者ではData.Valueに添字を指定してData._valueにアクセスする。

前者はアクセス可能なことは想像できるが、後者だとプロパティ側で指定した添字に対応するData._valueにアクセスしてくれるか分からないので検証。

Data.cs
public class Data
{
    private int _num = 2;
    private int[] _value;
    public int[] Value
    {
        set { _value = value; }
        get { return _value; }
    }
    
    public Data()
    {
        _value = new int[_num];
    }

    public void SetValue(int index, int recievedValue)
    {
        _value[index] = recievedValue;
    }
    public int GetValue(int index)
    {
        return _value[index];
    }
}
ListTest.cs
public class ListTest: MonoBehaviour
{
    [SerializeField]
    private bool flag = false;

    private Data _data;
    private int[] _tmpValue;

    void Start()
    {
        _data = new Data();
        _tmpValue = new []{1,2};
    }

    void Update()
    {
        for (int i = 0; i < _data.Value.Length; i++)
        {
            SetForce(i, _tmpValue[i]);
            if(!flag) Debug.Log(_data.Value[i]);
            else Debug.Log(_data.GetValue(i));
        }
    }

    void SetForce(int index, int value)
    {
        if(!flag) _data.Value[index] = value;
        else _data.SetValue(index, value);
    }
}

結果

プロパティ側で添字を指定した場合でもData._valueにアクセスできることを確認。

// 結果 (flagはfalse)
1
UnityEngine.Debug:Log (object)
ListTest:Update () (at Assets/Scripts/ListTest.cs:49)

2
UnityEngine.Debug:Log (object)
ListTest:Update () (at Assets/Scripts/ListTest.cs:49)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?