ASP.NET ページのページはどこから派生しているか?

ASP.NET ページはコンパイルされて実行されます。 スクリプト言語ではなく、コンパイルが必要な C# や VB.NET を使っているので、 裏側でどうしてもそうした処理が必要になります。

ここでは、ASP.NET ページがコンパイルされる様子と、そのコンパイルの状況からいくつか実験をしてみようと思います。

ASP.NET ページの型を見る

次のようなページを利用して、ASPX ファイルが実際にどのような型になるか確認してみましょう。
このページは getTypes.aspx という名前にしました。

<%@ Page Language="C#" %>
<html>
<body>
    <p style="font-size:large;">
    <%
     Type t;

     t = this.GetType();
          
     while(true) {

          Response.Write( t.ToString() + "<br>" );

          if ( t == typeof( System.Object ) ) {
               break;
          }

          t = t.BaseType;

     };      
    %>
    </p>
</body>
</html>

出力は次のようになります。

ASP.NET ページの型をチェックの出力結果

  • ASP.gettypes_aspx
  • System.Web.UI.Page
  • System.Web.UI.TemplateControl
  • System.Web.UI.Control
  • System.Object

これはコールスタックならぬ、派生スタック(?)とでもいいましょうか、上から下に向かってその親クラスが出力されています。

上の結果から getTypes.aspx というページは、ASP.gettypes_aspx という型 (クラス) のオブジェクトとして実行されたことがわかります。 そして、ASP.gettypes_aspx は System.Web.UI.Page から派生され、さらに System.Web.UI.TemplateControl、 System.Web.UI.Control、System.Object と続きます。

別ファイルにコードを書く (コードビハインド) 場合

上の例では ASPX ファイルに直接 C# コードを記述しましたが、次は、コードを ASPX とは別のファイルに記述した場合 (コードビハインドの場合) はどうなるかみてみましょう。

C# のコードを次のように記述し、getTypes2.aspx.cs として保存します。

using System;

namespace MyTest {
     public partial class getTypes2 : System.Web.UI.Page {

          public void ShowType() {
               Type t;
               t = this.GetType();
               
               while ( true ) {
                    Response.Write( t.ToString() + "<br>" );
                    if ( t == typeof( System.Object ) ) {
                         break;
                    }
                    t = t.BaseType;
               };
          }
     }
}

これを利用する ASPX ページを次のように記述し、getTypes2.aspx とします。

<%@ Page 
	Language="C#" 
	CodeFile="~/getTypes2.aspx.cs" 
	Inherits="MyTest.getTypes2"
%>
<html>
<body>
    <p style="font-size:large;">
    <% ShowType(); %>
    </p>
</body>
</html>

C# で定義したクラス getType2 は System.Web.UI.Page から派生してますし、ASPX ファイルのディレクティブで Inherits キーワードでクラスを指定しているなど、このコードの書き方からクラスの継承関係は自明といえば自明ですが・・・
ともあれ、試した結果は次のとおりです。

ASP.NET ページの型をチェックの出力結果

コードファイルで定義したクラスは、ASPX で自動作成されるクラスの親クラスとなっていることが確認できました。

以上から、コードビハインドで作成したコードは ASPX の親クラスになるんだなぁ、というよく知られた結果になるわけですが・・・
よく見ると、コードビハインドで作成したクラス定義は partial 指定になっています。

partial ということは、もうひとつ以上、このクラスを定義するのに必要なファイルがあるはずです。 この点についてもう少し調べてみましょう。

» コードビハインドで定義するクラスはなぜ partial なの?

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 ASP.NET 入門