0

私は理解しようとしている他の誰かによって書かれた次のクラスを持っています (この例には必要のないコードを省略しました):

public abstract class UserControl : System.Web.UI.UserControl
{
       ...

        public virtual bool IsAadmin(TheUser theUser)
        {
            if (Page is Page)
                return ((Page)Page).IsAadmin(theUser);

            return false;
        }
...

編集:(注:stackoverflowPageでは、ifステートメントの最初の部分が青色で強調表示されますが、ビジュアルスタジオではそうではありません)

ifステートメント intellisense は、最初の Page がタイプSystem.Web.UI.Page Control.Pageであり、2 番目Pageが fromであることを示していSomething.Products.Web.Pageます。コードをデバッグすると、このステートメントに入らないように見えるifので、このコードが何をしようとしているのだろうか? しかし、もっと重要なことPageは、ifステートメントの最初の部分がどこから来ているか (初期化されているか) です。私は使用していますが、ステートメントを次Resharperのように置き換えることをお勧めしますif

var page = Page as Page;
if (page != null)

この変更は、デバッグ時にページが null であることを示しています。

4

1 に答える 1

2

「最初のページ」は、実際には抽象が継承するクラスのPageプロパティです。それはタイプであり、ドキュメントに従って、戻りますUserControlUserControlSystem.Web.UI.Page

サーバー コントロールを含む Page インスタンスへの参照。

isキーワードは、次の場合に true と評価されます。

提供された式は null ではなく、提供されたオブジェクトは、例外をスローすることなく、提供された型にキャストできます。

コードをデバッグしているときに、調べUserControlた はタイプのページに含まれていなかったようSomething.Products.Web.Pageです。

Resharper の提案について: 元のコードでは、Pageプロパティを効果的に 2 回キャストしています。最初はisキーワードを使用するとき、次に明示的にキャストするときです。Resharper によって生成されたコードでは、キャストは 1 回だけ発生します。ifステートメントが true と評価された場合、変数が への参照を保持していることを確認でき、再度pageキャストSomething.Products.Web.Pageする必要はありません。

于 2012-07-05T06:32:20.803 に答える