C# 首先是什么,构造函数还是{}?

C# 首先是什么,构造函数还是{}?,c#,.net,vb.net,C#,.net,Vb.net,我有一个C#类,其中默认的构造函数设置属性的默认值。然后,在VB.Net项目中,我创建了一个实例,并使用带有{}的从数据库中填充它 我的问题是,构造函数是先发生的,还是应该先发生? 我看到一些奇怪的东西,并试图找出从哪里开始寻找 缩写代码 public class Contact { public Guid ID {get; set;} public DateTime? InactiveDate {get; set;} public Contact() { this.

我有一个C#类,其中默认的
构造函数设置属性的默认值。然后,在VB.Net项目中,我创建了一个实例,并使用带有{}
从数据库中填充它

我的问题是,构造函数是先发生的,还是应该先发生? 我看到一些奇怪的东西,并试图找出从哪里开始寻找


缩写代码

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

属性

以下两个代码段是等效的

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 };

无论您对对象做什么,构造函数都将始终位于第一位。

构造函数位于第一位。当名称应用时,它发生在首次构造对象时,通常发生在设置属性/字段之前

您可以通过一个简单的控制台应用程序看到这一点

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

你能发布你的代码吗?并解释什么是怪异的意思!:)无论初始化对象的属性是什么以及如何初始化,对象的构造函数总是首先进行。如果对象在构造对象之前尝试分配属性。会导致空引用的Surley?添加了代码。下面是一个让我疑惑的链接-->
以下两个代码片段是等效的。
嗯,不完全是这样,它们有区别,只是与这个问题无关。也就是说,在第二种情况下,对象首先存储在一个临时变量中,
x
在所有属性都设置好之前不会被设置;这在多线程应用程序中具有原子性的含义。@Servy你在试图偷偷摸摸,但我也很狡猾。。)只有当
x
是局部变量时,我的代码在语法上才是正确的。由于构造函数和将值赋给
属性2
之间没有向其他代码公开,因此其他代码无法检测到这两个赋值的语义差异,使它们在语义上是等效的。除非此代码段存在于try块中。在这种情况下,设置属性时出现异常,前一种情况下会有一个部分初始化的x,后一种情况下会有一个空的x。@tcarvin
x
在这种情况下将超出范围并且无法访问。啊,是的,您是对的!不过,值得一提的是,对于未来的读者来说,使用对象初始值设定项有一个重要的行为差异。而且,构造函数在C#项目中,其余的是VB.Net,这并不重要吗?“我在这里读了一个问题,以便让我思考这条路,看看我是否能找到链接。”折射圣骑士好吧,答案的目的仍然适用。试试看,看看你是否真的那么好奇。这很容易检查。