C#オブジェクト初期化子を使用することに利点はありますか?
C++には参照はなく、すべてがオブジェクト内にカプセル化されているため、オブジェクトの作成後にメンバーを初期化する代わりにそれらを使用するのが理にかなっています。
C#で使用する場合はどうなりますか?
よく見落とされる利点の1つは、原子性です。これは、オブジェクトで double-checked locking を使用している場合に便利です。オブジェクト初期化子は、指定したすべてのメンバーを初期化した後、新しいオブジェクトを返します。 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
または完全に初期化されます。これはマルチスレッドのシナリオで役立ちます。
詳細については、 this の記事をご覧ください。
もう1つの利点は、匿名オブジェクトを作成できることです(たとえば、プロジェクションを作成したり、LINQの複数のキーに参加したりできます)。
notオブジェクト初期化子を使用する潜在的な理由があります:初期化中に例外がある場合、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)のプライベートセッターが必要な場合がありますが、これは設計によって異なります。
オブジェクトの初期化には3つの主な利点があります
多くのキーストロークを避けます。ソフトウェアプログラムの効率は、特定の機能を記述するために必要なキーストロークの数によって測定される場合があります。
読みやすく保守しやすい。
時間節約のアプローチ。
ここで多くのキーストロークを回避する方法を見てみましょう:
C#3.0以前は、次のような初期化を行っていました。
public class Employee
{
public string Name { get; set; }
public int Id { get; set; }
public string Department { get; set; }
public int salary { get; set; }
}
class Program
{
static void Main(string[] args)
{
Employee emp=new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.salary = 80000;
Console.ReadLine();
}
}
C#3.0の後、次のように1行で初期化します。
class Program
{
static void Main(string[] args)
{
Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};
}
}