1. 概述
本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型。
2. 主要内容
2.1 如何选择类型
C#类型系统包括三种类型:值类型、引用类型、指针类型。(指针类型用于非托管代码,很少使用。)
① 创建枚举类型(enums)
合理使用枚举类型 可以提高代码的可读性和可维护性。
② 值类型 还是 引用类型
使用值类型的三个推荐的原则:
a. 对象的体积小. b. 对象逻辑上不可变. c. 使用中会生成很多对象.
* 结构类型(struct) 不能自己定义空构造器,不适用继承系统。
2.2 完善类型体
① C# 命名参数、可选参数 和 方法重载
命名参数用于给制定的参数传值,可选参数用于给指定的参数设置默认值。
void MyMethod(int firstArg, string secondArg = "default value", bool thirdArg = false) { }
void CallingMethod()
{
MyMethod(1, thirdArg: true);
}
② 使用索引器,可以实现以集合的方式访问对象成员。
class Cards {}
public Card this[int index]
{
get { return Cards.ElementAt(index); }
}
③ 使用 蓝图(blueprint)
定义构造函数的几个原则:
a. 如果需要的话,显示指定public访问控制符。
b. 参数尽可能少。
c. 将参数映射到字段(field)。
d. 在合适的地方抛出异常。
e. 构造函数中不要调用虚方法。
2.3 如何设计类型
① 核心思想:高内聚,低耦合。
② SOLID设计原则:Single responsibility(S), Open/close(O), Liskov substitution(L), Interface segregation(I),
Dependency Inversion(D).
③ 使用泛型类型(generic types)
使用where关键字限制泛型可用范围,可以限制的类型包括:struct, class, new() 以及具体的类型及接口。
使用default可以指定默认值。default(T)
2.4 扩展现有类型
C#提供了几种方法来扩展现有类型。本节介绍两个: 扩展方法 和 方法重写(overriding).
① 扩展方法 是在C#4.0引入的,需要定义在 非泛型、非嵌套、静态类中。
pubic class Product
{
public decimal Price { get; set; }
}
public static class MyExtensions
{
public static decimal DisCount(this Product product)
{
return product.Price * .9M;
}
}
public class Calculator
{
public Decimal CalculateDisCount(Product p)
{
return p.DisCount();
}
}
*扩展方法不仅可用在类、结构上,还可以用在接口上。LINQ是用在接口上的一个例子。
② 重写虚方法 也可以实现对现有代码的扩展。
class Base
{
public virtual int MyMethod()
{
return 42;
}
}
class Derived : Base
{
public override int MyMethod()
{
return base.MyMethod() * 2;
}
}
3. 总结
① 一个类型中可以包括:构造器、方法、属性、字段 和 索引器。
② 创建和调用方法时,可以使用 可选参数 和 命名参数。
③ 可以用扩展方法向现有类型增加功能。
④ 使用方法重写,可以在子类中重定义父类的相应功能。