您的位置:首页 > 编程语言 > C#

CLR vir C# 之类型与成员基础

2008-09-03 17:30 246 查看
1.Class的可见性分为public和internal.

public:在任意assembly中可见,internal:仅在所在Assembly中可见。

如果不做定义,默认为Internal.

2.成员的访问级别

访问级别的定义在C#和CLR中的定义有所不同。

CLR术语C#术语
Privateprivate
Familyprotected
Family and Assembly不支持
Assemblyinternal
Family or Assemblyprotected internal
Publicpublic
成员默认为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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: