一、const 与 readonly 以及static readonly的区别。
const:const是常量;readonly是实例只读变量;static readonly是静态只读变量
区别可以从以下几个方面分析:
1、内存分配
const是常量,C#编译器编译源代码时,会将const常量直接编译成IL代码,因此,它不存在分配内存的问题。
readonly
修饰只读实例字段时,只能在调用构造函数时才能对它进行初始化,而调用构造函数对它初始化,必然涉及到内存分配问题。readonly只能在对象除此创建时写入数值,除非用反射来修改readonly字段。
当readonly前面加static关键字变成static
readonly时,该变量变成静态只读字段,此时,它是类型状态的一部分,在该变量所在类型加载到应用程序域时,会为他在动态内存内分配内存。
2、地址(指针)
由1知,const常量在编译时是直接嵌入代码的,因此在运行时就不需要为常量分配任何内存,因此它的地址我们也就无法得知,也就不能通过引用传递常量。
而readonly加在变量前面变成实例只读字段时,该变量会在对象调用构造函数的过程中为它分配内存,因此它也就有实实在在的地址(指针)。
static
readonly修饰变量时,该变量是静态只读字段,在类型加载时会给他分配内存,因此该变量也是有指针的。
二、.NET平台语言与其他非托管语言的交互问题。
二、.NET平台语言与其他非托管语言的交互问题。
.NET平台中的C#与其他非托管代码互操作性问题主要存在以下是哪个方面。
1、C#调用非托管代码:
托管语言调用非托管代码时,.NET平台提供了一种P(Plat)/Invoke的机制,以供.NET平台语言调用非托管代码。
2、C#调用COM组件,也就是其他公司做成的DLL等COM组件:
.NET平台语言调用其他非托管代码写成的COM组件时,.NET会创建一个托管程序集来描述COM组件,提供对COM组件的元数据描述,这样C#等托管代码就可以像调用托管的DLL组件一样使用它。
3、非托管代码调用托管代码写成的组件:
这个具体机制是什么,不得而知。
4、C++
对于vs上的C++,它本身就可以被编译成托管代码,以用来交互,只要其遵循CLS规范。