渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

構造体をプロパティとして使用した時によく起きるトラブル


f:id:esakun:20150730215258g:plain

gist.github.com

このようにプロパティ定義した構造体(Direction)の変数に直接値を代入すると以下のようなエラーが出ます。

error CS1612: Cannot modify a value type return value of `Hoge.Direction'. Consider storing the value in a temporary variable

プロパティ定義した型(この場合Sample型)で代入しないといけません。

Unityを使っててよく出てくるのは、このようなコード。

gist.github.com

localPositionはプロパティなので同様のエラーが出力されます。Vector3型を直接代入しないといけません。

gist.github.com

もちろんプロパティではなく、フィールドの場合は問題ありません。

余談

構造体にすべきか、クラスにすべきか悩むケースは開発していると遭遇する時がありますが、公式ページにはこのようにあります。

プリミティブ型のような単一の値を論理的に表す (int, 、double, などです。)。
・16 バイト未満のサイズのインスタンスがあります。
・変更可能なことはできません。
・頻繁にボックス化することはありません。

クラスまたは構造体の選択

また、構造体は容量の少ないスタックメモリに積まれ、そして値型なのでアクセする度にメモリ内にコピーされるため、容量を小さくする必要があります。

ヒープメモリではなくスタックメモリに積まれるためガベージコレクション対象ではありません。
※ガベージコレクションはアプリケーションに大きな負荷がかかりFPSを大きく下げる場合がある

寿命が少なく容量が小さいのであれば、構造体を選択するメリットは十分にあると思います。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info