CLR如何调用虚方法、属性和事件】的更多相关文章

方法代表在类型或类型的实例上执行某些操作的代码.在类型上执行操作,称为静态方法:在类型的实例上执行操作,称为非静态方法.任何方法都有一个名称.一个签名和一个返回值(可以是void). CLR允许一个类型定义多个同名方法,只要每个方法都有一组不同的参数或者一个不同的返回值.所以,完全可以定义两个同名.同参数的方法,只要两者的返回类型不同.但是,除了IL汇编语言,我没有发现任何一个利用了这个“特点”的语言.大多数语言,在判断方法的唯一性是,除了方法名之外,都只以参数为依据,方法的返回类型会被忽略.…
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态成为可能. 然而虚方法的使用却存在着很大学问,如果滥用的话势必对程序产生很大的负面影响.比如下面这个例子: public class Puzzle { public Puzzle() { Name = "Virtual member call in constructor"; Solve(…
CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的行为.归根结底,这是由于调虚方法时,直到运行时之前,都不会选择执行该方法的实际类型. 在MSDN中,也给我我们详细的提示和范例. https://msdn.microsoft.com/en-us/library/ms182331.aspx 那我们就亲手来测试一下,新建两个类,Perople类,Chi…
请看下面代码: using System; public class A{ public A(){ M1(); } public virtual void M1(){} } public class B : A{ private string _method; public B(){ _method = "B_C"; } public override void M1(){ Console.WriteLine("Type:{0}, in B, {1}",GetTyp…
无参属性 许多类型都定义了能被获取或更高的状态信息.这种状态信息一般作为类型的字段成员实现.例如一下类型包含两个字段: public sealed class Employee{ public string name; public int age; } 创建该类型的实例后,可以使用一下形式的代码轻松获取或设置他的状态信息 e.Name=”ascdasdasd”; 这种设置对象状态信息的做法十分常见,但不应该像这样实现.面向对象设计和编程的重要原则之一就是数据封装,意味着类型的字段永远不应该公开…
1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan";  //name 被放入栈里面 Method2(name);  //1参数变量s 被压入栈,s引用name的地址    2.返回地址被压入栈,方法执行完(method2的 return)指针指向此返回地址 return; } void Method2(string s) { int32 leng…
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话"; 3>2个抽象方法:"喜欢什么","会做什么" 4>1个虚方法"母语" 5>定义一个接口,用于唱歌 2.分别创建3个子类:学生,老师,校长 要求:都继承抽象类People,而且都实现唱歌接口,老师覆写虚方法"母语&…
1. 引用类型(class)与值类型(strust)的构造函数(实例构造器) 1,  创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始对象的附加字段,最后调用实例构造器来设置对象的初始化状态. 2,  实例构造器用于不能被继承,如果没有定义任何构造器,编译器会指定一个默认的无参数构造器,在它的实现中只是简单的调用基类的无参构造器.(编译器不会为值类型生成默认的构造器,而且不能定义无参构造器) 3,  如果派生类没有显示的调用一个基类的构造器,编译器会自动生成对默认的基类构造器的调…
实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实力构造器来设置对象的初始状态. 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零.没有被构造器构造器显式重写的所有字段都保证获得0或者null值. 和其他方法不同,实力构造器永远不能被继…
前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性.常用的设计模式,比如简单工厂设计模式,核心就是多态. 其实多态就是:允许将子类类型的指针赋值给父类类型的指针.也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果.在运行时,可以通过指向基类的指针,来调用实现派生类中的方…