- PR -

ASP.NET にてshared function について教えてください

1
投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-03-16 15:18
いつもお世話になります

特定のxx.aspxの コードビハインド内(xx.aspx.vb)に
private function を定義するのと private shared function を定義するのと
違いが解りません。  いえいえ、shared をつけると共有プロシージャに
なるという事は解るのですが・・・・・
どの範囲内で共有されるのかが、見当もつかずに、不安です。

どこからか、コピーをしてきた物に、shared がついていて、
そのままテストをしていますが、スタンドアロンでの、IIS上で
テストをしているのですが、現状にて問題を見つけられません。
現在は、環境がなく、ネットワーク上での動作確認ができません。

同様に、自作クラス内にて、pubric fuction に sharedを定義すると
どんな目にあってしまうのでしょうか?
共有の定義が、理解できてないため、後で痛い目にあいそうで
不安です。

特定のイベント内にて、引数を渡してfunctionにて値を取得するのみなのですが・・・

他に、functionを使用して2種類の値を返す方法とかありますか?

すみませんが、ご教授の程、よろしくお願いします。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-16 15:48
NAL-6295です。

Sharedって言葉が混乱の元になっているのでしょう。
直接的に言えばStaticつまり静的なプロシージャという事です。
そのプロシージャの属するクラスのインスタンスを生成する必要が無く、
そのプロシージャの属するクラスのインスタンスが幾つ生成されても、
常に一つしか場所を確保しません。

コード:
Public Class TestClass
  Public Shared Value as Integer = 1
  Public Shared Function Test() as Integer 
    Value += 1
    return Value
  End Function
End Class



といったプロシージャがあり、クライアントからの要求A,Bがあったとして、

[A]TestClass.Test
[B]TestClass.Test
[A]TestClass.Test

と実行すると、それぞれ戻り値は

2 = [A]
3 = [B]
4 = [A]

となります。

ASP.NETにおいて、Sharedを使うという事は、全てのクライアントの要求がその「一つしか確保されていない場所」にアクセスしてしまうため、その中にSharedな変数が介在した時のみ結果が変わりますので、その点気をつける必要があります。

逆に、
コード:
Public Class TestClass
  Public Shared Function Sum(byval A as Integer ,Byval B as Integer) as Integer 
    return A + B
  End Function
End Class



といったように、内部で静的な変数を利用していない場合においては、気をつける必要はないでしょう。

#分かりにくかったらすいません。
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-03-16 17:50
NAL-6295さん ありがとうございます

引用:

NAL-6295さんの書き込み (2004-03-16 15:48) より:
逆に、
コード:
Public Class TestClass
  Public Shared Function Sum(byval A as Integer ,Byval B as Integer) as Integer 
    return A + B
  End Function
End Class



といったように、内部で静的な変数を利用していない場合においては、気をつける必要はないでしょう。

#分かりにくかったらすいません。



とんでもない! とても解りやすかったです。 ありがとうございます。

> 静的な変数を利用していない場合においては、
という所で、とても不安になってしまうのですが

コード:
Public Class TestClass
  Public Shared Function Sum(byval A as Integer ,Byval B as Integer) as Integer 
    If A = 1 THEN
       return A + B
    End If
  End Function
End Class



のようなコードを書いてしまったとした時(いい例が思い浮かばなくてすみません)
[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]

になると解釈してよろしいでしょうか?

他に、
コード:
Public Class TestClass
  Private Value as Integer = 1 −−−ここを"Public shared" から"Private"に変えた
  Public Shared Function Test() as Integer 
    Value += 1
    return Value
  End Function
End Class



[A]TestClass.Test
[B]TestClass.Test
[A]TestClass.Test

と実行すると、それぞれ戻り値は

2 = [A]
2 = [B]
3 = [A]

になるという事で、あってますでしょうか?

わざわざ、妙なコードを書くなと言われてしまいそうで 申し訳ないです
すみません よろしくお願い致します
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-16 17:57
引用:

七さんの書き込み (2004-03-16 17:50) より:

コード:

