2017-03-08 2 views
-1

x1とx2の初期化には違いはありますか?パラメータなしのコンストラクタを扱うとオブジェクト初期化子を使用して、任意の値を初期化していないときCでクラスをインスタンス化するときに()または{}を使用

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x1 = new C { }; 

      var x2 = new C(); 

     } 
    } 

    public class C 
    { 
     public int A; 
    } 
} 
+0

が定義だろうオブジェクト初期化フォーマットを使用して同等の「違い」を行うことができますパフォーマンスの違いをお探しですか?あなたがどちらかを使う理由?なぜ両方の理由が正当化されていますか? –

+3

興味のある方は、2つの構文の違いを知っていますか、2つの異なる呼び出しが許可される理由を理解していない質問の一部ですか? – Chris

答えて

3

中括弧{}は、オブジェクトまたはコレクション初期化のために使用されます。

new C() { Property1 = "Value", Property2 = "etc..." }; 

それはデフォルトコンストラクタであるとして、ここで()は、省略することができることに留意すべきです。したがって、new C{}は基本的にnew C() {}です。

4

いいえ、彼らはx2しかし、同じコード

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  14 (0xe) 
    .maxstack 1 
    .locals init ([0] class ConsoleApplication2.C x1, 
      [1] class ConsoleApplication2.C x2) 
    IL_0000: nop 
    IL_0001: newobj  instance void ConsoleApplication2.C::.ctor() 
    IL_0006: stloc.0 
    IL_0007: newobj  instance void ConsoleApplication2.C::.ctor() 
    IL_000c: stloc.1 
    IL_000d: ret 
} // end of method Program::Main 

にコンパイルし、標準的なコーディングスタイルです。

7

あなたの例では、違いはありません。どちらもデフォルトのコンストラクタを呼び出していて、値を渡すことはありません。 {}は、コンストラクタで渡されないパブリックプロパティの値を設定できるオブジェクトイニシャライザ表記法です。

Ex。次のクラスでは、PropertyAはコンストラクタを介して渡され、PropertyA、PropertyB、PropertyCはオブジェクトに対して設定可能です。

class TestClass 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
    public string PropertyC { get; set; } 

    public TestClass(string propertyA) 
    { 
     propertyA = propertyA; 
    } 
} 

あなたはすべての値を設定し、必要であれば、あなたはこの

var test1 = new TestClass("A"); 
test1.PropertyB = "B"; 
test1.PropertyC = "C"; 

それとも

var test2 = new TestClass("A") {PropertyB = "B", PropertyC = "C"}; 
関連する問題