繁体   English   中英

虚拟成员是通过反射调用的(在正常情况下)?

[英]Are virtual members called via reflection (in normal circumstances)?

我正在测试在构造函数中调用虚拟成员的效果, TargetInvocationException调用该成员时,生成的异常被包装在TargetInvocationException

根据文档,这是:

由反射调用的方法抛出的异常

但是我没有意识到通过反射的任何调用。 那么这是否意味着虚拟成员总是通过反射来调用? 如果没有,为什么在这种情况下呢?

代码:

class ClassA
    {
        public ClassA()
        {
            SplitTheWords();
        }

        public virtual void SplitTheWords()
        {
            //I've been overidden
        }
    }

class ClassB : ClassA
    {
        private readonly String _output;

        public ClassB()
        {
            _output = "Constructor has occured";
        }

        public override void SplitTheWords()
        {
            String[] something = _output.Split(new[]{' '}); //TargetInvocationException!
        }
    }

不,通过虚拟调度调用虚方法。

这里没有使用反思。 并且它也不适用于任何虚拟方法调用。 我相信异常的文档有点误导,因为通过反射调用的方法抛出了这种类型异常,但并非如此。

如果有人对为什么问题中的代码给出异常感到好奇,那是因为构造函数的执行顺序。 ClassB构造函数与以下内容相同:

public ClassB() : base()
{
    _output = "Constructor has occured";
}

注意对base()的调用,它在运行ClassB构造函数之前调用基本构造函数,因此在分配_output之前调用。 SplitTheWords虚方法在基础构造函数中调用,该方法解析为ClassB.SplitTheWords 此方法尝试使用_output ,因此错误。

为了更详细地了解为什么不应该从构造函数调用虚方法, 这个SO问题有一些有用的信息。 埃里克利珀也对为什么是这样的情况下,一个很好的博客文章在这里

虚拟成员是通过反射调用的(在正常情况下)?

没有。

也不是来自构造函数,所以还有其他事情正在发生。 这将有助于查看代码调用您显示的代码以及异常的堆栈跟踪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM