我有一个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
。
答案 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 };