解释为什么不更改此DataRow

时间:2011-10-04 14:39:24

标签: .net vb.net reference datarow object-reference

有人能解释为什么以下代码中的方法1不会改变其他2种方法所做的DataTable吗?

这显然是某种引用问题,但为什么呢?

CODE AT IDEONE HERE

Imports System
Imports System.Data

Public Class Test

        Public Shared Sub Main()
                'Build Table
                Dim dt as New DataTable
                dt.Columns.Add("ID",GetType(String))
                dt.Columns.Add("Name",GetType(String))

                'Populate Table
                Dim dr as DataRow
                dr = dt.NewRow()
                dr("ID")="Man" : dr("Name") = "mike" : dt.Rows.Add(dr)
                dr = dt.NewRow()
                dr("ID")="Man" : dr("Name") = "ian" : dt.Rows.Add(dr)
                dr = dt.NewRow()
                dr("ID")="Man" : dr("Name") = "rob" : dt.Rows.Add(dr)
                dr = dt.NewRow()
                dr("ID")="Woman" : dr("Name") = "ann" : dt.Rows.Add(dr)
                dr = dt.NewRow()
                dr("ID")="Woman" : dr("Name") = "sam" : dt.Rows.Add(dr)

                output(dt)      'Output Table

                Dim drFilters() as DataRow = dt.Select("ID='Man'")      'Select all Man

                'Method 1 does not change dt
                'dr = dt.NewRow()
                'dr("ID")="cowman" : dr("Name")="bugle"
                'drFilters(1)=dr

                'Method 2 does change dt
                dr = drFilters(1)
                dr("ID")="cowman" : dr("Name")="bugle"

                'Method 3 does change dt
                'drFilters(1)("ID")="cowman" : drFilters(1)("Name")="bugle"

                output(dt)    'Output final table
        End Sub

        Public Shared Sub output(dt as DataTable)
                for each dr as DataRow in dt.Rows
                        Console.WriteLine(dr("ID") + vbTab + dr("Name"))
                Next
                Console.WriteLine("")
        End Sub

End Class

为愚蠢的测试数据道歉:)

1 个答案:

答案 0 :(得分:2)

当您致电drFilters(1)=dr时,您已替换过滤器集合中的DataRow引用,该引用是DataTable本身中行引用的单独集合。 dt.RowsDataRow个对象的引用列表,drFilters()也是如此,但更改一个引用列表中的条目不会以任何方式影响其他引用列表。

dt.Rows
0 => dt.Rows(0)
1 => dt.Rows(1)
2 => dt.Rows(2)
3 => dt.Rows(3)
4 => dt.Rows(4)

drFilter()
0 => dt.Rows(0)
1 => dt.Rows(1)
2 => dt.Rows(2)

调用drFilters(1)=dr后,集合看起来像这样

dt.Rows
0 => dt.Rows(0)
1 => dt.Rows(1)
2 => dt.Rows(2)
3 => dt.Rows(3)
4 => dt.Rows(4)

drFilter()
0 => dt.Rows(0)
1 => dr
2 => dt.Rows(2)

请注意,dt.Rows保持不变。但是,当您检索对象drFilters(1)并对其进行更改时,您会直接引用dt.Rows(1),因此对其属性的更改会反映在dt的输出中。

希望这有帮助!