0

任何人都可以准确解释为什么以下代码中的方法 1 不会改变其他 2 方法所做的 DataTable 吗?

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

IDEONE 的代码

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

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

4

1 回答 1

2

当您调用 时drFilters(1)=dr,您已经替换了DataRow过滤器集合中的引用,该集合是与自身中的行引用分开的集合DataTabledt.Rows是对DataRow对象的引用列表,原样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

希望这可以帮助!

于 2011-10-04T14:49:16.443 回答