部分类、静态类、Object类、ToString()方法、扩展方法的使用

部分类、静态类、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);,而没有使用类型名。如果扩展方法与类中的某个方法同名,就从来不会调用扩展方法,类中已有的任何实例方法优先。