CLR vir C# 之类型与成员基础
2008-09-03 17:30
246 查看
1.Class的可见性分为public和internal.
public:在任意assembly中可见,internal:仅在所在Assembly中可见。
如果不做定义,默认为Internal.
2.成员的访问级别
访问级别的定义在C#和CLR中的定义有所不同。
成员默认为Private(私有)。
对于继承关系的类之间,C#规定继承类重写父类方法,访问级别必须一致。而CLR则没有此限制,只要求重写方法的访问级别高于虚方法即可。
3.静态类
Static用来定义静态类。静态类通常用来定义一组具有相同使命的方法(或属性等成员),这些方法当然必须都是静态的,public的。
比如Math, Console等类的使用。
Static只能用于Class,不能用于Struct.
静态类不能被实例化,直接继承与System.Object.不能实现任何接口;
从MSIL可见,静态类编译为IL后,以abstract sealed定义出现。
4.部分类,结构,接口
通常在出现下面情况时,会用到partial关键字。
1)多人同时开发时。此时可把一个类,写在多个文件中,供多人同时开发。
2)winform, webform的实现机制。当我们拖动控件时,vs帮我们把自动生成的代码放在单独的文件中(.desinger.cs),而对于后台编程代码放在另一个单独文件中,单可以看到,他们是属于一个类的,用Partial标记。
要说明的是,partial只在C#中定义,CLR不知道它的存在。所以同一类型的源码应该用统一编程语言实现。
5.IL指令:Call,Callvirt
可以在类型中定义静态方法,虚方法,实例方法。
当在程序中调用这些方法时,会在IL中调用相应的IL指令。
通常,call指令可以调用静态方法,虚方法,实例方法;callvirt可以调用虚方法和实例方法,callvirt调用前会进行为空性检查,性能比call要差些。
C#中,静态方法由call调用,虚方法和实例方法由callvirt调用。
Code
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] class Demo1.Aclass a)
L_0000: nop
L_0001: call void Demo1.Aclass::f()
L_0006: nop
L_0007: newobj instance void Demo1.Aclass::.ctor()
L_000c: stloc.0
L_000d: ldloc.0
L_000e: callvirt instance void Demo1.Aclass::f1()
L_0013: nop
L_0014: ldloc.0
L_0015: callvirt instance void Demo1.Aclass::f2()
L_001a: nop
L_001b: ret
}
public:在任意assembly中可见,internal:仅在所在Assembly中可见。
如果不做定义,默认为Internal.
2.成员的访问级别
访问级别的定义在C#和CLR中的定义有所不同。
CLR术语 | C#术语 |
Private | private |
Family | protected |
Family and Assembly | 不支持 |
Assembly | internal |
Family or Assembly | protected internal |
Public | public |
对于继承关系的类之间,C#规定继承类重写父类方法,访问级别必须一致。而CLR则没有此限制,只要求重写方法的访问级别高于虚方法即可。
3.静态类
Static用来定义静态类。静态类通常用来定义一组具有相同使命的方法(或属性等成员),这些方法当然必须都是静态的,public的。
比如Math, Console等类的使用。
Static只能用于Class,不能用于Struct.
静态类不能被实例化,直接继承与System.Object.不能实现任何接口;
从MSIL可见,静态类编译为IL后,以abstract sealed定义出现。
4.部分类,结构,接口
通常在出现下面情况时,会用到partial关键字。
1)多人同时开发时。此时可把一个类,写在多个文件中,供多人同时开发。
2)winform, webform的实现机制。当我们拖动控件时,vs帮我们把自动生成的代码放在单独的文件中(.desinger.cs),而对于后台编程代码放在另一个单独文件中,单可以看到,他们是属于一个类的,用Partial标记。
要说明的是,partial只在C#中定义,CLR不知道它的存在。所以同一类型的源码应该用统一编程语言实现。
5.IL指令:Call,Callvirt
可以在类型中定义静态方法,虚方法,实例方法。
当在程序中调用这些方法时,会在IL中调用相应的IL指令。
通常,call指令可以调用静态方法,虚方法,实例方法;callvirt可以调用虚方法和实例方法,callvirt调用前会进行为空性检查,性能比call要差些。
C#中,静态方法由call调用,虚方法和实例方法由callvirt调用。
Code
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] class Demo1.Aclass a)
L_0000: nop
L_0001: call void Demo1.Aclass::f()
L_0006: nop
L_0007: newobj instance void Demo1.Aclass::.ctor()
L_000c: stloc.0
L_000d: ldloc.0
L_000e: callvirt instance void Demo1.Aclass::f1()
L_0013: nop
L_0014: ldloc.0
L_0015: callvirt instance void Demo1.Aclass::f2()
L_001a: nop
L_001b: ret
}
相关文章推荐
- [CLR via C#]6. 类型和成员基础
- 类型和成员基础(CLR via C#)
- 《CLR via C#》读书笔记 之 类型和成员基础
- 带着问题读CLR via C#(五)类型和成员基础
- 《CLR via C#》读书笔记---06 类型和成员基础
- <NET CLR via c# 第4版>笔记 第6章 类型和成员基础
- 《CLR via C#》读书笔记(6)类型和成员基础
- [CLR via C#]6. 类型和成员基础
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
- CLR VIA C# 6 类型和类型成员基础
- 【C#进阶系列】06 类型和成员基础
- 《CLR via C#》读书笔记 之 类型基础
- C#基础之类型和成员基础以及常量、字段、属性
- 《CLR via C#:框架设计》读书笔记 - 类型基础
- 初读CLR Via C# 之类型基础(二)程序运行时的关系
- CLR Via C# 第四章 类型基础——读书笔记
- 《CLR Via C#》 学习心得之二 类型基础
- 《CLR via C#》笔记——类型基础
- C# 基础-CLR-类型【0】
- C# 类型和成员基础以及常量、字段、属性