随笔分类 -  CLR via C#

摘要:委托是一个类,它提供了回调函数机制,而且是类型安全的。使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,提高了程序的可扩展性。使用委托老规矩,先上个例子:结果:几点说明:使用关键字delegate声明委托。委托是类型安全的,定义时其返回值类型、参数个数及参数类型要和想要调用的方法兼容。在这个例子中,通过Introduce方法获取对delegateIntroduce委托对象的引用。委托对象相当于方法的包装器,使方法能通过包装器进行间接回调。委托即允许调用静态方法(如①②),还允许调用实例方法(③)。将一个方法绑定到委托时,允许引用类型的协变性和逆变性。(ps:陌生 阅读全文
posted @ 2014-04-08 10:35 fireshadow23 阅读(239) 评论(0) 推荐(0)
摘要:一、 无参属性1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:说明:属性要定义名称和类型,且类型不能是void。属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。属性一般需要定义get和set方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫做value,表示赋给属性的值。只读只写属性:可以通过省略set来定义只读属性(如Count属性),或者省略get来定义只写属性。CLR支持静态、实例、抽象和虚属性。例子中的Name和Age就是我们最常用的实例属性,Count就是静 阅读全文
posted @ 2014-04-03 15:19 fireshadow23 阅读(274) 评论(0) 推荐(0)
摘要:一、 命名参数、可选参数命名参数和可选参数是在Visual C#2010中引入的新特性。 笨地儿我个瓜不兮兮的,今天才知道。可选参数:定义方法时为参数设置默认值,调用该方法时可以省略为某些形参指定实参。命名参数:调用方法时,通过指定参数名称的方式为特定形参指定实参。指定时是根据名称将形参和实参关联,而不是与参数在列表中的位置关联。例如: class Program { static void Main(string[] args) { //可选参数 Employee.DisplayInfo(24, "程序员"); //相当于 Employee.DisplayInfo(24, 阅读全文
posted @ 2014-04-03 14:25 fireshadow23 阅读(195) 评论(0) 推荐(0)
摘要:对于一些现成的类,如果我们想添加一些新的方法来完善功能,但是不想改变已有的封装,也不想使用派生类,那么该怎么办呢?这里我们可以使用扩展方法。一见钟情--初识扩展扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。我们首先来看个例子,有个直观的认识。一个现有的类User:public class User { string _name; public User(string Name) { _name = Name; } public string Name { get { return _name; } set { this._name = val 阅读全文
posted @ 2014-04-02 15:35 fireshadow23 阅读(235) 评论(0) 推荐(0)
摘要:对于操作符,我们并不陌生,例如+,-,*,%等二元操作符,以及++,!等一元操作符。但是对于非基元类型,我们需要通过一些自定义方法才能使用这些操作符。今天主要和大家分享关于操作符重载和转换操作符的知识。一、操作符重载方法CLR并不知道操作符,操作符重载对于它来说只是一些方法而已。但是CLR规定了语言应该如何公开操作符重载,每种编程语言自行决定是否支持操作符重载。定义操作符重载方法注意两点:CLR规范要求操作符重载方法必须是 public static 类型。C#要求操作符重载方法必须有一个参数的类型和当前定义这个方法的类型相同。否则会产生编译错误 操作符重载实例我们为非基元类型Complex重 阅读全文
posted @ 2014-04-02 14:48 fireshadow23 阅读(176) 评论(0) 推荐(0)
摘要:静态类是一些不能实例化的类,它的作用是将一些相关的成员组合到一起,像我们常见的Math, Console等。静态类由static关键字标识,静态类成员也只能是static类型。Static关键字只能用于修饰类,不能修饰值类型。C#编译器对静态类的限制:1. 基类只能为System.Object。因为继承是针对对象而言的,静态类不能创建实例,所以从其他类派生没有实际意义。2. 静态类不能实现接口。3. 静态类的成员只能为static类型,可以定义静态的方法,属性,事件等。publicstaticclassStaticClass{privatestaticstring_name;publicsta 阅读全文
posted @ 2014-04-02 14:36 fireshadow23 阅读(267) 评论(0) 推荐(0)
摘要:对于构造器,大家应该都不陌生,它主要是用来进行初始化状态的。包括实例构造器和类构造器两种,先给大家看个实际的例子。class Dog : Animal { privatestring _name; privateint _age; publicstring Name//属性 { get { return _name; } set { _name = value; } } publicint Age { get { return _age; } set { _age = value; } } publicstaticstring type ="动物";//静态字段 publi 阅读全文
posted @ 2014-04-02 14:28 fireshadow23 阅读(233) 评论(0) 推荐(0)
摘要:今天跟大家分享一下关于访问限定和数据成员的知识。主要包括以下两点:Abstract, sealed, virtual, new, override怎么用?Const 和 readonly好像都表示不能改变的值,有什么区别呢?一、 访问限定类和方法有一些访问限定符,如private,public等。除此之外,还包含一些预定义特性。下面几个你都知道吗?1. 类的预定义特性Abstract——抽象类。不能实例化。如果派生类不是抽象类,则必须实例化。Sealed——密封类。不能做基类被继承。要想既不能实例化又不能被继承? 需要两个步骤:seadled修饰。防止被被继承 ;私有化无参构造器。防止实例化自 阅读全文
posted @ 2014-03-25 10:20 fireshadow23 阅读(227) 评论(0) 推荐(0)
摘要:说起.NET中的类,本是同根生,一点不为过。因为CLR要求所有类都要继承自System.Object。所有对象都必须提供一组通用操作,包括对象的等值性、唯一性、散列码以及克隆。一、等值性——Equals()方法 有时候我们需要比较两个对象是否相等,比如在一个ArrayList中进行排序查找等操作时。System.Object提供了Equals()虚方法:class Object{public virtual Boolean Equals(object o){if (this == o) return true;else return false;}}这种判断方式非常简单:直接比较是两个引用是否 阅读全文
posted @ 2014-03-25 09:02 fireshadow23 阅读(188) 评论(0) 推荐(0)
摘要:本节内容不太复杂,主要是介绍类的实例创建过程,以及类型之间相互转换的知识。一、 创建对象CLR要求用new操作符创建对象,这个操作符在编译时产生的IL指令为newobj。例如:Student XiaoJing=new Student(“XiaoJing”,”1986”);那么在创建过程中,究竟发生了什么事呢?分配空间。在托管堆中分配该类所需要字节数的内存空间。初始化对象的附加成员。每个对象有两个附加成员:一是指向类方法表的指针;二是SyncBlockIndex成员,CLR用该字段进行线程同步控制,某些位还可以用作垃圾回收标 记等等。CLR通过这两个成员管理对象实例。调用构造函数。其间可以传入指 阅读全文
posted @ 2014-03-25 08:53 fireshadow23 阅读(331) 评论(0) 推荐(0)
摘要:一、 基元类型编译器能够直接支持的数据类型叫做基元类型。例如int, string等。基元类型和.NET框架类库FCL存在着直接的映射关系。string和String?面试的时候曾经被问到过这个问题,C#中的基元类型string实际上对应了System.String(FCL)类型,所以两者使用的时候没有什么不同。类型转换编译器能够在基元类型之间进行显式或隐式转换。如果转换是安全的,也就是转换过程不会造成数据丢失,则可以直接采用隐式转换。如果是不安全的,则必须采用显式转换。Int32 a=5;Int64 b=a;Int32 c=(Int32)b;二、 引用类型和值类型引用类型和值类型的区别:引用 阅读全文
posted @ 2014-03-21 08:48 fireshadow23 阅读(199) 评论(0) 推荐(0)
摘要:1. 源代码编译为托管模块程序在.NET框架下运行,首先要将源代码编译为托管模块。CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言。微软开发了多种语言的编译器,编译时会使用相应的编译器进行语法检查器和代码分析器,在编译完成后都生成一个托管模块。托管模块?托管模块是一个需要CLR环境才能执行的标准windows PE文件,包含IL和元数据以及PE表头和CLR表头。IL又叫托管代码,是编译器编译源文件后产生的指令,CLR会在运行时将IL编译成本地CPU指令。元数据实际上是一个数据表集合,用来描述托管模块中所定义和引用的内容。VS能够智能感知就得益于元数据的描述。P 阅读全文
posted @ 2014-03-21 08:43 fireshadow23 阅读(285) 评论(0) 推荐(0)