- PR -

ASP.NETのアクセス修飾子について - private ではいけないの?

1
投稿者投稿内容
kamiari
会議室デビュー日: 2006/01/11
投稿数: 4
投稿日時: 2006-08-22 11:23
いつも参考にさせていただき大変助かっております。

ASP.NETのコードを作成するとき、イベントハンドラのアクセシビリティレベルは自動作成時に protected になりますが、どうして protected なのでしょうか? private ではいけないのでしょうか。
変数やメソッドも protected にされているのがほとんどのようですが、どういう意味なのか分からないでいます。

MSDNでは以下のように説明されていますが、ASP.NETの場合ではまだよく理解できません。

引用:
protected:アクセスは、コンテナ クラス、またはコンテナ クラスから派生した型に制限されます。
private:アクセスはコンテナ型に制限されます




protected は、簡単に言うと自身のクラスか、自身から派生したクラスからのアクセスが可能になる、ということだと思うのですが、だとすればコード(ページ)を継承して使う必要がなければ private にしてもいいように感じます。

試しにPage_Loadのイベントハンドラのアクセシビリティレベルを private にした単純なページを動かしてみても問題なく表示されます。私はよくページ内のメソッドやローカル変数はprivateにしています。

とても初歩的なことかも知れませんが教えてください。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-08-22 12:06
コードビハインドを利用している場合、コードのクラスとaspxページは継承関係を
使うことでうまく動作するようになっています。
コードが書いてあるクラスが親となり、aspxページがその子となりますので、
aspx側から呼ばれる変数やメソッドはprotectedでないと動かないと思います。
コードからしか呼ばれないメソッドやローカル変数はたしかにprivateで何の問題も
ないでしょうね。

Page_Loadは。。。なんでだろ。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-22 12:11
自動生成されるイベントハンドラは private じゃないですか?

「変数が protected になっている」の「変数」がコントロールの事を指しているなら、

ASP.NET 1.x
Default.aspx.cs <- Default.aspx = 実行時に生成されるページクラス

ASP.NET 2.0
Default.aspx.cs + Default.aspx <- 実行時に生成されるページクラス

といった継承構造になるので、「実行時に生成されるページクラス」がそれらの変数を参照しなければならないからです。
自分で継承をしていない気でも継承している箇所があるという事ですね。

#修正

[ メッセージ編集済み 編集者: 囚人 編集日時 2006-08-22 12:25 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-08-22 12:50
2.0でも
Default.aspx.cs <- Default.aspx

という継承構造は変わってないですね。
パーシャルクラスになったことで変わったと私も勘違いしていたのですが、実際には
Default.aspxからパーシャルクラスの一部とそれを継承するクラスの2つのクラスが
生成されて実行されるものになります。

Default.aspx.cs + Default.aspx1 <- Default.aspx2

イメージとしてはこんな感じになるかな。
kamiari
会議室デビュー日: 2006/01/11
投稿数: 4
投稿日時: 2006-08-22 14:17
どっとねっとふぁん様
囚人様

早速のお返事ありがとうございます。
継承関係を説明していただいたので、だいぶ考え方が掴めてきました。

パーシャルクラスのことも含めてもう少し動作を調べてみたところ、どっとねっとふぁん様がおっしゃるように、コードページとデザインページ間のアクセスでは protected が必要になるようですね。

たとえば、
デザインページに宣言しているコントロールのイベントハンドラ(ボタンクリックなど)をコードページ上で宣言する場合のイベントハンドラや、
デザインページに宣言したイベントハンドラ内で、コードページに宣言した変数にアクセスする場合の変数には、protected が必要でした。

また、
コードページで宣言したコントロールのイベントハンドラを同ページ上で宣言する場合や、
コードページで宣言しているイベントハンドラ内からアクセスする同ページ上のコントロール変数には、private でも動作しました。

パーシャルクラスといっても、分離されているコード間のアクセスでは protected が必要ということでしょうか。

引用:
自動生成されるイベントハンドラは private じゃないですか?


私の環境(Visual Web Developer 2005 Express)では、Page_Load や Button1_Click などは protected で自動生成されます。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-22 23:50
引用:

2.0でも
Default.aspx.cs <- Default.aspx

という継承構造は変わってないですね。


そうでしたか。
http://www.microsoft.com/japan/msdn/vs05/aspnet/migratefromaspnetto2.aspx
ここの図3のイメージだったので、先のように理解していたのですが、自動生成されるソースファイルをよく見ると確かにどっとねっとふぁんさんの仰る通りです。ありがとうございます。

引用:

パーシャルクラスといっても、分離されているコード間のアクセスでは protected が必要ということでしょうか。


パーシャルといっても、パーシャル部分はどうやらコントロール変数の定義しかなされていないようです。イベントハンドラをイベントにインストールするコードなどは、更に派生したクラスにありました。

C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\Temporary ASP.NET Files\\

ここに自動生成されるソースコードを読むと理解できました。ご参考まで。(C:\\Windows かどうかは環境次第)

引用:

私の環境(Visual Web Developer 2005 Express)では、Page_Load や Button1_Click などは protected で自動生成されます。


確かにそうですね。失礼しました。
Page_Load のアクセス修飾子は他のイベントハンドラに合わせた、という事でしょうか。
Page_Load が呼ばれるのは、AutoEventWireup が true になっているせいで、kamiari さんの仰るとおり、private でも全然問題ないですね。
_________________
囚人のジレンマな日々
1

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