2016-12-02 15 views
2

Javaでいくつかの関連する質問が見つかりましたが、C#では何も見つかりませんでしたので、重複を許してください。デフォルトのコンストラクタに変数を初期化するか、またはインラインで変数を初期化するかの違いはありますか?

短くて甘い、違いは何ですか?何かありますか?

public static class Foo 
{ 
    public static List<Bar> Bars; 

    static Foo() 
    { 
     Bars = new List<Bar>(); 
    } 
} 

public static class Foo 
{ 
    public static List<Bar> Bars = new List<Bar>(); 
} 

非スタティッククラスの場合の回答については、@Nick Gのコメントを参照してください。私はそれが静的クラスに何らかの影響を与えるかどうかを知りたいと思っています。

これで静的である必要はありません。この場合はどうですか?

public class Foo 
{ 
    public List<Bar> Bars; 

    public Foo() 
    { 
     Bars = new List<Bar>(); 
    } 
} 

public class Foo 
{ 
    public List<Bar> Bars = new List<Bar>(); 
} 

+0

[this](http://jonskeet.uk/csharp/constructors.html)によると、インスタンスイニシャライザが最初に実行され、次にコンストラクタが実行されるという違いがあります。 [静的フィールドの初期化](https://msdn.microsoft.com/en-us/library/aa645758(v = vs.71).aspx)と[インスタンスフィールドの初期化](https://msdn.microsoft .com/en-us/library/aa645759(v = vs.71).aspx)は両方とも、フィールドがコンストラクタの前に初期化されていることを示します。 [ここ](https://blogs.msdn.microsoft.com/ericlippert/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one/)も読んでください。 )継承情報のために。 – Quantic

+2

これはあなたの静的な質問に完全に答えないと思うが、助けになるかもしれない:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx –

+1

これをチェックする[記事](http://csharpindepth.com/Articles/General /Beforefieldinit.aspx)静的コンストラクタの存在にはわずかな意味があります。 – Rafal

答えて

1

いいえ、ありません、

ILによると、静的インライン初期化子はコンストラクタを使用して、何が起こったのかを参照してください。

1)静的インライン初期化子:

static class SomeClass 
{ 
    public static string strField = "Some String"; 

    static SomeClass() 
    { 

    } 
} 

IL

.method private hidebysig specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: ldstr  "Some String" 
    IL_0005: stsfld  string forStackoverflow.SomeClass::strField 
    IL_000a: nop 
    IL_000b: ret 
} // end of method SomeClass::.cctor 

2)コンストラクタ:

static class SomeClass 
{ 
    public static string strField; 

    static SomeClass() 
    { 
     strField = "Some String"; 
    } 
} 

IL

.method private hidebysig specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  12 (0xc) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "Some String" 
    IL_0006: stsfld  string forStackoverflow.SomeClass::strField 
    IL_000b: ret 
} // end of method SomeClass::.cctor 

ので、コンパイラビュー見通しから、いいえ、あります変わりはない。

+2

静的コンストラクターはここで問題になります – Rafal

+0

@Rafal:OK、テストを変更して回答 –

+0

を更新しましたが、正しくありません.Jon Skeetの記事をお読みください。 – Rafal

関連する問題