2

constructorデフォルトでプロパティのデフォルト値が設定される C# クラスがあります。次に、VB.Net プロジェクトでインスタンスを作成し、With{}.

私の質問は、コンストラクターが最初に発生するか、それともそうすべきかということです。私は何か奇妙なものを見て、どこから探し始めるべきかを理解しようとしています。


短縮コード

public class Contact
{
  public Guid ID {get; set;}
  public DateTime? InactiveDate {get; set;}

  public Contact()
  {
    this.ID = Guid.NewGuid();
    this.InactiveDate = null;
  }
}

Public Shared Function GetContact(ByVal contactID As Guid) As Models.Contact
  Dim results As Models.Contact = context.tblContacts.Where(Function(c) c.ID = contactID _
  .Select(Function(c) New Models.Contact() With { .ID = c.ID, .InactiveDate = c.InactiveDate}).SingleOrDefault()

  Return results
End Function 

私が見ているのは、InactiveDateに設定されていることnullです。

4

3 に答える 3

2

オブジェクトで何をしても、コンストラクターは常に最初に実行されます。

于 2013-03-22T14:45:57.077 に答える
1

コンストラクターが最初に発生します。名前が適用されるように、プロパティ/フィールドを設定する前に常に発生するオブジェクトが最初に構築されるときに発生します。

これは、単純なコンソール アプリケーションで確認できます。

Module Module1

    Sub Main()
        Dim n As New N()

        With n
            n.S = "This"
        End With

        Console.ReadKey()
    End Sub


    Class N
        Public Property S As String
            Get

            End Get
            Set(value As String)
                Console.WriteLine("Setter") //written second
            End Set
        End Property

        Sub New()
            Console.WriteLine("Constructor") //written first
        End Sub
    End Class
End Module
于 2013-03-22T14:50:13.840 に答える
0

C#のオブジェクト初期化構文は、コンストラクターの実行後にプロパティを設定します。

次の 2 つのコード スニペットは同等です。

Foo x = new Foo();
x.Property1 = "Yay!";
x.Property2 = 100;

Foo x = new Foo()
{
    Property1 = "Yay!",
    Property2 = 100
};

誰かが 2 番目の構文を使用する理由はさまざまです。たとえば、次の代入で別のローカル変数を使用することを避けることができるためです。また、特定のプロパティがオブジェクトで意図的に初期化されており、それらの割り当てが完了するまでオブジェクトを使用できないことを明確にするのにも役立ちます。

fieldFoo.GetFoo().NextFoo = new Foo { Property1 = "Yay!", Property2 = 100 };
于 2013-03-22T14:45:51.080 に答える