- - PR -
ASP.NET にてshared function について教えてください
1
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-16 15:18
いつもお世話になります
特定のxx.aspxの コードビハインド内(xx.aspx.vb)に private function を定義するのと private shared function を定義するのと 違いが解りません。 いえいえ、shared をつけると共有プロシージャに なるという事は解るのですが・・・・・ どの範囲内で共有されるのかが、見当もつかずに、不安です。 どこからか、コピーをしてきた物に、shared がついていて、 そのままテストをしていますが、スタンドアロンでの、IIS上で テストをしているのですが、現状にて問題を見つけられません。 現在は、環境がなく、ネットワーク上での動作確認ができません。 同様に、自作クラス内にて、pubric fuction に sharedを定義すると どんな目にあってしまうのでしょうか? 共有の定義が、理解できてないため、後で痛い目にあいそうで 不安です。 特定のイベント内にて、引数を渡してfunctionにて値を取得するのみなのですが・・・ 他に、functionを使用して2種類の値を返す方法とかありますか? すみませんが、ご教授の程、よろしくお願いします。 | ||||||||||||||||||||
|
投稿日時: 2004-03-16 15:48
NAL-6295です。
Sharedって言葉が混乱の元になっているのでしょう。 直接的に言えばStaticつまり静的なプロシージャという事です。 そのプロシージャの属するクラスのインスタンスを生成する必要が無く、 そのプロシージャの属するクラスのインスタンスが幾つ生成されても、 常に一つしか場所を確保しません。
といったプロシージャがあり、クライアントからの要求A,Bがあったとして、 [A]TestClass.Test [B]TestClass.Test [A]TestClass.Test と実行すると、それぞれ戻り値は 2 = [A] 3 = [B] 4 = [A] となります。 ASP.NETにおいて、Sharedを使うという事は、全てのクライアントの要求がその「一つしか確保されていない場所」にアクセスしてしまうため、その中にSharedな変数が介在した時のみ結果が変わりますので、その点気をつける必要があります。 逆に、
といったように、内部で静的な変数を利用していない場合においては、気をつける必要はないでしょう。 #分かりにくかったらすいません。 | ||||||||||||||||||||
|
投稿日時: 2004-03-16 17:50
NAL-6295さん ありがとうございます
とんでもない! とても解りやすかったです。 ありがとうございます。 > 静的な変数を利用していない場合においては、 という所で、とても不安になってしまうのですが
のようなコードを書いてしまったとした時(いい例が思い浮かばなくてすみません) [A]TestClass.Sum(1 ,5) [B]TestClass.Sum(1 ,10) [A]TestClass.Sum(2 ,5) と実行すると、それぞれ戻り値は 6 = [A] 11 = [B] 11 = [A] となり Shared Function Sum でなく Shared Sum であれば 6 = [A] 11 = [B] nothing = [A] になると解釈してよろしいでしょうか? 他に、
[A]TestClass.Test [B]TestClass.Test [A]TestClass.Test と実行すると、それぞれ戻り値は 2 = [A] 2 = [B] 3 = [A] になるという事で、あってますでしょうか? わざわざ、妙なコードを書くなと言われてしまいそうで 申し訳ないです すみません よろしくお願い致します | ||||||||||||||||||||
|
投稿日時: 2004-03-16 17:57
3つ目はNothingが正解です。
これの場合、Shared Sumという記述が出来ないと思います。 よってコンパイルエラーになります。
Sharedなプロシージャの中でSharedではないフィールドを使用する事が出来ないので、コンパイルエラーになります。 [ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-03-16 17:59 ] | ||||||||||||||||||||
|
投稿日時: 2004-03-16 18:07
すみません ありがとうございます 安心しました。 今のところ、コンパイルエラーになるような 間違ったコードは書いていないようです 安心して、先に進めます。 ありがとうございました | ||||||||||||||||||||
|
投稿日時: 2004-03-16 18:29
このメソッドのように、静的なフィールドを使用しないメソッドでは、共有メソッドだからといって、前後の呼び出しに影響を与えることはありません。また、メソッドの戻り値が覚えられているようなこともありません。 ですので、2回目でReturnを実行しなかったからといって、前回の値が返されるわけではありません(前回の値はどこにも覚えられてはいません)。 Sharedメソッドって言うのは、単にSharedなメンバにしかアクセスできない(代わりに、インスタンスが無くても呼び出せる)メソッドと思ったほうが良いと思います。 共有メソッドという名前だからといって、そのメソッドが具体的に何かを共有しているわけではありません。 まあ、Sharedなフィールドを持っているクラスの場合は、そのフィールドを共有しているといえるんですけどね。 ついでに、Returnを実行しなかった場合は、Integerであれば0が返されるはずです。 その型の既定の値です。クラス型の戻り値を持つメソッドであればNothingが返ります。 # 正直に言えば、エラーになってほしいです(間違いなくバグの元)。 とにかく、共有されるのは「共有フィールド」であり、メソッドそのものが何かを共有しているわけではないと思ってください。 | ||||||||||||||||||||
|
投稿日時: 2004-03-16 20:20
なちゃさん ありがとうございます
>その型の既定の値です 有難迷惑のような、きちんと、型クリアはされてしまうのですねえ ># 正直に言えば、エラーになってほしいです(間違いなくバグの元)。 同感です >メソッドそのものが何かを共有しているわけではない すっきりと、霧がはれました。 ありがとうございます。 |
1