zoukankan      html  css  js  c++  java
  • 初到贵宝地 望大家指教

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

    调用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;
    这两句该加到那个事件中??

    小弟这里谢了先~~~~  ^_^
  • 相关阅读:
    2020.10.23 19级training 补题报告
    2020.10.17 天梯赛练习 补题报告
    2020.10.16 19级training 补题报告
    2020.10.9 19级training 补题报告
    2020.10.10 天梯赛练习 补题报告
    2020.10.3 天梯赛练习 补题报告
    2020.10.2 19级training 补题报告
    第十届山东省ACM省赛复现补题报告
    VVDI Key Tool Plus Adds VW Passat 2015 Key via OBD
    Xhorse VVDI Prog Software V5.0.3 Adds Many MCUs
  • 原文地址:https://www.cnblogs.com/Jon/p/70728.html
Copyright © 2011-2022 走看看