C#のプロパティとラムダについて知らないことがあったのでおさらいもかねて自分用にまとめる。
プロパティとは
クラス外からは変数っぽくて、クラス内部から見るとメソッドみたいなもの。
個人的にはいつでも現在の状態を呼べる変数みたいなときに使う。
戻り値を持っていてメソッド名の後ろに()がつかないモノ!
書き方
private bool name; public bool Name{ set{ name = value;} get{ return name; } }
setter部分で変更時の処理を書き
getter部分で値を返す処理を書く
C#のバージョンによって書き方を省略できたりする
Ver2までは↑の書き方
Ver3~ シンプルに書けるようになる。(今までの書き方も可能)
public string Name { get; set; }
この書き方で↓こんな内容に相当するコードが自動的に生成されるらしい。
private string __name; public string Name { get { return this.__name; } set { this.__name = value; } }
Ver6~ getのみのプロパティが定義できるようになる
public bool Name { get; }
さらにシンプルな書き方でも初期化ができるようになる
public bool Name { get; set; } = true;
Ver9~ initというgetOnlyやreadOnlyと同じようなものが定義できるようになる
public bool Name { get; init;}
参考:https://ufcpp.net/study/csharp/oo_property.html
バージョンごとの歴史がまとめられてて凄い助かった。
2021/3時点でC#の最新バージョンは9.0
Unityで使用するC#のバージョン
Unityで使えるC#のバージョンはUnityのバージョンと、スクリプトランタイムバージョン設定によって異なる
2021/03時点で
Unity 2020.2~2021.1
C# 8.0
https://docs.unity3d.com/ja/2021.1/Manual/CSharpCompiler.html
Unity 2018.3 ~ 2020.1
C# 7.3
https://docs.unity3d.com/ja/2018.3/Manual/CSharpCompiler.html
ラムダについて
ラムダとは
関数名が必要なく、引数の型、戻り値の型を省略できる使い捨て関数
ラムダには「式」と「ステートメント」の2形式存在する。
たとえばこんなメソッドがあるとする
private int Add(int x, int y) { return x + y; }
これをラムダ式の「ステートメント形式」で書くと
(int x, int y) => { return x + y; };
(引数) → {関数の中身} みたいな感じでメソッド名を省略してかける。{}内は複数行書ける。
これをさらに「式形式」で書くと
(x, y) => x + y;
さらにシンプルに{}を外して書ける。式形式の場合は1行のみ。
んで、引数が無い場合
通常のメソッドだと
private void Hoge() { Console.WriteLine("hoge"); }
これがラムダ式で書くとこうなる
() => Console.WriteLine("hoge");
よく見かける () => 処理 こいつは引数なしの使い捨て関数だったわけだ。
参考:
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-expressions
https://qiita.com/toRisouP/items/98cc4966d392b7f21c30
この記事で最終的に取り上げたかったモノ
他の人が書いてるプロパティでこんなものを見つけた
public Transform TargetTransform => targetTransform;
最初、プロパティの超省略の書き方なのかな?と勘違いしてたけど
これはラムダ式で書いた読み取り専用のプロパティとのこと。
たとえばこんなプロパティがあったとする
CNameはANameとBNameを合算した値を返す読み取り専用プロパティ
public string AName { get; set; } public string BName { get; set; } public string CName { get { return AName + "" + BName; } }
↑これが↓こうやって省略できる
public string AName { get; set; } public string BName { get; set; } public string CName => AName + "" + CName;
なるほど。
じゃあ
public Transform TargetTransform => targetTransform; これ単体で存在している場合はどうなるのか?
targetTransformを返すだけの単純に読み取り専用プロパティになる。
でもこうやってpositionとかの更新はできる
TargetTransform.position = new Vector3(0, 0, 0);
読み取り専用とは・・・・?
めちゃわかりづれぇ!
ということでした。
参考:https://www.atmarkit.co.jp/ait/articles/1606/01/news051.html
※コメントは承認後に表示されます。
コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。