一、Object类
所有的.net类都派生于System.Object。如果在定义类时没有指定基类,编译器就会自动假设这个类派生于Object。对于结构总是派生于System.ValueType,而System.ValueType派生于System.Object。
1、System.Object方法
ToString()方法,是获取对象的字符串表示的一种快捷方式。当只需要快速获取对象内容,以用以调试时,就可以使用这个方法。在数据格式化方面功能弱,如果考虑用户的格式化配置或区域,就应实现IFormattable接口。
GetHashTable()方法,如果对象放在名为映射(散列表或字典)的数据结构中,就可以使用该方法,可以确定把对象放在结构的什么地方。
Equals()方法 与==有微妙的区别,以后会讨论
Finalize()方法接近c++中的析构函数,在引用对象被回收,以清理资源时调用。如果对象拥有对未托管资源的引用。则在该对象被删除时,就需要删除这些引用,此时要重写Finalize()。
GetType()方法:这个方法返回从System.Type派生的类的一个实例。
MemberwiseClone()方法 用来复制对象,返回一个对副本的引用,不能复制外部的对象,不能重写它的代码。
2、ToString()方法
是快速获得对象字符串表示的最便捷方式。如:
int i=-50;
String str=i.ToString(); // retruns "-50"
例子:
enum Colors{Red,Orange,Yellow};
//later on in code ...
Colors favoriteColor=Colors.Orange;
String str=favoriteColor.ToString(); // returns "Orange"
如果不在自己的类中重写ToString(),该类继承System.Object的执行方式-显示类的名称。如果想让该方法,显示类中的值信息,就需要重写该函数,例如:
using System;
namespace Wrox.ProCSharp.OOCSharp
{
class MainEntryPoint
{
static void Main(String[] args)
{
Money cash1=new Money();
cash1.Amount=40M;
Console.WriteLine("cash1.ToString() return: "+cash1.ToString());
Console.ReadLine();
}
}
class Money
{
private decimal amount;
public decimal Amount
{
get
{
return amount;
}
set
{
amount=value;
}
}
public override string ToString()
{
return "$"+Amount.ToString();
}
}
}
结果如下:
D:/c#001>mainentrypoint
cash1.ToString() return: $40
二、扩展方法。
如果没有类的源代码,要给类添加功能,就要使用到扩展方法,它允许改变一个类,但不需要类的源代码。
假设给上面一个类Money加入一个方法AddToAmount(decimal amountToAdd),但是类的源代码不能修改,可以如下创建:
namespace Chapter3.Extensions
{
public static class MoneyExtension
{
public static void AddToAmount(this Money money,decimal amountToAdd)
{
money.Amount+=amountToAdd;
}
}
}
第一个参数是要扩展的类型,放在this关键字的后面,告诉编译器,这个方法是Money类的一部分。在扩展方法中可以访问所扩展类型的所有公共方法和属性。
使用方法如下:
cash1.AddToAmount(10M);
即使扩展方法是静态的,也要使用标准的实例方法语法。
如果扩展方法与类中的某个方法同名,扩展方法就从来不会被调用,类中已有的实例方法优先。
一、Object类
所有的.net类都派生于System.Object。如果在定义类时没有指定基类,编译器就会自动假设这个类派生于Object。对于结构总是派生于System.ValueType,而System.ValueType派生于System.Object。
1、System.Object方法
ToString()方法,是获取对象的字符串表示的一种快捷方式。当只需要快速获取对象内容,以用以调试时,就可以使用这个方法。在数据格式化方面功能弱,如果考虑用户的格式化配置或区域,就应实现IFormattable接口。
GetHashTable()方法,如果对象放在名为映射(散列表或字典)的数据结构中,就可以使用该方法,可以确定把对象放在结构的什么地方。
Equals()方法 与==有微妙的区别,以后会讨论
Finalize()方法接近c++中的析构函数,在引用对象被回收,以清理资源时调用。如果对象拥有对未托管资源的引用。则在该对象被删除时,就需要删除这些引用,此时要重写Finalize()。
GetType()方法:这个方法返回从System.Type派生的类的一个实例。
MemberwiseClone()方法 用来复制对象,返回一个对副本的引用,不能复制外部的对象,不能重写它的代码。
2、ToString()方法
是快速获得对象字符串表示的最便捷方式。如:
int i=-50;
String str=i.ToString(); // retruns "-50"
例子:
enum Colors{Red,Orange,Yellow};
//later on in code ...
Colors favoriteColor=Colors.Orange;
String str=favoriteColor.ToString(); // returns "Orange"
如果不在自己的类中重写ToString(),该类继承System.Object的执行方式-显示类的名称。如果想让该方法,显示类中的值信息,就需要重写该函数,例如:
using System;
namespace Wrox.ProCSharp.OOCSharp
{
class MainEntryPoint
{
static void Main(String[] args)
{
Money cash1=new Money();
cash1.Amount=40M;
Console.WriteLine("cash1.ToString() return: "+cash1.ToString());
Console.ReadLine();
}
}
class Money
{
private decimal amount;
public decimal Amount
{
get
{
return amount;
}
set
{
amount=value;
}
}
public override string ToString()
{
return "$"+Amount.ToString();
}
}
}
结果如下:
D:/c#001>mainentrypoint
cash1.ToString() return: $40
二、扩展方法。
如果没有类的源代码,要给类添加功能,就要使用到扩展方法,它允许改变一个类,但不需要类的源代码。
假设给上面一个类Money加入一个方法AddToAmount(decimal amountToAdd),但是类的源代码不能修改,可以如下创建:
namespace Chapter3.Extensions
{
public static class MoneyExtension
{
public static void AddToAmount(this Money money,decimal amountToAdd)
{
money.Amount+=amountToAdd;
}
}
}
第一个参数是要扩展的类型,放在this关键字的后面,告诉编译器,这个方法是Money类的一部分。在扩展方法中可以访问所扩展类型的所有公共方法和属性。
使用方法如下:
cash1.AddToAmount(10M);
即使扩展方法是静态的,也要使用标准的实例方法语法。
如果扩展方法与类中的某个方法同名,扩展方法就从来不会被调用,类中已有的实例方法优先。