关于静态方法
来源:互联网 发布:淘宝小号怎么找回来 编辑:程序博客网 时间:2024/04/30 13:26
对于初学OOP的人,静态方法是个不大不小的问题。在此,做个粗浅说明。
1. 静态方法是类方法,调用时不需要创建类实例。
2. 静态方法是静态绑定到子类,不是被继承。
为了形象说明,请看下面的例子。
接下来,我们查看编译后的IL代码就会明白其中的奥妙。
CLR提供了2个IL指令来调用方法:call和callvirt。其中call指令根据引用变量的类型(即引用变量的静态类型、声明类型)来调用一个方法,而callvirt指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。
1. 静态方法是类方法,调用时不需要创建类实例。
2. 静态方法是静态绑定到子类,不是被继承。
为了形象说明,请看下面的例子。
namespace Test.CUI
{
class Base
{
public Base()
{
Console.WriteLine("Base...");
}
public void Method()
{
}
public static void StaticMethod()
{
}
}
class Class1 : Base
{
public Class1()
{
Console.WriteLine("Class1...");
}
static void Test1()
{
Class1 o = new Class1();
o.Method();
}
static void Test2()
{
Class1.StaticMethod();
}
static void Main(string[] args)
{
}
}
}
{
class Base
{
public Base()
{
Console.WriteLine("Base...");
}
public void Method()
{
}
public static void StaticMethod()
{
}
}
class Class1 : Base
{
public Class1()
{
Console.WriteLine("Class1...");
}
static void Test1()
{
Class1 o = new Class1();
o.Method();
}
static void Test2()
{
Class1.StaticMethod();
}
static void Main(string[] args)
{
}
}
}
接下来,我们查看编译后的IL代码就会明白其中的奥妙。
.method private hidebysig static void Test1() cil managed
{
// Code Size: 13 byte(s)
.maxstack 1
.locals (
Test.CUI.Class1 class1)
L_0000: newobj instance void Test.CUI.Class1::.ctor() // 创建对象实例
L_0005: stloc.0
L_0006: ldloc.0
L_0007: callvirt instance void Test.CUI.Base::Method() // 使用callvirt
L_000c: ret
}
.method private hidebysig static void Test2() cil managed
{
// Code Size: 7 byte(s)
.maxstack 0
L_0000: call void Test.CUI.Base::StaticMethod() // 使用call
L_0005: nop
L_0006: ret
}
{
// Code Size: 13 byte(s)
.maxstack 1
.locals (
Test.CUI.Class1 class1)
L_0000: newobj instance void Test.CUI.Class1::.ctor() // 创建对象实例
L_0005: stloc.0
L_0006: ldloc.0
L_0007: callvirt instance void Test.CUI.Base::Method() // 使用callvirt
L_000c: ret
}
.method private hidebysig static void Test2() cil managed
{
// Code Size: 7 byte(s)
.maxstack 0
L_0000: call void Test.CUI.Base::StaticMethod() // 使用call
L_0005: nop
L_0006: ret
}
CLR提供了2个IL指令来调用方法:call和callvirt。其中call指令根据引用变量的类型(即引用变量的静态类型、声明类型)来调用一个方法,而callvirt指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态成员或静态方法
- 关于静态类和静态方法
- 关于ognl调用静态方法
- 关于静态方法的覆盖
- 关于静态方法,self,cls
- 关于静态变量、静态常量与静态方法
- 关于静态方法和非静态方法的心得
- 关于静态方法与非静态方法的执行效率
- 关于静态块,静态方法,非静态方法,构造方法执行的顺序
- 关于静态方法的小问题
- 关于类静态方法的小tip
- 关于静态方法的使用心得
- 关于JavaScript的gzip静态压缩方法
- UML类图(类之间的关系)
- 关于将临时变量置为null是否有助于快速垃圾回收
- 判断全/半角问题
- C# 2.0 - 泛型(Generics)
- 将分页作为一个单独的控件
- 关于静态方法
- dataset
- 在.Net如何制作自定义的快捷方式(转)
- Google即将开始深度Web索引
- 一套.net窗体身份验证方案(解决了防止用户重复登陆,session超时等问题)
- ABAP Get SAP Login Name and Windows Domain User Name.
- 程序员创业,不要把风险带给家人!
- C#编程规范(2008年4月新版)
- ThreadStatic