随笔分类 - CLR via C#学习笔记
摘要:托管堆基础 访问类型的资源 面向对象的环境中,每个类型都代表可供程序使用的一种资源。要使用这些资源,必须为代表资源的类型分配内存。以下是访问一个资源所需的步骤。 ①调用IL指令newobj,为代表资源的类型分配内存,由new操作符来完成。 ②初始化内存,设置资源的初始状态并使资源可用,类型的实例构造
阅读全文
摘要:第16章 数组 数组在内存中的情况 CLR支持一位、多维、交错数组。所有数组都隐式从System.Array,后者又派生自System.Object。 这意味着数组始终是引用类型,是在托管堆上分配的。 应用程序中的字段或变量中,包含的是对数组的引用,而不是包含数组本身的元素。 值类型数组 第一行代码
阅读全文
摘要:15.1 枚举类型 枚举类型定义了一组"符号名称/值"配对。 例如以下Color类型定义了一组符号,每个符号都表示一种颜色: 使用枚举的好处 ①枚举类型是程序更容易编写、阅读和维护。 ②枚举是强类型的 枚举的特性 枚举类型在类型系统中是一等公民。每个枚举类型都从System.Enum派生,后者从Sy
阅读全文
摘要:14.1 字符 Char结构 Char结构提供的字段 每个字符都是System.Char结构的实例,Char类型提供了两个公共只读常量字段:MinValue('\0')和MaxValue('\uffff\)。 Char实例能调用的方法 为Char的实例调用静态GetUnicodeCategory方法
阅读全文
摘要:13.1 类和接口继承 接口是为了实现多继承 所有的类都继承了System.Object,及其四个公共实例方法:ToString、Equals、GetHashCode、GetType。 CLR允许定义接口,它实际只是对一组方法签名进行了统一命名。这些方法不提供任何实现。 类通过指定接口名称来继承接口
阅读全文
摘要:12.8 可验证性和约束 where关键字 编译器和CLR支持称为约束的机制,可通过它使泛型变得真正有用。 约束的作用限制能指定成泛型实参的类型数量,通过限制类型的数量,可以对那些类型执行更多操作: C#的where关键字告诉编译器,为T制定的任何类型都必须实现同类型T的泛型IComparable接
阅读全文
摘要:12.6 泛型方法 方法和类可以各自定义类型参数 定义泛型类、结构或接口时,类型中定义的任何方法都可以引用类型指定的类型参数。 类型参数可以作为方法参数、返回值或方法内部定义的局部变量的类型使用。 CLR还允许方法指定他自己的类型参数,这些参数也可以作为参数、返回值或局部变量的类型使用。 在下例中类
阅读全文
摘要:12.3 泛型接口 泛型接口的意义 显然,泛型的主要作用就是定义泛型的引用类型和值类型。 然而对泛型接口的支持对CLR来说也很重要。没有泛型接口,每次用非泛型接口如IComparable来操作值类型都会发生装箱,而且会失去编译时的类型安全性。 这将严重制约泛型类型的应用范围,因此CLR提供了对泛型接
阅读全文
摘要:12.2 泛型基础结构 12.2.1 开放类型和封闭类型 具有泛型类型参数的类型仍然是类型,CLR同样会为他创建内部的类型对象。 然而具有泛型类型参数的类型称为开放类型,CLR禁制构造开放类型的任何实例。类似于CLR禁止构造接口类型的实例。 代码引用泛型类时可指定一组泛型类型实参。为所有类型参数都传
阅读全文
摘要:第十二章 泛型 泛型介绍 泛型是CLR和编程语言提供的一种特殊机制,他支持另一种形式的代码重用,即算法重用。 CLR允许创建泛型引用类型和泛型值类型,但不允许创建泛型枚举类型。 此外CLR还允许创建泛型接口和泛型委托。 方法偶尔也封装有用的算法,所以CLR允许在引用类型、值类型或接口中定义泛型方法。
阅读全文
摘要:10.2 有参属性 属性的get访问器不接受参数,因此称为无参属性。 C#还支持有参属性,他的get访问器方法接受一个或多个参数,set访问器方法接收两个或多个参数,C#称之为索引器。 C#使用数组风格的语法来公开有参属性,换句话说可以将索引器看成是C#开发者对[]操作符的重载。 CLR中的有参属性
阅读全文
摘要:10.1 无参属性 面向对象设计和编程的重要原则之一就是数据封装,意味着类型的字段永远不应该公开,否则很容易因为不恰当使用字段而破坏对象的状态。 建议将所有字段都设为private。要允许用户或类型设置、获取状态信息,就公开一个针对该用途的方法。 封装了字段访问的方法通常称为访问器accessor方
阅读全文
摘要:9.6 常量性 有的语言,如非托管C++,允许将方法或参数声明为常量,从而禁止实例方法中的代码更改对象的任何字段,或者更改传给方法的任何对象。CLR没有提供这个功能。 非托管C++将实例方法或参数声明为const只能防止程序员用一般的代码来更改对象或参数。方法内部总是可以更改对象或实参的。 要么是通
阅读全文
摘要:9.5 参数和返回类型的设计规范 声明方法的参数类型,应尽量指定最弱的类型,宁愿要接口也不要基类。 例如写方法来处理一组数据项,最好用接口,比如IEnumerable<T>声明参数,而不要用强数据类型,比如List<T>或者更强的接口类型,比如ICollection<T>或IList<T> 原因是调
阅读全文
摘要:9.4 向方法传递可变数量的参数 为了接受可变数量的参数,方法要像下面这样声明 params只能应用于方法签名中的最后一个参数。 可以向下面这样调用该方法。 数组能用任意数量的一组元素来初始化,再传给Add进行处理。 由于params关键字的存在,我们可以这样调用Add方法。 params关键字告诉
阅读全文
摘要:9.3 以传引用的方式向方法传递参数 CLR默认所有方法参数都传值。传递引用类型的对象时,对象引用或者说指向对象的指针,被传给方法。 注意引用本身是传值的,意味着方法能修改对象。 对于值类型的实例,传给方法的是实例的一个副本,意味着方法获得他专用的值类型实例副本,调用者中的实例不受影响。 out和r
阅读全文
摘要:9.2 隐式类型的局部变量 C#能根据初始化表达式的类型推断方法中的局部变量的类型。 主要用处 在复杂类型中不需要在左侧写出全称,如果需要修改类型仅需修改右侧的类型。 在foreach循环中,var让编译器自动推断集合中元素的类型。 还可在试验代码时利用它,用方法的返回值初始化隐式类型的局部变量。
阅读全文
摘要:9.1 可选参数和命名参数 设计方法的参数时,可为部分或全部参数分配默认值。 然后调用这些方法的代码可以选择不提供部分实参,使用其默认值。 此外调用方法时可通过指定参数名称来传递实参。 如果调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。 规则和原则 如果在方法中为部分参数指定了默认值 1.
阅读全文
摘要:8.7 分部方法 重写基类的虚方法 使用继承基类让子类重写基类虚方法的做法存在很多问题,如下所示代码。 1.类型必须是非密封的,也不能用于值类型,因为值类型是隐式密封的。此外不能用于静态方法,因为静态方法不能重写。 2.效率问题。定义一个类只为了重写一个方法,会浪费少量系统资源。即使不想重写某个方法
阅读全文
摘要:8.6 扩展方法 14.3.2节StringBuilder成员会提到StringBuilder类提供的字符串处理方法比String类少。 这是一件很奇怪的事,StringBuilder类是可变的,所以他应该是进行字符串处理的首选方式。 现在假定你想自己定义一些缺失的方法以方便操作StringBuil
阅读全文

浙公网安备 33010602011771号