csharplang 140
https://github.com/dotnet/csharplang/blob/main/proposals/field-keyword.md
https://ufcpp.net/study/csharp/oo_property.html#auto 近辺に。
- set, get, init いずれの中でも field がキーワードに
- 「
field フィールド」がいる場合、@field か this.field で参照
nameof(field) はエラー
- 自動プロパティ(空っぽの get, set, init) との併用(
set だけ field キーワードを使った実装とか)可能
- 「デリゲートを返すプロパティ」内でラムダ式内で field をキャプチャ可能
- プロパティ自体に属性で
[field: ...] を付けたらそれはバッキングフィールドに適用される
- 「プロパティと全く同じ型」で生成される
- 値型に対して
int? X=> field ??= GetValue(); みたいなことは無理(field は int であって int? にはならない)
- バッキングフィールドが readonly に
- 条件要調査。プロパティに readonly ついてるとき? get-only?
- overriede
- 基底クラスでも field を使い、派生クラスの overriede 内でも field を使うとそれは別のフィールドが生成される
- NRT
- get, set 間の整合性みて nullable / not-null 判定ちゃんとしてくれてる
- (割と最近の実装。初期プレビューだとそこまでしてくれてなかった)
class A
{
// ダメ。
public string X
{
get => field; // こう書いてる時点で、field は string を期待。
set => field = null; // string に null を入れてるので警告。
}
// これなら OK。
public string Y
{
get => field ?? ""; // これにより、string? でも大丈夫ということに。
set => field = null; // string? 相手だと思えばこれが OK に。
}
}
用語「自動プロパティ」
元々は「半自動プロパティ」って呼ばれてたけども、
最終的にはこの用語は否決されたっぽい?
field キーワードでバッキングフィールドができる。
get; は get => field; の省略形で、
set; は set => field = value; の省略形。
↑これを全部「自動プロパティ」呼び。みたいな議論。
最終的な用語定義としては、
- 自動プロパティ(auto property):
set; get; みたいな空っぽのアクセサーからのバッキングフィールド生成
- 自動アクセサー(auto accessor): ↑の「空っぽの
set; とか get; とか init;」のこと
- フルアクセサー(full accessor): ボディ持ちのアクセサー
- field-backed property: コンパイラーによってフィールドが自動生成されるプロパティ
- = 自動プロパティ or
field キーワードを使ったプロパティ
- 何て訳そう… まじめに訳すと「フィールドで裏付けられたプロパティ」で長すぎ
- フィールド付きプロパティとかフィールド生成プロパティとかフィールド支持プロパティとか?
- バックフィールド(backing field): field-backed property によって生成されるフィールド
- 余談: 訳語変える?
- MS ルールで「ing は取る」になってたのでバックフィールドと書いたものの
- MS ルール変だなぁという感はあり、バッキングフィールドの方がよくない?
- 「三単現も複数形も s は取る」を拡大解釈して generics (名詞)と generic (形容詞)をどっちも「ジェネリック」で訳すような会社なので
C# 14 新機能としては「field キーワード」呼びでよさげ。
余談: value キーワード
プロパティ setter 内の value も完全にキーワード扱いにしようか(nameof(value) が非合法化)という話があったものの、それは否決されたっぽい。
csharplang 140
https://github.com/dotnet/csharplang/blob/main/proposals/field-keyword.md
https://ufcpp.net/study/csharp/oo_property.html#auto 近辺に。
fieldフィールド」がいる場合、@fieldかthis.fieldで参照fieldフィールド」がいたら警告ありnameof(field)はエラーsetだけfieldキーワードを使った実装とか)可能[field: ...]を付けたらそれはバッキングフィールドに適用されるint? X=> field ??= GetValue();みたいなことは無理(fieldはintであってint?にはならない)用語「自動プロパティ」
元々は「半自動プロパティ」って呼ばれてたけども、
最終的にはこの用語は否決されたっぽい?
fieldキーワードでバッキングフィールドができる。get;はget => field;の省略形で、set;はset => field = value;の省略形。↑これを全部「自動プロパティ」呼び。みたいな議論。
最終的な用語定義としては、
set; get;みたいな空っぽのアクセサーからのバッキングフィールド生成set;とかget;とかinit;」のことfieldキーワードを使ったプロパティC# 14 新機能としては「
fieldキーワード」呼びでよさげ。余談: value キーワード
プロパティ setter 内の
valueも完全にキーワード扱いにしようか(nameof(value)が非合法化)という話があったものの、それは否決されたっぽい。