私は次のようなコードを見つけました
public int MaxHealth =>
Memory[Address].IsValid ?
Memory[Address].Read<int>(Offs.Life.MaxHp) :
0;
今では、ラムダ式についてはある程度理解しています。ただ、このように使用されているのを見たことがありませんでした。
上記の文と
public int MaxHealth = x ? y:z;
ベストアンサー1
あなたが見ているのは表現ボディメンバーラムダ式ではありません。
コンパイラは、式本体のプロパティメンバーを検出すると、基本的に次のようにそれをゲッターに変換します。
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(このコードをツールに入力することで、自分で確認することができます。トライロズリン。
式本体のメンバーは、C# 6のほとんどの機能と同様に、 構文糖つまり、既存の機能では実現できなかった機能を提供するわけではありません。代わりに、これらの新機能により、より表現力豊かで簡潔な構文を使用できるようになります。
ご覧のとおり、式本体のメンバーには、プロパティ メンバーをよりコンパクトにするショートカットがいくつかあります。
return
コンパイラは式の結果を返すことを推測できるので、ステートメントを使用する必要はありません。- 本体は1つの式だけなので、ステートメントブロックを作成する必要はありません。
get
式本体のメンバー構文の使用によってキーワードが暗黙的に指定されるため、キーワードを使用する必要はありません。
最後の点は実際の質問に関連しているため太字にしました。これからその質問にお答えします。
...の違いは…
// expression-bodied member property
public int MaxHealth => x ? y:z;
そして...
// field with field initializer
public int MaxHealth = x ? y:z;
...の違いと同じですか?
public int MaxHealth
{
get
{
return x ? y:z;
}
}
そして...
public int MaxHealth = x ? y:z;
プロパティを理解していれば、これは明らかなはずです。
ただし、明確にしておくと、最初のリストは、アクセスするたびに呼び出される、内部にゲッターを持つプロパティです。2 番目のリストは、フィールド初期化子を持つフィールドで、その式は、型がインスタンス化されるときに 1 回だけ評価されます。
この構文の違いは実は非常に微妙で、ビル・ワグナーが投稿した「落とし穴」につながる可能性があります。「AC# 6 の落とし穴: 初期化と式本体のメンバー」。
式本体のメンバーはラムダ式に似ていますが、ラムダ式ではありません。基本的な違いは、ラムダ式の結果がデリゲート インスタンスまたは式ツリーのいずれかになることです。式本体のメンバーは、コンパイラに対してバックグラウンドでプロパティを生成するための指示にすぎません。類似点は (多かれ少なかれ) 矢印 ( ) で始まり、矢印 ( =>
) で終わります。
また、式本体のメンバーはプロパティ メンバーに限定されないことも付け加えておきます。式本体のメンバーは、以下のすべてのメンバーで機能します。
- プロパティ
- インデクサー
- 方法
- オペレーター
追加されたC# 7.0
ただし、次のメンバーでは機能しません。
- ネストされた型
- イベント
- 田畑