ラムダ式についてなぜか微妙に勘違いしていたのでメモ。

キャラクターを表すクラスにキャラクターの位置を表す Position 、キャラクターの1回の移動量を返す getMovement というメンバ変数がある。

using System;
using Microsoft.Xna.Framework;

class Character
{
    public Vector2 Position { get; set; }
    private Func<Vector2> getMovement;

    public Character()
    {
        getMovement = () => new Vector2(1, (float)Math.Sin(Position.X));
    }

    public void Update()
    {
        Position += getMovement();
    }
}

メインループで Update を実行すると getMovement の内容に応じて Position が変化する。

そして勘違いしていたのは getMovement のラムダ式で Position を使っている部分。
ここで Position は getMovement への代入時の値がそのままで Position が変わってから getMovement を実行しても同じ結果が返ってくると思ってた。
別にそんな事はなかった。 

ちゃんと getMovement の実行の度に Position プロパティにアクセスします。はい。


遅延評価って難しい。