初到贵宝地 望大家指教

初到贵宝地 望大家指教~~~~~~~

调用C#的类对象中的方法时,我这里除了静态(static)方法的调用产生的IL是call ,其他的都是callvirt,希望那位可以指教一下。下面是一个例子。
using System;

namespace ConsoleApplication2
{

    
class Class1
    
{

        [STAThread]
        
static void Main(string[] args)
        
{
            B b 
= new B();
            b.virtualprint ();
            b.novirtualprint ();
            D d 
=new D();
            d.virtualprint();
            d.novirtualprint();
            D.staticlprint ();
            C c 
= new C();
            c.novirtualprint ();
            C.staticlprint ();

        }

    }

    
public class B
    
{
        
int i;
        
virtual public void virtualprint()
        
{
            Console.WriteLine(i);
        }

        
public void novirtualprint()
        
{
            Console.WriteLine(i);
        }

    }

    
sealed public class D :B
    
{
        
public static void staticlprint()
        
{
            Console.WriteLine (
"new staticlprint()");
        }

        
public override void virtualprint()
        
{
            
base.virtualprint ();
        }

        
new public void novirtualprint()
        
{
            Console.WriteLine (
"new novirtualprint()");
        }

        
    }


    
public struct  C
    
{
        
public void novirtualprint()
        
{
            Console.WriteLine (
"struct  C novirtualprint()");
        }

        
public static void staticlprint()
        
{
            Console.WriteLine (
"struct  C staticlprint()");
        }

                
    }

}

产生的IL代码:
Main中的
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  .custom instance 
void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
  
// Code size       62 (0x3e)
  .maxstack  1
  .locals init ([
0class ConsoleApplication2.B b,
           [
1class ConsoleApplication2.D d,
           [
2] valuetype ConsoleApplication2.C c)
  IL_0000:  newobj     instance 
void ConsoleApplication2.B::.ctor()
  IL_0005:  stloc.
0
  IL_0006:  ldloc.
0
  IL_0007:  callvirt   instance 
void ConsoleApplication2.B::virtualprint()
  IL_000c:  ldloc.
0
  IL_000d:  callvirt   instance 
void ConsoleApplication2.B::novirtualprint()
  IL_0012:  newobj     instance 
void ConsoleApplication2.D::.ctor()
  IL_0017:  stloc.
1
  IL_0018:  ldloc.
1
  IL_0019:  callvirt   instance 
void ConsoleApplication2.B::virtualprint()
  IL_001e:  ldloc.
1
  IL_001f:   callvirt   instance 
void ConsoleApplication2.D::novirtualprint()
  IL_0024:  call       
void ConsoleApplication2.D::staticlprint()  //class中为static的方法
  IL_0029:  ldloca.s   c
  IL_002b:  initobj    ConsoleApplication2.C
  IL_0031:  ldloca.s   c
  IL_0033:  call       instance 
void ConsoleApplication2.C::novirtualprint() //struct中的方法
  IL_0038:  call       
void ConsoleApplication2.C::staticlprint() //struct中的方法
  IL_003d:  ret
}
 // end of method Class1::Main

其中只有在struct中的方法调用和在class中为static的方法调用生成的指令是call ,其余的均为callvirt,我有些想不明白。
即使把class 声明为sealed仍是如此。
我用的是csc版本号是7.10.3052.4,用的Microsoft Visual Studio .NET 2003下标准的Debug配置编译的。
不知道如何才能在类中实现"非虚函数"(在方法调用产生call指令,而不是callvirt),是不是在编译选项上需要改动??
望高手执教~~~~~

另外还有一个问题(和这个关系不大), 在窗体最小化的时候,激发什么事件?
也就是怎样在最小化时,实现托盘效果
this.ShowInTaskbar = false;
notifyIcon1.Visible 
= true;
这两句该加到那个事件中??

小弟这里谢了先~~~~  ^_^
原文地址:https://www.cnblogs.com/Jon/p/70728.html