/// <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这些接口才能识别我们自己定义的格式字符串,打印出我 * 们想要的结果。 */ 
|