gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:40:41 25 4
gpt4 key购买 nike

我正在测试在构造函数中调用虚拟成员的效果,并发现调用该成员时产生的异常包含在 TargetInvocationException 中。 .

根据docs这是:

The exception that is thrown by methods invoked through reflection

但是我不知道通过反射进行任何调用。那么这是否意味着虚拟成员总是通过反射调用?如果不是,为什么在这种情况下会这样?

代码:

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!
}
}

最佳答案

不,虚方法是通过virtual dispatch调用的.

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

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

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

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

更详细地了解为什么不应从构造函数调用虚拟方法 this SO question有一些有用的信息。埃里克·利珀特 (Eric Lippert) 也有一篇很好的博客文章说明为什么会这样 here .

关于c# - 虚拟成员是否通过反射调用(在正常情况下)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com