调用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()");
}
}
}
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()");
}
}
}
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 ([0] class ConsoleApplication2.B b,
[1] class 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
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 62 (0x3e)
.maxstack 1
.locals init ([0] class ConsoleApplication2.B b,
[1] class 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;
notifyIcon1.Visible = true;
小弟这里谢了先~~~~ ^_^