有人能解释为什么以下代码中的方法1不会改变其他2种方法所做的DataTable吗?
这显然是某种引用问题,但为什么呢?
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
为愚蠢的测试数据道歉:)
答案 0 :(得分:2)
当您致电drFilters(1)=dr
时,您已替换过滤器集合中的DataRow
引用,该引用是DataTable
本身中行引用的单独集合。 dt.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
的输出中。
希望这有帮助!