部分类、静态类、Object类、ToString()方法、扩展方法的使用
一:部分类:
前言:partial关键字允许将类、结构、方法或者接口放在多个文件中。一般情况下,一个类全部驻留在单个文件中。但有时,多个开发人员需要访问同一类的时候,或者某种类型的代码生成器生成了一个类的某部分。所以把类放在多个文件中是有益的。
如果声明类时使用了下面的关键字。这些关键字就必须应用于同一个类中的所有的部分:
public private protected internal abstract sealed new 一般约束
在嵌套的类型中。只要partial关键字位于class关键字的前面,就可以嵌套部分类。在吧部分类编译到类型中时,属性、XML注释、接口、泛型类型的参数属性和成员会合并。
二:静态类:
如果类只包含静态的方法和属性的话,该类就是静态的。静态类在功能上与使用私有静态构造函数创建的类相同。不能创建类的实例,使用static关键字,编译器可以检查用户是否不经意间给类添加了实例成员。如果是,就会生成一个编译的错误。这样可以确保静态类的实例。静态类的调用的方式为:静态类.方法名。
三:Object类:
前面提到,所有的.Net类都派生于System.Object。实际上,如果在定义类的时没有指定基类编译器会自动的假定这个类派生自Object。结构总是派生于System.ValueType,System.ValueType有派生自System.Object。
3.1:ToString()方法:是获取对象的字符串表示的一种便捷的方式。当只需要快速获取对象的内容,以 进行调试的时候,就可以用这个方法。在数据的格式化方面,它几乎没有任何的选择。如果需要更复杂的字符串表示。就应该实现IFormattable接口。
3.2:GetHashCode()方法:如果对象放在名为映射(也称为散列表或者字典)的数据结构中,就可以使用这个方法。处理这些结构的类使用该方法确定把对象放在结构的什么地方。如果希望把类当作字典的一个键,就需要重写GetHashCode()方法,实现给方法重载的方式有一些相当严格的限制(介绍字典的详细的讨论)。
3.3:Equals()和ReferenceEquals()方法:注意有三个用于比较对象相等性的不同方法,这三个方法和比较运算符“=”在使用方式上有一些微妙的区别。而且在重写带一个参数的虚Equals()方法有一些限制(在运算符是详细介绍)。
3.4:Finalize()方法:在异步编程的时候详细讨论。
3.5:GetType()方法:这个方法返回从System.Type派生的类的一个实例。这个对象可以提供对象成员所属类的更多的信息。包括基本类型、方法、属性等。System.Type还提供了反射结束的入口点。
四:ToString方法:
它是快速的获取对象的字符串表示的最便捷的方式。我们首先来看两个例子:
enum Colors { Red, Orange, Yellow } class Program { static void Main(string[] args) { int i = 10; string str = i.ToString();//return 10; Colors favoriteColor = Colors.Orange; string result = favoriteColor.ToString();//return Orange } }
如果不在自己的类中重写ToString(),该类将只继承System.Object的实现方式——它显示类的名称,如果希望ToString()返回一个字符串,其中包含类中对象的值信息,就需要重写它。
public class Money { private decimal _amount; public decimal Amount { get { return _amount; } set { _amount = value; } } public override string ToString() { return "$" + Amount.ToString(); } }
客户端程序的调用:
static void Main(string[] args) { Money money = new Money(); money.Amount = 40; Console.WriteLine(money.ToString()); Console.ReadKey(); }
在许多的情况下,也可以使用String.Format()方法,而不是ToString()。
五:扩展方法:
扩展方法是静态方法,它是类的一部分,但是实际上没有放在类的源代码中,假定上例中的Money类需要一个方法AddAmount(decimal amountToAdd)。但是,由于某种原因,程序集中的源代码不能直接的修改。此时需要创建一个静态类,把方法AddToAmount()添加为一个静态的方法。对应的代码为:
namespace _4.ToString__方法 { /// <summary> /// C#扩展方法 /// </summary> public static class MoneyExtension { public static decimal AddToAmount(this Money money, decimal amountToAdd) { return money.Amount += amountToAdd; } } }
对于扩展方法,第一个参数是就是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是Money的一部分。在这个例子当中,Money是要扩展的类型。在扩展方法中,可以访问所扩展类型的所有共有方法和属性。
//扩展方法的调用 decimal result = money.AddToAmount(10);
即使扩展方法是静态的,也要使用标准的实例方法语法。注意这里使用money实例变量来调用AddToAmount(20);,而没有使用类型名。如果扩展方法与类中的某个方法同名,就从来不会调用扩展方法,类中已有的任何实例方法优先。