2009-07-15 7 views
4

私は最近、ASP.netアプリケーション内でSessionオブジェクトまたはApplicationオブジェクトを使用すると、参照によって値が渡されることを発見しました。asp.netアプリケーション変数は参照または値で渡されますか?

これは時間の大部分を占めていますが、処理が完了した時点で変更を破棄するため、データのコピーが必要な場所にあります。

私はまた、アプリケーションのルートに変数を設定することで、より良いパフォーマンスを持つグローバルアプリケーション変数を効果的に作成し、Session/Applicationオブジェクトのキャストクレイジーさをすべて排除することに気付きました。

アプリケーション変数が参照渡しか値渡しかを知りませんか?トピックのデータを掘り起こすことができず、現在Applicationオブジェクトのデータを新しい変数に「コピー」して処理するコードを削除したいと考えています。

答えて

4

これはASP.NET現象ではありません。それは、.NETフレームワークのすべてのCLIに固有のものです。あなたはJon Skeetの古典article on Parameter passingを見てください。

参照型を扱っていると仮定すると、単にオブジェクトへの参照をコピーするのではなく、オブジェクトを複製する場合は、手動で複製する必要があります。 Here's a good articleでは、オブジェクトをディープコピーする方法と、オブジェクトが浅いコピーのみを作成する理由について説明しています。

3

実際には、値のタイプではなく参照タイプがあると仮定すると、のコピーが渡されます。

異なる変数がありますが、同じオブジェクトを指しています。

+0

ああ、私はそれを知らなかった!説明をありがとう。完了時に変更を破棄できるようにオブジェクトをクローンする方法はありますか? –

+0

いいえ、おそらく、あなたの手作業のコピーコードを保持する必要があります。 .Netには実装可能なIClonableインターフェイスが含まれていますが、あまりうまくいきません。 .MemberWiseClone()メソッドもありますが、それは本当に深いコピーを作成しません。 –

0

"Application"変数は単なるメンバー変数です。他の変数と同じように機能しますが、スコープは大部分よりも大きいです。

変数の値がコピーされるかどうかは、変数が値型かどうかによって異なります。

値タイプの場合、たとえばintの場合、値は常にコピーされます。

参照型の場合は、たとえばList<int>のように、オブジェクトへの参照のコピーを取得します。オブジェクト自体はコピーされません。

したがって、コピーする必要があるものが参照型である場合は、そのコピーを明示的に作成する必要があります。

+0

ああ、この特定のケースでは、私はリストで作業しています。これまではDataTablesで作業していました。 –

関連する問題