** Q1: ** ** 值类型和引用类型的差别 **
** Q2: ** ** 值类型的装箱和拆箱 **
** Answer: **
** 装箱 ** 是将一个值类型转换为一个引用类型。例如:在 ArrayList 中 add 一个结构体的实例。
步骤:
1 从托管堆上为引用类型分配内存。内存的大小为值类型本身的大小加上其他的空间包括一个方法表和一个 SyncBlockIndex
2 值类型的字段被复制到托管堆上新分配的对象的内存中
3 返回托管堆中新分配对象的地址作为该对象的引用。
** 拆箱 ** 是为了获得托管堆上对象的元素到栈空间的值类型中。
1 获取在托管堆上的被装相的值类型的地址
2 从托管堆上复制到栈上的值类型中
用到 DirectCast 和 CType 静态方法
** Q3:DirectCast ** ** 和 CType ** ** 的区别 **
CType 在转型比 DirectCast 强。比如:一个 Int32 的值类型装箱为 Object ,拆箱的时候 DirectCast 只能从 Object 转型为 Int32( 作为拆箱的步骤可能更加安全 -- 没有多的转型 ) ,而 CType 则可以从 Object 转型为 Int16( 包括了拆箱和转型 2 个动作 )
** Q4: ** ** 类型构造器和实例构造器的区别 **
** Q5:MemberwiseClone ** ** 浅拷贝过程 **
uMemberwiseClone 创建与当前实例相同类型的新实例,然后复制原始对象的非静态字段。 如果字段为值类型的则为则对该字段执行逐位复制 。如果字段是引用类型,则复制该引用但不复制被引用的对象;这样,原始对象中的引用和复本中的引用指向同一个对象。
** 如何实现深拷贝? **
实现 IClonable 接口, Override 父类的 Clone() 函数
Public Function Clone() As Object Implements IClonable
一般的方法: New 一个要 clone 的新对象,将原对象中成员的值赋给新对象的成员,返回该新对象的引用。
较好的办法:将对象序列化到一个 System.IO.MemoryStream 中,然后立即对该内存流执行反序列化,从而得到一个新的对象。
** Q6:Module ** ** 与 Class ** ** 的区别 **
Module 实际上也是一种特殊的 Class 。该类的保护级是 Friend ,该类不包含任何实例构造器,可以防止创建它的实例,方法和变量都声明为 Shared 。
使用 Module 是为了实现模块外部代码对模块中的成员的访问。 2 来是为了早期 VB 代码移植的方便。
** Q7:VB.Net ** ** 中的参数传递 **
有两种一种是按值传递 ByVal ,一种是按引用传递 ByRef 。按值传递时候会拷贝一份原参数,引用则相当于别名。
** Q8:Structure ** ** 和 Class ** ** 的区别 **
1 结构是值类型,其实例是在栈上面分配的;而类的实例是在堆上分配的,其引用是在栈空间上。
2 结构不能被继承,类可以被继承。
3 结构的默认成员都为 Public ,并且其成员没有 Protected ,不能给变量声明指定初始值,不能定义默认拷贝构造函数和数组初始大小 ;类的变量和常量是 Private ,其他成员是 Public
4 结构从不终止,不会调用 Finalize 方法;
** 创建一个 Class ** ** 的实例和创建一个 Structure ** ** 实例的区别 **
结构是值类型,其实例是在栈上面分配的;而类的实例是在堆上分配的,其引用是在栈空间上。
** Q9: ** ** 如何保证系统中只有一个程序的实例在运行 **
1 首先获得当前程序在系统中的进程
2 用该进程的名称为参数,从系统中取得与该进程名称相等的所有存在的进程放在 Process 数组里面。
3 循环该 Process 数组,如果有 Process 的执行文件名和当前产生 Process 的文件名。如果有,则表明工程已经运行,退出即可,没有的话则继续执行。
** Q: ** ** 重写 Overrides ** ** 与重载 Overload ** ** 的区别 **
Overloads 是同一个类中对同名函数不同参数的重载
Overrides 是继承类中对父类中标示为 Overridable 的函数的重写,实现该函数在继承类中特有的功能
** Q:Shadows ** ** 的作用? **
当继承类中的方法被声明为 Shadows 的时候,会使父类中所有与该方法同名的函数被屏蔽掉,不继承在子类中
** Q: ** ** 抽象类 (MustInherit-MustOverride) ** ** 与接口 ( ** ** 的区别 **
抽象类不能被实例化只能被他的继承类实现,接口也不能被实例化,只能被 Implements 。
抽象类除了方法会 MustOverride 修饰外,其他和一般的类没有区别;接口的成员只能有嵌套类型、方法、属性和事件。
** Q:Equals **
** Q:String ** ** 和 StringBuilder ** ** 区别 **
这个区别有点类氏于 JAVA 中的 String 和 StringBuffer 的区别。
** Q: ** ** 模拟一个 ComboBox ** ** 接口 ? **
** Q: ** ** 标准事件处理程序 **
系统实例化一个有反映能力的学生,让他去逛商场,这个时候他有可能碰到很多人,当他看到 MM 的时候,他会流鼻血。
Module Module1
Class CStudent
Public Event SeeingMM
Sub Shopping
RaiseEvent SeeingMM()
End Sub
End Class
Sub stu_SeeingMM() Handles stu.SeeingMM ‘ 我们定义这个学生看到 MM 这个事件发生的
‘ 时候他就流鼻血
Console.Writeline(“ 流碧血 ”)
End Sub
WithEvents stu As New CStudent ‘1 系统实例化一个有反映能力的学生
Sub Main ()
Stu.Shopping() ‘2 让他去逛商场,
End Sub
End Module
** Q: ** ** 抽象类 (MustInherit-MustOverride) ** ** 与接口 ( ** ** 的区别 **
** Q: ** ** 抽象类 (MustInherit-MustOverride) ** ** 与接口 ( ** ** 的区别 **