私のアプリケーションでは次のようなリストを使用します。
List<MyClass> list = new List<MyClass>();
メソッドを使用するとAdd
、 の別のインスタンスMyClass
がリストに追加されます。
MyClass
次のようなメソッドを提供します。
public void SetId(String Id);
public String GetId();
MyClass
メソッドを使用して の特定のインスタンスを見つけるにはどうすればよいですかGetId
? メソッドがあることは知っていますFind
が、ここでそれが機能するかどうかはわかりません。
ベストアンサー1
ラムダ式を使用する
MyClass result = list.Find(x => x.GetId() == "xy");
注: C#にはプロパティの組み込み構文があります。getterとsetterを通常のメソッドとして記述する代わりに(Javaで慣れているように)、次のように記述します。
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
はsetアクセサの暗黙のパラメータです(ただし、これは今後変更される可能性があります)LDMC)。プロパティに割り当てられた値が含まれます。
このパターンはよく使われるため、C#では自動実装プロパティこれらは上記のコードの短縮版ですが、バッキング変数は非表示になっており、アクセスできません (ただし、VB のクラス内からはアクセスできます)。
public string Id { get; set; }
フィールドにアクセスするのと同じように、プロパティを簡単に使用できます。
var obj = new MyClass();
obj.Id = "xy"; // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id; // Calls the getter.
プロパティを使用すると、リスト内の項目を次のように検索できます。
MyClass result = list.Find(x => x.Id == "xy");
読み取り専用プロパティが必要な場合は、自動実装プロパティを使用することもできます。
public string Id { get; private set; }
これにより、クラス内では設定できますId
が、外部からは設定できません。派生クラスでも設定する必要がある場合は、セッターを保護することもできます。
public string Id { get; protected set; }
最後に、プロパティを として宣言しvirtual
、派生クラスでオーバーライドすることで、通常の仮想メソッドと同様に、ゲッターとセッターに異なる実装を提供できます。派生クラスでは、ゲッターのみ、またはセッターのみをオーバーライドできます。他のアクセサーは変更されずに継承されます。
C# 6.0 (Visual Studio 2015、Roslyn) 以降では、インライン初期化子を使用してゲッターのみの自動プロパティを記述できます。
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
代わりにコンストラクタ内でゲッターのみのプロパティを初期化することもできます。ゲッターのみの自動プロパティは真実プライベート セッターを持つ自動実装プロパティとは異なり、読み取り専用プロパティです。
これは、読み取り/書き込み自動プロパティでも機能します。
public string Id { get; set; } = "A07";
C# 6.0以降では、プロパティを式本体のメンバーとして記述することもできます。
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
見る:.NET コンパイラ プラットフォーム ("Roslyn")
C# の歴史 (バージョン履歴)
で始まりますC# 7.0ゲッターとセッターはどちらも式本体で記述できます。
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
この場合、セッターは式でなければならないことに注意してください。ステートメントにすることはできません。上記の例は、C# では代入を式としてもステートメントとしても使用できるため、機能します。代入式の値は、代入自体が副作用である代入値です。これにより、一度に複数の変数に値を割り当てることができます。はx = y = z = 0
と同等でありx = (y = (z = 0))
、ステートメントと同じ効果がありますz = 0; y = 0; x = 0;
。
C# 9.0 以降では、オブジェクト初期化子で初期化できる読み取り専用 (または、より適切には 1 回だけ初期化する) プロパティを使用できます。これは現在、ゲッターのみのプロパティでは不可能です。
public string Name { get; init; }
var c = new C { Name = "c-sharp" };
required
C# 11 以降では、クライアント コードを強制的に初期化するプロパティを使用できます。
このfield
キーワードは、C# の将来のバージョンで計画されており (C# 11 および C# 12 には組み込まれませんでした)、半自動実装プロパティで自動的に作成されたバッキング フィールドにアクセスできるようになります。
// Removes time part in setter
public DateTime HiredDate { get; init => field = value.Date(); }
public Data LazyData => field ??= new Data();