2012-03-19 14 views
3

私はasp.netで構築された簡単なWebサイトを持っています。通常は、一度に1人または2人のユーザーしかいません。私の質問は、クラスレベルでクラスをインスタンス化することは大丈夫ですか、またはそれぞれのメソッドをインスタンス化する必要があります。ここに例があります。私は、名前フィールドとMacフィールドを持つHostという名前のクラスを持っています。特定のページの背後にある私のコードでは、これを行うにはOKです:クラスレベルの変数/オブジェクトは受け入れられますか?

public partial class addhosts : Page 
{ 
    private Host host = new Host(); 
    private HostDal dal = new HostDal(); 

    protected void myMethod() 
    { 
      host.Name = "myname" 
      host.Mac = "mymac" 
    } 

    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
      dal.AddHost(host) 
    } 
}   
+2

は、どのように動作させるかによって異なります。 – c0deNinja

答えて

2

あなたが参照しているものを第一には、より一般的にgloballocal対変数と呼ばれています。

あなたがリストアップした単純なケースでは、サブミットのクリックで変数を作成する方がよいでしょう。理由は、ユーザーがオブジェクトをロードしてもサブミット・クリックを呼び出さない場合、必要がないときにホスト・オブジェクトをメモリーにインスタンス化したためです。

しかし、多くの人が言っているように、は実際にはのどちらにも関係ありません。しかし、やはりこれは単純な例です。大域変数は危険であり、クラス内のどこからでも変更できるので、しばしば回避されます。 1つの方法は、その後、オーバーライドである一定の値を想定している場合、これは

私の上記のポイント改めて表明

Here is a wikipedia article、より複雑な例では、デバッグの問題に困難引き起こす可能性があります:彼らは通常からこその悪い習慣と考えられている

を彼ら 非局所性(それらが保護されたメモリに常駐さもなければ 読み取り専用レンダリングされない限り)、グローバル変数は、潜在的にどこ から変更することができ、プログラムのどの部分が

それに依存してもよいです

は、グローバルを取り除くために、あなたはそれは問題ではないはず

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
     var host = new Host 
      { 
       Name = "myname", 
       Mac = "mymac" 
      }; 
     dal.AddHost(host) 
} 
+0

ありがとう、私はこれが簡単な例であることを認識しています。私はより良い質問がこの悪い習慣だっただろうと思う。他にどのように私はsumbitメソッドにホスト情報を得ることができます私は別のメソッドの中でそれをインスタンス化した場合? – user1279156

+0

私はあなたのさらなる質問に答えるために私の答えを更新しました。 –

+0

もう一度レンチを投げても構いません。私はデータベースからホストで読み取ったページの読み込み、次にホスト名をテキストボックスに割り当て、ユーザーは名前を変更してからホストにデータベースを送り返すことができます。あなたの提案を使用して、私はインスタンス化するか、ページロード時と提出時に1回、ホスト2を別々に初期化する必要がありますか?一度やり直し、必要に応じて値を変更する方が理にかなっているようです。再度、感謝します。 – user1279156

0

ユーザーごとに新しいクラスが作成されるので、それは(デザインによってASP.NET)、完全に罰金です。別のスレッドにもあります。したがって、このシナリオでは静的変数でも許容されます。

乾杯、イワン

+0

これは本当ですか?テストページをばかにするつもりはありませんが、静的変数は異なるスレッド間でアクセス可能です。一般的に、静的変数にsomethignを格納すると、別のセッションでその変数を取得できます。 – Chris

+0

いいえicsarやOPは変数が静的であると言っていました!静的変数は異なる獣であり、アプリケーションプール全体に存続します。 OPの例では、addhostページのリクエストが来るたびに、そのクラスの新しいインスタンスが作成されます。変数はクラスレベルにあり、したがって各ユーザーの要求には独自のインスタンスがあります。 –

+0

"このシナリオでは静的変数でも許容されるでしょう" - icesar。その行は真実ではありません。 – Servy

1

(オブジェクト初期化子を使用して)これを行うことができます。

あなたのページへの各リクエストは別々のものであり、他のリクエストを知らないため、他のリクエストと「競合する」可能性はありません。

1

ユーザー固有のデータをASP.Netページインスタンス内のフィールドとして使用することは完全に問題ありません。ページを訪問するたびにPageクラスの新しいインスタンスが作成されるため、ユーザー間でデータが間違って共有されるという状況にはなりません。

関連する問題