/// <summary>
/// “点”类的定义。
/// </summary>
public class Point : System.IFormattable
{
/// <summary>
/// 点类的横纵坐标。
/// </summary>
private int m_x,m_y;
/// <summary>
/// 点类构造(参数为横纵坐标值)。
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public Point(int x,int y)
{
m_x = x;
m_y = y;
}
#region IFormattable 成员
/// <summary>
/// 用于生成格式字符串的函数。
/// </summary>
/// <param name="format">格式字符串。</param>
/// <param name="formatProvider">区域格式信息对象。</param>
/// <returns></returns>
public string ToString(string format, IFormatProvider formatProvider)
{
string retString;
try
{
//判断格式字符串。
switch(format.ToUpper())
{
case "G": //自定义的通用格式。
retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
//“点”对象的字符串格式为:“(十进制数字,十进制数字)”。
break;
case "S": //自定义的标准格式。
retString = string.Format(formatProvider,"<{0},{1}>",m_x,m_y);
//“点”对象的字符串格式为:“<十进制数字,十进制数字>”。
break;
default: //自定义的默认格式。
retString = string.Format(formatProvider,"({0:X},{1:X})",m_x,m_y);
//“点”对象的字符串格式为:“(十六进制数字,十六进制数字)”。
break;
}
}
catch(System.NullReferenceException)
{
//格式字符串为空,返回通用格式。
retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
}
return retString;
}
#endregion
}
/// <summary>
/// Test 的摘要说明。
/// </summary>
public class Test
{
public static void Main()
{
//定义一个点。
Point p = new Point(13,10);
//打印默认格式的点。
Console.WriteLine("{0}",p);
//打印标准格式的点。
Console.WriteLine("{0:S}",p);
/*
* 输出结果:(13,10)
* <13,10>
*/
}
}
/*
* 注意:如果不实现IFormattable接口也可以用string.Format这些方法打印自定义类的对象,但string.Format方法
* 只是调用object.ToString方法将类名打印出来。下面是string.Format这些方法调用ToString的处理顺序:
*
* 1.如果要格式化的对象的值是 null,则返回空字符串 ("")。
* 2.如果要格式化的对象所属的类实现了 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。
* 3.如果前面的ICustomFormatter.Format 方法未调用,并且该类实现了 IFormattable 接口,则调用
* IFormattable.ToString 方法。
* 4.如果前面的步骤未格式化类型,则调用该类型的 ToString 方法(从 Object 类继承而来)。
*
* 然而,只有实现了IFormattable或ICustomFormatter这些接口才能识别我们自己定义的格式字符串,打印出我
* 们想要的结果。
*/