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の行参照とは別のコレクションです。はそのままオブジェクトへの参照のリストですが、参照の 1 つのリストのエントリを変更しても、他の参照のリストにはまったく影響しません。DataTabledt.RowsDataRowdrFilters()

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 に答える