2

我有一个 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

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# 中的对象初始值设定项语法在构造函数运行后设置属性。

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

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 };
于 2013-03-22T14:45:51.080 回答