我发现如果我运行以下代码行.
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object
Run Code Online (Sandbox Code Playgroud)
没有拳击已经完成,但如果我调用i.GetType()(另一个派生函数System.Object)代替GetHashCode(),拳击将需要调用GetType(),为什么它不可能直接调用GetType()原始类型实例,没有拳击,而它可以调用GetHashCode()没有拳击?
IL提供了两个用于调用函数的语句,即call和callvirt。调用用于调用非虚拟或静态函数或编译器不想对引用进行空检查的任何函数。
callvirt用于调用虚拟函数,非虚拟函数也被调用,因为编译器会在运行时对引用进行空检查。
现在,当通过C#通过CLR时,我发现了以下示例。
internal class SomeClass
{
   public override String ToString()
   {
      return base.ToString();
   }
}
Run Code Online (Sandbox Code Playgroud)
现在ToString()是虚拟函数,但是编译器可以正常生成调用指令,但是Jeffrey提到了为什么不生成callvirt的原因,因为在这种情况下ToString()将被递归调用并将导致StackOverFlow异常,我试图理解,但无法将这个想法包住心?谁能解释为什么会导致递归调用?
谢谢..
如果我声明一个Object类的实例,我对一点感到困惑.这将在堆上保留,但是当我声明,这从System.ValueType派生的任何原语类型的实例是从对象类进一步衍生,然后由对象类所使用的它的部分也保留在堆栈中.
为什么会这样,或者Object类不占用空间?
实际上我想清楚,我应该首先做ASP.Net 2.0而不是移动到3.5和4.0?
要么
我从ASP.Net 3.5/4.0开始,大部分的ASP.Net 2.0也将在其中介绍,剩下的应该是我的后记吗?
我很担心,如果我开始报道ASP.Net 2.0,我会研究过时的东西吗?
哪种方法会更好,我是一位经验丰富的c#开发人员,我对Web开发有一点了解但我从未构建过专业的Web应用程序.
谢谢..
编辑:我知道已经有太多的学习问题这个事实,但我的具体是关于单点,涉及当事情快速变化时首先要覆盖的内容,我猜很多人可能面临同样的问题..