2013年10月19日土曜日

【Unity,C#】構造体のメンバへプロパティ経由でアクセスするとエラーする

こんな時間だけどこちらの記事が気になってしまった。
[Unity]C#でpositionのxとかyに値を突っ込む

たしかにtransform.position.xとかを直接変更できなくてめんどうだなーと思ってた。
Vector3のx,y,zはreadonlyなプロパティなんだろうなーとか勝手に思い込んでた。

でもさきほどのサイトにはこう書けるって書いてあって…
Vector3 pos = transform.position;
pos.y = 2;
transform.position = pos;

( Д ) ゜ ゜

え、なんで一旦変数に取り出すだけでアクセスできるようになるの。
UnityEngine.Vector3型はstructで定義されてたから
structのメンバにプロパティ経由でアクセスできないのか?
と思って試してみた。

public class MyScript {
 /// <summary>
 /// コンストラクタ
 /// </summary>
 public MyScript()
 {
  //初期化
  this.myClassMember = new MyClass();
  this.myClassProperty = new MyClass();
  this.myStructMember = new MyStruct();
  this.myStructProperty = new MyStruct();  
  
  //メンバへセット
  this.myClassMember.X = 1;//OK
  this.myClassProperty.X = 1;//OK
  this.myStructMember.X = 1;//OK
  this.myStructProperty.X = 1;//Error 
 } 
 
 //メンバ変数として定義
 private MyClass myClassMember;
 private MyStruct myStructMember;

 //プロパティとして定義
 private MyClass myClassProperty{get;set;}
 private MyStruct myStructProperty{get;set;}

 /// <summary>
 ///  テスト用クラス
 /// </summary>
 private class MyClass
 {
  public int X {get;set;}
 }
 
 /// <summary>
 /// テスト用構造体
 /// </summary>
 private struct MyStruct
 {
  public int X {get;set;}
 }
 
}

案の定this.myStructProperty.Xを書き換えようとしたらコンパイラエラーした。

this.myStructProperty.Xってした時点で既に構造体がコピーされてるってことか。
代入してもそのコピーされた構造体はすぐ消えちゃうからエラーにしてると。

構造体全然使わないから気づかなかった。

これで解釈あってるかな?
合ってるとしたらC#めっちゃ親切だな。

教えてエライ人!

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...