なぜApplicationCacheは、値の代わりに後方参照を渡していますか?
-
23-08-2019 - |
質問
これは、私はちょうどに実行した奇妙なことです。
私は、データが頻繁に変更されないルックアップテーブルであるため、別々にクエリの量を減らすためにApplicationCacheに保存されている小型のDataTableを使用したWebアプリケーションを持っています。
私は与えられたページ以内に2回このデータテーブルにアクセスします。
:一度私のPage_Loadメソッドで、ドロップダウンリストにデータをバインドしますdtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.Sort = "LongDescription ASC"
ddlDeptDivAccount.DataSource = dtDeptDivAct.DefaultView
ddlDeptDivAccount.DataTextField = "LongDescription"
ddlDeptDivAccount.DataValueField = "Id"
ddlDeptDivAccount.DataBind()
インデックスは私のddlDeptDivAct_SelectedIndexChangedイベントで選択されている場合、...と一度テーブルから追加データを取得します:
Dim dtDeptDivAct As DeptDivActDataTable
If ddlDeptDivAccount.SelectedIndex > 0 Then
dtDeptDivAct = GetAllDeptDivActCodes()
dtDeptDivAct.DefaultView.RowFilter = "Id = " & ddlDeptDivAccount.SelectedValue
txtAddFundingDept.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Department.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingDiv.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Division.ToString.PadLeft(2, Char.Parse("0"))
txtAddFundingAct.Text = DirectCast(dtDeptDivAct.DefaultView(0).Row, DeptDivActRow).Activity.ToString.PadLeft(3, Char.Parse("0"))
Else
txtAddFundingDept.Text = ""
txtAddFundingDiv.Text = ""
txtAddFundingAct.Text = ""
End If
注:GetAllDeptDivActCodes()メソッドApplicationCacheオブジェクトからテーブルを返す簡単な方法である
。Webページが正常に動作します。私は私の値を選択することができ、適切な値をテキストボックスにinstertedされています。しかし、私は別のページに移動し、このページに戻り来るとき。ダウンリスト私のドロップのみ選択可能な1つの値を持つ。
私は、デバッガをプルアップすると、私はGetAllDeptDivActCodesメソッドは、キャッシュからのDataTableを返すときに、Webページに戻ったときに、[既定のRowFilterプロパティはまだ問題を引き起こしていたのDataTableに適用されたことに気づきました。
私は単に処理後に[既定のRowFilterをリセットすることによって、今の問題を修正しましたSelectedIndexChangedイベントで行われるが、なぜアプリケーションは、私が期待していたときにアプリケーションキャッシュ内のDataTableへの参照であると思われるもの戻っていますオブジェクトの別々のコピー(または値)?
解決
これは仕様によるものです。あなたがアプリケーション状態またはセッション状態にオブジェクトを格納するたびに、あなたがそれにアクセスするときは、実際のオブジェクト(またはあなたがそれをオブジェクトへの参照を置くように)返されます。特に指定しない限り、設計の.NETオブジェクトによって、ほとんど常に参照によって渡されます。これらは、参照によって渡される関数にオブジェクトを渡すときForexampleます。