web-dev-qa-db-ja.com

Object Initializerを使用する利点はありますか?

C#オブジェクト初期化子を使用することに利点はありますか?

C++には参照はなく、すべてがオブジェクト内にカプセル化されているため、オブジェクトの作成後にメンバーを初期化する代わりにそれらを使用するのが理にかなっています。

C#で使用する場合はどうなりますか?

方法:オブジェクト初期化子を使用してオブジェクトを初期化する(C#プログラミングガイド)

52
wayfare

よく見落とされる利点の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の複数のキーに参加したりできます)。

104
Jon Senchyna

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";
    }
31
Geir Smestad

利点は、匿名オブジェクトの使用、linqクエリ、時にはパラメーターを渡すためだけのコンストラクターの不必要なオーバーロードです。

15
AD.Net

読みやすさを促進すると思います。

補足説明として、示されているリンクに示されている例では、プロパティ(FirstNameおよびLastName)のプライベートセッターが必要な場合がありますが、これは設計によって異なります。

1
Kirby

オブジェクトの初期化には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};        

        }  
    }  
0
Debendra Dash