2013-03-22 53 views
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

+6

您可以發佈您的代碼? – Inisheer 2013-03-22 14:43:50

+1

並解釋奇怪的意思! :) – Dave 2013-03-22 14:44:11

+2

一個對象的構造函數總是先走,不管它是什麼,它的屬性是如何初始化的。 – 2013-03-22 14:44:32

回答

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

'以下兩個代碼片段是等效的。「呃,不完全是,有差異,它們只是與這個問題無關。即在第二種情況下,對象首先存儲在一個臨時變量中,並且在設置所有屬性之前不會設置「x」;這在多線程應用程序中具有原子性含義。 – Servy 2013-03-22 14:53:31

+0

@Servy你想要偷偷摸摸,但我也很微妙。 ;)如果'x'是一個局部變量,我的代碼在語法上只是正確的。由於它沒有暴露給構造函數之間的其他代碼併爲'Property2'賦值,這兩個賦值的語義差別不能被其他代碼檢測到,使它們在語義上是等價的。 – 2013-03-22 14:56:44

+0

除非這段代碼存在於try塊中。在這種情況下,設置屬性時的例外情況會使您在前者中使用部分初始化的x,而在後者中使用零x。 – tcarvin 2013-03-22 17:00:03

2

無論你對對象做什麼,構造函數總是先走。

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 
+0

並且construtor是在C#項目中而其餘的是VB.Net並不重要?我在這裏讀過一個關於這個問題的問題,讓我思考這條道路,看看我能否找到鏈接。 – 2013-03-22 14:57:20

+1

@RefractedPaladin那麼,答案的目的仍然適用。嘗試一下,看看你是否真的好奇。檢查很容易。 – Servy 2013-03-22 14:59:02

相關問題