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

    小弟这里谢了先~~~~  ^_^
  • 相关阅读:
    Shiro 学习笔记(Realm)
    Shiro 学习笔记(Authentication)
    Shiro 学习笔记(基本结构)
    POI 示例(导入,导出)
    SpringBoot 整合POI
    解决使用drf-haystack报错ImportError: cannot import name get_count
    python实现冒泡排序和插入排序
    九大排序算法总结(转)
    Djaong 数据库查询
    django session 和cookie的设置,获取和删除
  • 原文地址:https://www.cnblogs.com/Jon/p/70728.html
Copyright © 2011-2022 走看看