随笔分类 - 跟小静读CLR via C#
跟小静读CLR via C#(18)——Enum
摘要:1. Enum定义 枚举类型是经常用的一种“名称/值”的形式,例如: public enum FeedbackStatus { New, Processing, Verify, Closed }定义枚举类型之后我们在使用时方便了许多,不用再记着0代表什么状态,1代表什么状态。而且枚举类型时强类型的,在编译时就可以进行类型安全检查。枚举类型是值类型的,它是直接从System.Enum继承的,System.Enum又是继承自System.ValueType。但是枚举类型不可以定义方法、属性或者事件。 2. 常用方法 ①Enum.GetUnderlyingType:获取枚举类型实例值的基类。 Co.
阅读全文
跟小静读CLR via C#(17)--接口
摘要:CLR不允许继承多个基类,但是可以继承多个接口。凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例。 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全部接口提供实现。 1. 定义接口 接口是用interface关键字定义对一组方法签名,接口名称一般以字母I开头;而且还可以为接口定义事件、索引器和属性,但禁止定义构造器和实例字段,也不能构造任何静...
阅读全文
跟小静读CLR via C#(16)--泛型
摘要:泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性。 一、初识泛型1. 简单实例以最常用的FCL中的泛型List<T >为例: static void Main(string[] args) { List<int> num = new List<int>(); num.Add(1); num.Add(3); int num1 = num[0]; int num2 = num[1]; }尖括号中的T是不确定的数据类型,叫做类型参数,一般规定以字母T开头,可以是TKey, TValue都可以。而调用时指定的具体类型
阅读全文
跟小静读CLR via C#(15)--String,熟悉而又陌生
摘要:好久没写文章了,再拿起这本书,学习加分享,乐趣无穷啊。这两天看了写关于字符串的知识,从学写代码的时候开始,我们就基本天天跟String打交道,对它再熟悉不过了。但是仔细看看,还是有一种拨开云雾的感觉,对平日里的一些问题顿然明白了。 一、 string实例化 1. 创建string对象 string str1 = "hello world."; //√ string str2 = new...
阅读全文
跟小静读CLR via C#(14)-可空值类型,关于?和??的故事
摘要:我们都知道,值类型是不能为Null的,但是在实际应用中有些情形却需要将值类型置为null。因此,CLR中引用了可空值类型的用法。今天的文章中见到最多的符号估计就是?了吧。?——初识可空值类型1. 我们首先看一下可空值类型的声明方法。普通的非空值类型为null时会发生如下的提示: 但是只要在类型后面缀上个“?”,一切都解决了。此时变量的取值范围在原来基础上添加了一个null。 2. 实际上int? 对应着Nullable<Int32>类型。我们可以查看一下它的IL代码 3. T?可空值类型包含了两个成员:HasValue:bool类型,如果变量包含非空值,则返回true。否则为fal
阅读全文
跟小静读CLR via C#(13)-浅谈事件
摘要:提起事件,我们都不陌生,事件使类之间有了交互的能力。它是建立在委托基础上的。有了前面对委托的了解,相信读起事件来也不会太难了。关于事件,现成的好文章数不胜数,本不打算写了。不过问道有先后,各抒己见,也不为过。想了想,还是不偷懒了,最起码能逼自己动动手,多理解几分。一、 事件能干什么?类通过维护一个已登记事件列表,当事件发生的时候可以通知已登记的方法。主要功能: 方法登记对该事件的关注;方法注销对该事件的关注;事件发生时,登记了的方法会收到通知,作出相应的反应。 Ps:看到这几点的时候,总会不自觉地想起观察者模式。二、 怎样定义事件?举个简单的例子:现在有一个天气预报信息发布中心,并且有短信天.
阅读全文
跟小静学CLR via C#(12)-委托Delegate
摘要:本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解。委托是一个类,它提供了回调函数机制,而且是类型安全的。使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,提高了程序的可扩展性。使用委托老规矩,先上个例子:结果:几点说明:使用关键字delegate声明委托。委托是类型安全的,定义时其返回值类型、参数个数及参数类型要和想要调用的方法兼容。在这个例子中,通过Introduce方法获取对delegateIntroduce委托对象的引用。委托对象相当于方法的包装器,使方法能通过包装器进行间接回调。委托即允许调用静态方法(如①②),还允许调用实例方法(③
阅读全文
跟小静读CLR via C#(11)-无参属性、索引器
摘要:提起属性,我们都不陌生。它用起来就像访问public数据成员一样,但实际上是调用了内部定义的相应方法。通过使用属性保持了较好的数据封装,而且访问很方便,接下来我们共同复习以下CLR允许定义的两种属性:无参属性和有参属性(索引器)。 一、 无参属性1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:说明:属性要定义名称和类型,且类型不能是void。属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。属性一般需要定义get和set方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫
阅读全文
跟小静读CLR via C#(10)-参数
摘要:最近几天学了参数,其实对于参数本不陌生,从上学学C语言基础的时候就学过了。不过细心学下来,还是收获了一些。 一、 命名参数、可选参数 命名参数和可选参数是在Visual C#2010中引入的新特性。 笨地儿我个瓜不兮兮的,今天才知道。 可选参数:定义方法时为参数设置默认值,调用该方法时可以省略为某些形参指定实参。 命名参数:调用方法时,通过指定参数名称的方式为特定形参指定实参。指定时是根...
阅读全文
跟小静读CLR via C#(09)-扩展方法
摘要:对于一些现成的类,如果我们想添加一些新的方法来完善功能,但是不想改变已有的封装,也不想使用派生类,那么该怎么办呢?这里我们可以使用扩展方法。 一见钟情--初识扩展扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 我们首先来看个例子,有个直观的认识。一个现有的类User: public class User { string _name; public User(string Name) { _name = Name; } public string Name { get { return _name; } set { this._name =
阅读全文
跟小静读CLR via C#(08)-操作符
摘要:跟小静读CLR via C#(08)-操作符对于操作符,我们并不陌生,例如+,-,*,%等二元操作符,以及++,!等一元操作符。但是对于非基元类型,我们需要通过一些自定义方法才能使用这些操作符。今天主要和大家分享关于操作符重载和转换操作符的知识。一、操作符重载方法CLR并不知道操作符,操作符重载对于它来说只是一些方法而已。但是CLR规定了语言应该如何公开操作符重载,每种编程语言自行决定是否支持操作符重载。 定义操作符重载方法注意两点: CLR规范要求操作符重载方法必须是 public static 类型。C#要求操作符重载方法必须有一个参数的类型和当前定义这个方法的类型相同。否则会产生编译错误
阅读全文
跟小静读CLR via C#-开篇及目录
摘要:最近正在拜读Jeffrey大师的.NET巨作-《CLR via C#》。好书就像一杯茶,需要静下心来慢慢品。在写笔记的过程中,也加入了自己的思考;在和园友们的交流中,理解也不断的加深。 目录: 跟小静读CLR via C#(00)-开篇及目录 跟小静读CLR via C#(01)-.NET平台下代码
阅读全文
跟小静读CLR via C#(07)-静态类,分部类
摘要:一、 静态类-Static静态类是一些不能实例化的类,它的作用是将一些相关的成员组合到一起,像我们常见的Math, Console等。静态类由static关键字标识,静态类成员也只能是static类型。Static关键字只能用于修饰类,不能修饰值类型。C#编译器对静态类的限制:1. 基类只能为System.Object。因为继承是针对对象而言的,静态类不能创建实例,所以从其他类派生没有实际意义。2. 静态类不能实现接口。3. 静态类的成员只能为static类型,可以定义静态的方法,属性,事件等。publicstaticclassStaticClass{privatestaticstring_n
阅读全文
跟小静读CLR via C#(06)- 构造器
摘要:跟小静读CLR via C#(06)- 构造器最近忙着看新还珠,好几天不学习了。玩物丧志啊,罪过罪过。 今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有提高。 对于构造器,大家应该都不陌生,它主要是用来进行初始化状态的。包括实例构造器和类构造器两种,先给大家看个实际的例子。 class Dog : Animal { 字段 privatestring _name; privateint _age; publicstring Name//属性 { get { return _name; } set { _name = value; } } public
阅读全文
跟小静读CLR via C#(05)- 访问限定、数据成员
摘要:跟小静读CLR via C#(05)- 访问限定、数据成员今天跟大家分享一下关于访问限定和数据成员的知识。主要包括以下两点: Abstract, sealed, virtual, new, override怎么用?Const 和 readonly好像都表示不能改变的值,有什么区别呢?一、 访问限定类和方法有一些访问限定符,如private,public等。除此之外,还包含一些预定义特性。下面几个你都知道吗? 1. 类的预定义特性Abstract——抽象类。不能实例化。如果派生类不是抽象类,则必须实例化。Sealed——密封类。不能做基类被继承。要想既不能实例化又不能被继承? 需要两个步骤: s
阅读全文
跟小静读CLR via C#(04)- 本是同根生
摘要:跟小静读CLR via C#(04)- 本是同根生说起.NET中的类,本是同根生,一点不为过。因为CLR要求所有类都要继承自System.Object。所有对象都必须提供一组通用操作,包括对象的等值性、唯一性、散列码以及克隆。 一、等值性——Equals()方法 有时候我们需要比较两个对象是否相等,比如在一个ArrayList中进行排序查找等操作时。 System.Object提供了Equals()虚方法: class Object { public virtual Boolean Equals(object o) { if (this == o) return true; else retu
阅读全文
跟小静读CLR via C#(03)- 对象创建和类型转换
摘要:跟小静读CLR via C#(03)- 对象创建和类型转换本节内容不太复杂,主要是介绍类的实例创建过程,以及类型之间相互转换的知识。 一、 创建对象CLR要求用new操作符创建对象,这个操作符在编译时产生的IL指令为newobj。例如: Student XiaoJing=new Student(“XiaoJing”,”1986”);那么在创建过程中,究竟发生了什么事呢? 分配空间。在托管堆中分配该类所需要字节数的内存空间。初始化对象的附加成员。每个对象有两个附加成员:一是指向类方法表的指针;二是SyncBlockIndex成员,CLR用该字段进行线程同步控制,某些位还可以用作垃圾回收标 记等等
阅读全文
跟小静读CLR via C#(02)-基元类型、引用类型、值类型
摘要:跟小静读CLR via C#(02)-基元类型、引用类型、值类型 一、 基元类型 编译器能够直接支持的数据类型叫做基元类型。例如int, string等。基元类型和.NET框架类库FCL存在着直接的映射关系。 string和String? 面试的时候曾经被问到过这个问题,C#中的基元类型string实际上对应了System.String(FCL)类型,所以两者使用的时候没有什么不同。 类型转...
阅读全文
跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的
摘要:跟小静读CLR via C#(01)-.NET平台下代码是怎么跑起来的想起前些日子去某知名电子商务公司面试的时候,问了很多我.NET程序的运行机制,当时很多比较底层的问题都没答好,发现自己的知识太皮毛了。于是决定好好学习。今天看的是代码在.NET平台体系下的执行过程,它是怎么跑起来的? 1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为托管模块。CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言。微软开发了多种语言的编译器,编译时会使用相应的编译器进行语法检查器和代码分析器,在编译完成后都生成一个托管模块。 托管模块? 托管模块是一个需.
阅读全文