C# オブジェクト初期化子を使用する利点はありますか?
C++ には参照がなく、すべてがオブジェクト内にカプセル化されているため、オブジェクトの作成後にメンバーを初期化する代わりにそれらを使用することは理にかなっています。
C# でそれらを使用する場合はどうなりますか?
C# オブジェクト初期化子を使用する利点はありますか?
C++ には参照がなく、すべてがオブジェクト内にカプセル化されているため、オブジェクトの作成後にメンバーを初期化する代わりにそれらを使用することは理にかなっています。
C# でそれらを使用する場合はどうなりますか?
見逃しがちな利点の 1 つは原子性です。これは、オブジェクトでダブルチェック ロックを使用している場合に便利です。オブジェクト初期化子は、指定したすべてのメンバーを初期化した後、新しいオブジェクトを返します。MSDN 記事の例から:
StudentName student = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
次のようなものに翻訳されます。
StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;
StudentName student = _tempStudent;
これにより、student
が部分的に初期化されることはありません。これはnull
、マルチスレッドのシナリオで役立つ、または完全に初期化されます。
詳細については、この記事をご覧ください。
もう 1 つの利点は、匿名オブジェクトを作成できることです (たとえば、射影を作成したり、LINQ で複数のキーに結合したりできます)。
オブジェクト初期化子を使用しない理由が考えられ ます。初期化中に例外が発生した場合、Visual Studio デバッガーのコール スタックは初期化式のみを返し、例外が発生した特定の行は返しません。
不適切な名前の例外を持つライブラリまたは外部サービスを使用する場合、または代わりに、例外をスローするコードが表示されないネイティブ コード (Android の Xamarin など) でライブラリを使用する場合、オブジェクト初期化子によってコードのデバッグが難しくなる可能性があります。例外がスローされた原因となったパラメーターがわかりません。
例: これは自分のコードですが、アプリケーションの外部にあるため、ExternalService のソースを読み取ることができないとします。ExternalService でエラーの原因となったのが「charlie」パラメーターであったことはわかりません。
var instance = new ClassToBeInitialized
{
alpha = "alpha",
bravo = ExternalService(0),
charlie = ExternalService(1)
};
private static string ExternalService(int parameter)
{
if (parameter == 1)
{
throw new Exception("The external service crashed");
}
return "correctStringResult";
}
利点は、匿名オブジェクト、linq クエリ、時にはパラメーターを渡すためだけにコンストラクターを不必要にオーバーロードすることです。
可読性を高めていると思います。
補足として、示されているリンクに示されている例では、プロパティ (FirstName と LastName) のプライベート セッターを使用することを好む場合がありますが、これは設計によって異なります。