随笔分类 - [C#1] 基础篇
C#1.0中的基本概念总结。备注:文章主要参考自李建忠翻译的《Microsoft.NET框架程序设计》。
摘要:1.特性简介 特性仅仅是为目标元素提供关联的附加信息的一种方式,编译器的工作只是将这些附加信息放到托管模块的元数据中, 大多特性对于编译器来说没有任何特殊的意义,编译器只是检测源代码中的定制特性,然后产生相应的元数据。 FCL中已经带来了很多的预定义特性[System.ParamArrayAttri
阅读全文
摘要:接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是含有一组虚方法的抽象类型,不含有任何实现。CLR允许接口包含静态方法、静态字段、常量、以及静态构造器, 但是CLS兼容的接口类型是不允许有任
阅读全文
摘要:事件概述 CLR的事件模型建立在委托的机制之上。定义事件成员的类型允许类型(或者类型的实例)在某些特定事件发生时通知其他对象,事件为类型提供了一下三种能力: 1允许对象登记该事件 2允许对象注销该事件 3允许定义事件的对象维持一个登记对象的集合,并在某些特定的事件反生时通知这些对象 下面是根据一个上
阅读全文
摘要:委托揭秘 编译器和CLR在后台做了很多工作来隐藏委托本身的复杂性,如下一句委托声明: 看看IL: 可以看出它默认继承自System.MulticastDelegate[所有委托都继承此类,MulticastDelegate又继承自System.Delegate],我们声明的public,所以编译器产
阅读全文
摘要:1.数组概述 声明数组: CLS要求所有数组都是0基数组。最小索引是0,性能最好的数组,微软为它们优化性能方面做了很多工作。 例如有些特殊的IL指令:newarr、ldelem等等,但是CLS也支持非0基数组。 CLR支持交错数组,但是交错数组不兼容CLS[CLS不允许一个数组的元素是System.
阅读全文
摘要:1.Enum 枚举是定义了一组符号名称和数值对,如下: 枚举类型使程序更见容易阅读、编写和维护。每个枚举类型默认继承自 System.Enum,属于值类型,但是枚举不能定义任何方法、属性[本质 也是方法嘛]和事件。实际上枚举被编译时会把其中的每个符号转变为类型的一个常量字段,也就是0,1,2...会
阅读全文
摘要:1.实例构造器[.ctor] 默认情况下,对于引用类型,如果我们没有显示的定义实例构造器,则C#编译器会为我们定义一个无参的公有实例构造器。 一个类的实例构造器在访问基类的继承字段之前,必须调用基类的实例构造器,C#编译器会自动产生对基类默认构造器的调用代码。 特殊情况下类型实例的创建不会调用实例构
阅读全文
摘要:1.无参属性 当定义一个属性时,编译器会在生成的托管模块中产生一下3项: 1:get访问器方法,定义get时才有; 2:set访问器方法,定义set时才有; 3:关于属性的元数据,这项总是存在; 这写元数据信息中包括一些标记和属性类型,并有一个对get和set访问器方法的引用,仅仅为属性和它的访问器
阅读全文
摘要:1.对象的等值性和唯一性 Object的Equals[虚]方法判断两个对象是否相等; Object.ReferenceEquals判断两个对象是否指向同一引用[严格意义上的相等、对象的唯一性]。 2.对象的散列码 Object的GetHashCode[虚]方法返回一个Int32类型的散列码,当重写E
阅读全文
摘要:1.基元类型 编译器直接支持的数据类型成为基元类型。基元类型与FCL中的类型有直接的映射关系[int=Int32],这样我们可以简化的方式书写代码,并且编译后的IL和直接使用FCL中的数据类型是完全相同的。 Checked和Unchecked操作: CLR只在32位和64位上进行算数运算,所以b首先
阅读全文
摘要:1.System.Object CLR要求每个类型都要继承自System.Object[直接或者间接方式],如果不显示继承,编译器会自动为我们添加对System.Object的继承。 System.Object提供几个公有实例方法: Equals:如果两个对象具有相同的值,返回true; GetHa
阅读全文
摘要:一个简单的C#从控制台程序代码如下: 一行一行说起吧: 引入命名空间,其中本程序只用到了System下的Console静态类。并未使用System.Text命名空间,所以编译器不会把System.Text这个东东也塞到编译后的IL中。如果看着不顺眼的话【选择全部using行,右键》组织using》移
阅读全文