- PR -

[ASP.NET]サーバーサイドでの静的関数

1
投稿者投稿内容
会議室デビュー日: 2003/10/22
投稿数: 5
投稿日時: 2003-12-12 18:55
いつもお世話になっています。

非常〜〜〜に基本的な質問かもしれませんが、ご容赦ください。

現在書いているコードで、共通化できるSQLがあったので
その部分を別ファイルにして、関数をSharedで宣言しました。
Sharedで宣言しているので当然インスタンスを生成しません。

ここで、質問なのですが複数クライアントからのアクセスが重なったとき、
この関数内の変数等は破壊されてしまうのでしょうか?

そもそもの質問として、静的な関数というのはIIS上で一つという扱いになるのでしょうか?
それとも、ユーザーごと(セッションごと)に一つという扱いになるのでしょうか?

おバカな質問をしているかもしれませんが、
ご教授よろしく願います。

-------------------------------------------
Public Class Common
  Public Shared Function CreateSql(byval Para as string) as String
    Dim strSql as String
 
    Return strSql
  End Function
End Class
utama
会議室デビュー日: 2002/09/20
投稿数: 3
投稿日時: 2003-12-16 20:33
Shared だろうが、Shared でなかろうが、各関数内で宣言した
ローカル変数は、呼び出し毎に確保されます。
ですから、複数のスレッドから同時に呼び出されようが、
各スレッドごとにまったく独立して動作します。

関数定義の Shared というのは、その関数のアクセス方法を
宣言するもので、関数が一つしかないという意味ではありません。
そもそも、インスタンスをいくつ作ろうがメモリ上には、
関数のコードは一つずつしかありません。
会議室デビュー日: 2003/10/22
投稿数: 5
投稿日時: 2003-12-18 11:58
utamaさん、ご回答ありがとうございます。

引用:

Shared だろうが、Shared でなかろうが、各関数内で宣言した
ローカル変数は、呼び出し毎に確保されます。
ですから、複数のスレッドから同時に呼び出されようが、
各スレッドごとにまったく独立して動作します。

関数定義の Shared というのは、その関数のアクセス方法を
宣言するもので、関数が一つしかないという意味ではありません。


そういうことなんですか?
静的関数って実体は一つですよね?(と、いう風に大体の解説サイトに書かれているんですが)
ですから、ローカル変数の場合も変数が確保しなおされて、
前のものは消失すると考えていたんですが・・・


引用:

そもそも、インスタンスをいくつ作ろうがメモリ上には、
関数のコードは一つずつしかありません。


一つずつしかないのは、静的関数ですよね?
インスタンス関数(インスタンスメソッド)の場合は、各インスタンスごとに
生成されますよね?(違ってます?)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-12-18 12:16
引用:

竜さんの書き込み (2003-12-18 11:58) より:

静的関数って実体は一つですよね?(と、いう風に大体の解説サイトに書かれているんですが)
ですから、ローカル変数の場合も変数が確保しなおされて、
前のものは消失すると考えていたんですが・・・


引用:

そもそも、インスタンスをいくつ作ろうがメモリ上には、
関数のコードは一つずつしかありません。


一つずつしかないのは、静的関数ですよね?
インスタンス関数(インスタンスメソッド)の場合は、各インスタンスごとに
生成されますよね?(違ってます?)


竜さんが、プログラムの動作とかについてどの程度理解されているかによって説明が難しいのですが…

utama さんの仰っている関数が一つという表現は、関数本体のコード(実行されるプログラム自身というかなんというか)は、通常実際には一つしかないという意味です。
一方、竜さんの、インスタンスのメソッドは共有されないというのは、なんと言うのか、あくまでアクセスというか使い方に関する論理的な話です。

むしろ、メソッド自身が共有されるとかインスタンス毎に独立しているというよりは、メソッドからアクセスできるメンバが、各インスタンスの個別のメンバなのか、共有のメンバなのかという違いです。
※メソッドの使われ方が、あるインスタンスに紐づいているというか…

で、メソッド内で使われる「ローカル」変数は、静的メソッドだろうがインスタンスメソッドだろうが、実行される毎に独立しています。
ローカル変数は、実際にはメソッドの持ち物というよりは、スレッドの持ち物です(あぁ、余計にややこしいかも…)。

でないと複数のメソッドを同時に実行できないですよね?
# インスタンスのメソッドの場合でも同じ
1

スキルアップ/キャリアアップ(JOB@IT)