IS运算符以及对象来自何处

时间:2012-07-05 06:26:49

标签: c#

我有其他人写的以下课程,我试图理解(我省略了这个例子不需要的代码):

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;
        }
...

编辑:(注意:在stackoverflow中,Page语句中的第一个if突出显示为蓝色,但在visual studio中则不是这样。

if语句中,intellisense显示第一个页面的类型为System.Web.UI.Page Control.Page,第二个Page来自Something.Products.Web.Page。当我通过代码调试时,它似乎没有进入这个if语句,所以我想知道这个代码试图做什么?但更重要的是,Page语句中的第一个if来自(初始化)?我正在使用Resharper,建议用

替换if语句
var page = Page as Page;
if (page != null)

此更改显示通过它进行调试时页面为空。

1 个答案:

答案 0 :(得分:2)

“第一页”实际上是您的抽象Page继承的UserControl类的UserControl属性。它的类型为System.Web.UI.Page,根据文档,返回

  

对包含服务器控件的Page实例的引用。

时,is关键字的计算结果为true
  

提供的表达式为非null,并且可以将提供的对象强制转换为提供的类型,而不会引发异常。

似乎在调试代码时,已检查的UserControl未包含在Something.Products.Web.Page类型的页面中。

关于Resharper建议:在您的原始代码中,您实际上有两次使用Page属性 - 首先是使用is关键字时,第二个是明确地投射它时。使用Resharper生成的代码,强制转换仅发生一次。当if语句的计算结果为true时,您可以确保page变量包含对Something.Products.Web.Page的引用,而不必再次强制转换它。