• 初到贵宝地 望大家指教


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

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

    小弟这里谢了先~~~~  ^_^
  • 相关阅读:
    【python安装】错误——“User installations are disabled via policy on the machine”
    “金字塔原理”-写作
    【sublime】Pretty Json插件的安装与配置使用
    VMware卸载后再安装时网络连接处没有虚拟网卡
    2019-2020-2《网络对抗技术》Exp4 恶意代码分析
    2020课程设计 Week1 Asn.1格式的学习
    基于BouncyCastle的asn.1分析工具设计与实现的任务理解与分工
    2019-2020-2《网络对抗技术》Exp3 免杀原理与实践
    2019-2020-2 《网络对抗技术》Exp2 后门原理与实践
    2019-2020-2《网络对抗技术》Exp1 PC平台逆向破解
  • 原文地址:https://www.cnblogs.com/Jon/p/70728.html
Copyright © 2020-2023  润新知