Public Class TestClass
Public Shared Function Sum(byval A as Integer ,Byval B as Integer) as Integer
If A = 1 THEN
return A + B
End If
End Function
End Class



のようなコードを書いてしまったとした時(いい例が思い浮かばなくてすみません)
[A]TestClass.Sum(1 ,5)
[B]TestClass.Sum(1 ,10)
[A]TestClass.Sum(2 ,5)
と実行すると、それぞれ戻り値は

6 = [A]
11 = [B]
11 = [A]



3つ目はNothingが正解です。

引用:

となり
Shared Function Sum でなく Shared Sum
であれば
6 = [A]
11 = [B]
nothing = [A]

になると解釈してよろしいでしょうか?



これの場合、Shared Sumという記述が出来ないと思います。
よってコンパイルエラーになります。


引用:


他に、
コード:

Public Class TestClass
Private Value as Integer = 1 −−−ここを"Public shared" から"Private"に変えた
Public Shared Function Test() as Integer
Value += 1
return Value
End Function
End Class



[A]TestClass.Test
[B]TestClass.Test
[A]TestClass.Test

と実行すると、それぞれ戻り値は

2 = [A]
2 = [B]
3 = [A]

になるという事で、あってますでしょうか?

わざわざ、妙なコードを書くなと言われてしまいそうで 申し訳ないです
すみません よろしくお願い致します




Sharedなプロシージャの中でSharedではないフィールドを使用する事が出来ないので、コンパイルエラーになります。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-03-16 17:59 ]
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-03-16 18:07
引用:

NAL-6295さんの書き込み (2004-03-16 17:57) より:

Sharedなプロシージャの中でSharedではないフィールドを使用する事が出来ないので、コンパイルエラーになります。



すみません ありがとうございます
安心しました。 今のところ、コンパイルエラーになるような
間違ったコードは書いていないようです
安心して、先に進めます。 ありがとうございました
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-03-16 18:29
コード:
Public Class TestClass
  Public Shared Function Sum(byval A as Integer ,Byval B as Integer) as Integer 
    If A = 1 THEN
       return A + B
    End If
  End Function
End Class


このメソッドのように、静的なフィールドを使用しないメソッドでは、共有メソッドだからといって、前後の呼び出しに影響を与えることはありません。また、メソッドの戻り値が覚えられているようなこともありません。
ですので、2回目でReturnを実行しなかったからといって、前回の値が返されるわけではありません(前回の値はどこにも覚えられてはいません)。
Sharedメソッドって言うのは、単にSharedなメンバにしかアクセスできない(代わりに、インスタンスが無くても呼び出せる)メソッドと思ったほうが良いと思います。
共有メソッドという名前だからといって、そのメソッドが具体的に何かを共有しているわけではありません。

まあ、Sharedなフィールドを持っているクラスの場合は、そのフィールドを共有しているといえるんですけどね。

ついでに、Returnを実行しなかった場合は、Integerであれば0が返されるはずです。
その型の既定の値です。クラス型の戻り値を持つメソッドであればNothingが返ります。
# 正直に言えば、エラーになってほしいです(間違いなくバグの元)。

とにかく、共有されるのは「共有フィールド」であり、メソッドそのものが何かを共有しているわけではないと思ってください。
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-03-16 20:20
なちゃさん ありがとうございます

引用:

なちゃさんの書き込み (2004-03-16 18:29) より:
ついでに、Returnを実行しなかった場合は、Integerであれば0が返されるはずです。
その型の既定の値です。クラス型の戻り値を持つメソッドであればNothingが返ります。
# 正直に言えば、エラーになってほしいです(間違いなくバグの元)。

とにかく、共有されるのは「共有フィールド」であり、メソッドそのものが何かを共有しているわけではないと思ってください。



>その型の既定の値です
 有難迷惑のような、きちんと、型クリアはされてしまうのですねえ
># 正直に言えば、エラーになってほしいです(間違いなくバグの元)。
 同感です

>メソッドそのものが何かを共有しているわけではない
 すっきりと、霧がはれました。 ありがとうございます。


1

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