Effective C# Item5:总是提供ToString()方法
来源:互联网 发布:兵营升级数据 编辑:程序博客网 时间:2024/05/16 21:50
C#中,System.Object默认提供了ToString()方法, 它会返回当前对象的完整类型名称,即命名空间 + "." + 类名,这种信息,对于类的使用者或者终端用户来说,可读性都很低,因此,建议在新建一个类时,重写ToString()方法。
如果不重写ToString()方法,那么为了向用户显示一些有意义的信息,就需要在每个调用这个类的地方,编写相同的代码,这样会造成很大的代码冗余,为了消灭这种情况,我们还是在新建类时,就完成这个工作吧。
关于如何重写ToString()方法, 有以下两种方式。
第一种方式比较简单,只是单纯的重写Object类的ToString()方法,这种方法返回的信息比较简单,调用方可选择的余地比较小;第二种方式比较复杂,我们可以让类实现IFormatter接口,这个接口提供了一个ToString方法。
接下来,我们分别以示例来说明上述两种方法。
首先是不重写ToString()方法的类,表明一个员工的基本信息。
public class BaseEmployee { private string m_strName; public string Name { get { return m_strName; } set { m_strName = value; } } private string m_strSex; public string Sex { get { return m_strSex; } set { m_strSex = value; } } private string m_strAddress; public string Address { get { return m_strAddress; } set { m_strAddress = value; } } }
然后,我们来看针对上述第一种方式,如何实现。
public class SimpleEmployee : BaseEmployee { public override string ToString() { return base.Name; } }
上述代码实现了第一种方式,它重写了ToString()方法,向调用方返回当前对象的Name属性的值。
再来看以下的代码如何实现第二种方式。
public class ComplexEmployee : BaseEmployee, IFormattable { public string ToString(string format, IFormatProvider formatProvider) { //throw new NotImplementedException(); if (formatProvider != null) { ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter; if (fmt != null) { return fmt.Format(format, this, formatProvider); } } switch (format) { case "n": return base.Name; case "s": return base.Sex; case "a": return base.Address; case "ns": return string.Format("{0,20}, {1,15}", base.Name, base.Sex); case "na": return string.Format("{0,15}, {1,15}", base.Name, base.Address); case "G": default: return base.Name; } } public override string ToString() { return "Just For Test"; } }
上述代码中,我们实现了IFormatter接口,其中包含了ToString()方法,并且我们还重写了Object的ToString()方法。
接下来是针对上述两种方式的测试代码,如下。
/// <summary> /// test ToString() method /// </summary> private static void TestToString() { BaseEmployee employee = new BaseEmployee(); employee.Name = "Wing"; employee.Sex = "M"; employee.Address = "BeiJing China"; Console.WriteLine(employee); SimpleEmployee simpleE = new SimpleEmployee(); simpleE.Name = "XXX"; simpleE.Sex = "NA"; simpleE.Address = "Vernus"; Console.WriteLine(simpleE); ComplexEmployee complexE = new ComplexEmployee(); complexE.Name = "YYY"; complexE.Sex = "F"; complexE.Address = "Moon"; Console.WriteLine(complexE); Console.WriteLine(complexE.ToString()); Console.WriteLine(complexE.ToString("na", null)); } }
上述代码的运行结果如下。
我们在测试代码中,有以下两行代码,执行效果非常有趣。
Console.WriteLine(complexE);
和
Console.WriteLine(complexE.ToString());
在类实现了IFormatter接口的情况下,上述第一行代码会执行IFormatter接口中的ToString方法,而第二行代码会执行我们重写过的Object类的ToString()方法。
我们在实现IFormatter接口的ToString()方法中,有以下语句。
if (formatProvider != null) { ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter; if (fmt != null) { return fmt.Format(format, this, formatProvider); } }
这表明我们可以根据业务的需要,自己定制Formatter,例如,我们可以编写如下代码。
internal class EmployeeFormatProvider : IFormatProvider { #region IFormatProvider Members public object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) { return new EmployeeFormatter(); } return null; } #endregion private class EmployeeFormatter : ICustomFormatter { public string Format(string format, object arg, IFormatProvider formatProvider) { ComplexEmployee c = arg as ComplexEmployee; if (c == null) { return arg.ToString(); } return string.Format("{0,50}, {1,5}, {1,20}", c.Name, c.Sex, c.Address); } } }
在我们自定义好Formatter后,不能再直接以ToString()的方式使用,而是要以String.Format()的方式使用,例如:
Console.WriteLine(string.Format(new EmployeeFormatProvider(), string.Empty, complexE));
我感觉实际应用中,能够使用到自定义Formatter的地方,应该非常小,因此,主要关注上面第一种和第二种方式就可以解决日常工作中的大部分问题。
- Effective C# Item5:总是提供ToString()方法
- Effective C#阅读笔记-4总是为你的类提供ToString()方法
- 总是提供ToString()方法
- Effective Java Item10-总是覆盖toString方法
- 条款5:总是提供ToString()方法
- 条款5:总是提供ToString()方法
- Effective C# 原则5:始终提供ToString()
- 改善C#程序的50种方法 条款5:总是提供ToString()方法
- Effective Java之总是要改写toString
- Effective C#之5:Always Provide ToString()
- C# toString 方法
- C# ToString()常用方法
- C# 重写 ToString 方法
- 《Effective C#》Item 5:提供一个有意义的ToString函数
- 《Effective C#》Item 5:提供一个有意义的ToString函数
- 【Effective C++学习笔记】Item5-Item12
- 公认的提供toString()的方法
- 提高C#编程水平的50个要点 之五“总是为自定义类重载 ToString 方法”。
- Spring的AOP配置
- Git 教程
- android中毫秒转成分秒
- Debian配置CGI
- POJ 3414 Pots 记录路径的广搜
- Effective C# Item5:总是提供ToString()方法
- HDU 2084
- hdu 1394 Minimum Inversion Number 线段树
- SET STATISTICS IO vs SQL Profiler统计出来的reads不一致
- Linux内核实时补丁PREEMPT_RT安装
- 归并排序的java实现
- go语言资源
- Tk Tutorial - 6. The Grid Geometry Manager
- POJ2533——Longest Ordered Subsequence