2014-10-16 173 views
2

這似乎是我應該知道的東西,也許它工作正常,但它看起來不對我。我正在尋找從數據庫查詢中添加一些數據到一個列表中,我創建了一個自定義的屬性類來保存。自定義屬性添加到列表

我的類:

Public Class MyClass 
    Private _Col1 As String 
    Private _Col2 As String 
    Private _Col3(,) As Object 
    Private _Col4 As String 

    Public Property Col1() As String 
     Get 
      Return _Col1 
     End Get 
     Set(ByVal value As String) 
      _Col1 = value 
     End Set 
    End Property 

    Public Property Col2() As String 
     Get 
      Return Col2 
     End Get 
     Set(ByVal value As String) 
      Col2= value 
     End Set 
    End Property 

    Public Property Col3() As Object(,) 
     Get 
      Return Col3 
     End Get 
     Set(ByVal value As Object(,)) 
      Col3= value 
     End Set 
    End Property 

    Public Property Col4() As String 
     Get 
      Return Col4 
     End Get 
     Set(ByVal value As String) 
      _Col4= value 
     End Set 
    End Property 

    Sub New(ByVal col1 As String, ByVal col2 As String, ByVal col3 As Object, ByVal col4 As String) 
     _Col1= col1 
     _Col2= col2 
     _Col3 = col3 
     _Col4 = col4 

    End Sub 

End Class 

當我聲明並初始化我的列表(類),然後將數據添加到它:

Dim NList as New List(Of MyClass) 

NList.Add(New MyClass("1", "2", (1,3), "3")) 

當我看看列表項,我我在列表中看到8個項目,而不是4個。其中4個是方法,4個是變量。這是否正確以及類屬性如何操作?看來我正在通過向4個變量添加數據來浪費資源,並且如果必須循環訪問具有40k行的記錄集,我認爲它會增加性能。這是正確的方式嗎?我計劃將項目添加到列表中,並在程序的後面使用Find()函數,因此我覺得8個項目而不是4個是不需要的。

編輯:列表項

?NList.Item(0) 
    _Col1: "1" {String} 
    _Col2: "2" 
    _Col3: "(1,3)" 
    _Col4: "4" 
    Col3: "(1,3)" 
    Col4: "4" 
    Col1: "1" 
    Col2: "2" 
+2

當你'看看List項目,你正在查看MyClass的實例而不是列表中的項目,即一行代碼將添加一個項目到列表中,您可能會看到私有後臺字段以及屬性。 (每編輯)很明顯的情況:'_Col1'是你的私人支持字段,'Col1'是屬性。注意更新的VS版本允許自動實現的道具,這樣''公共屬性Col1()作爲字符串'是你在很多情況下所需要的,這將大大減少課程代碼 – Plutonix 2014-10-16 15:43:26

+0

這些都是在上課時被填充的嗎?如果我們遍歷行並將它們添加到此列表中,這是否會影響性能? – Criel 2014-10-16 15:49:25

+0

只有一件事是被設置的:'_col1',查看'Property Col1()'的代碼,它只是設置或返回相同的值 – Plutonix 2014-10-16 15:50:46

回答

1

在你的類:

Public Class MyClass 
    Private _Col1 As String ' private backing field to hold the value 

    ' interface to get/set that same value 
    Public Property Col1() As String 
     Get 
      Return _Col1 
     End Get 
     Set(ByVal value As String) 
      _Col1 = value 
     End Set 
    End Property 

你的類將只獲得該屬性值一個變量。在你調試,你看到這兩個後備字段和屬性界面:

?NList.Item(0) 
    _Col1: "1" {String}  <== backing field storing the value 
    ... 
    Col1: "1"     <== property 'exposing' _Col1 

請注意,您的類可以使用自動實現的屬性,並放棄明確的支持領域被大大簡化:

Public Class fooClass 
    Public Property Col1() As String 
    Public Property Col2() As String 
    Public Property Col3() As DateTime 
    Public Property Col4() As Integer 

    ' VS creates hidden backing fields you can still reference in the class: 
    Public Sub New(str As String ...) 
     _Col1 = str 
     ... 
    End Sub 
End Class 
2

這是完全正常的行爲。那些帶下劃線的變量是類的成員變量。他們實際上包含您的數據。另一方面,你的物業根本就沒有任何數據。你可以把它們看作是把你的成員變量返回給調用者的函數。你可以在你的直接提示中看到它們的返回值,因爲它們被視爲正常變量。

一起使用成員變量和屬性是編程.Net時的常用方法。 如果你沒有在你的屬性執行任何額外的代碼,你可以這樣寫:

Public Property MyProperty As SomeType 

在這種情況下,編譯器會自動生成一個無形的相應成員變量爲您服務。

1

我修改了一下你的示例代碼。也許這會有幫助?

Public Class TestClass 
    Public Property Col1 As String 
    Public Property Col2 As String 
    Public Property Col3 As Object 
    Public Property Col4 As String 
End Class 

項目添加到列表中這樣

Dim NList As New List(Of TestClass) 

    NList.Add(New TestClass With {.Col1 = "1", .Col2 = "2", .Col3 = "3", .Col4 = "4"}) 
    NList.Add(New TestClass With {.Col1 = "A", .Col2 = "B", .Col3 = "C", .Col4 = "D"})