首先是什么,Constructor或With {}?

时间:2013-03-22 14:42:49

标签: c# .net vb.net

我有一个C#类,默认constructor设置属性默认值。然后,在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

3 个答案:

答案 0 :(得分:2)

无论你对对象做什么,构造函数总是先行。

答案 1 :(得分: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

答案 2 :(得分:0)

构造函数运行后object initializer syntax in C#设置属性。

以下两个代码段是等效的。

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

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

有人会使用第二种语法有多种原因,例如在以下赋值中避免使用单独的局部变量的能力。它还可以帮助澄清某些属性是用对象有意初始化的,并且在完成这些分配之前该对象不可用。

fieldFoo.GetFoo().NextFoo = new Foo { Property1 = "Yay!", Property2 = 100 };