如何在类中重写和格式化ToString()方法?

5
我已经在Google和这个网站上搜索了答案。我也在我的课本中读到了它,但我仍然不明白它如何应用。
以下是我所知道的:
- 它用于显示对象自身的信息。 - 它可以用于格式化有关其自身信息的输出。 - 必须在要使用的方法中重写它。

我不太确定你在这里问什么? - user342706
1
@Kyle 我想学习如何应用toString,也许是以一种不同于我的书的方式。有些东西我还没有掌握,希望其中一个答案能够帮助我。 - Justin Stryker
4个回答

17

假设你有一个如下的类:

public class Person
{
   public string FirstName { get; set;}
   public string LastName { get; set;}
   private string age;
}

使用这个:

public override string ToString()
{
   return string.Format("[First Name: {0}; Last Name: {1}; Age: {2}]", FirstName, LastName, age);
}

这将揭示类的所有内部细节。实际上,它最适合以预格式化的方式快速检索类的公共字段(从而有效地将封装在类中的数据转换为字符串)。

此外,《Pro C# 2010 and the .NET 4 Platform》书中有一个非常有用的建议:“许多你创建的类(和结构体)可以从重写ToString()方法中受益,以便返回类型当前状态的文本表示形式。这在调试(等其他原因)方面非常有帮助。如何构造此字符串是个人选择的问题;然而,推荐的方法是使用分号分隔每个名称/值对,并在方括号内包含整个字符串。但是,请始终记住,正确的ToString()覆盖还应考虑到任何定义在继承链上的数据。当你为扩展自定义基类的类重写ToString()时,首要任务是使用base关键字从父级获取ToString()值。一旦您获得了父类的字符串数据,就可以附加派生类的自定义信息。”


好的。字符串格式化部分从哪里来? - Justin Stryker
1
除了您上面展示的内容之外,我喜欢重写ToString()的另一个原因是为了调试目的。当您在调试模式下运行并悬停在对象上或观察对象等时,它使用ToString()来格式化显示的内容。 - user342706
@Teoman,你在回答中添加了内容,抱歉造成重复。 - user342706
string.Format仅仅是创建一个字符串,您可以使用它来显示类数据的当前值。ToString将使用此字符串与当前值一起显示对象的字符串表示形式。 - Jess
string.Format实际上是System.String.Format()静态类的快捷方式/别名,其中字符串中的{0}、{1}等会被给定变量替换。您可以在此处阅读有关它的信息(非常有用的方法):http://msdn.microsoft.com/en-us/library/system.string.format.aspx - Teoman Soygul

2
所有.NET类的基类是object类型。 object类为您提供了ToString()的默认实现,默认情况下仅打印类的名称,除非类已覆盖ToString()方法以打印其他内容。 类的名称并不特别有用,因此通常最好在您编写的任何类中重写ToString(),因为提供类的可读表示很有用。 当您想要检查类的实例时,调试器实际上会默认使用您的ToString()实现。
在您的类中,您只需要添加这个方法:
public override string ToString()
{
    // return a string that has something to do with your class
}

例子:

public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int Age {get;set;}

    public override void ToString()
    {
        // return whatever makes sense here...
        return string.Format("[Person: FirstName={0}, LastName={1}, Age={2}]", FirstName, LastName, Age);
    }
}

请注意,string.Format 方法只是创建字符串的一种方式。string.Format 的第一个参数是“格式”,可以包含文字和占位符,你需要提供其他参数作为占位符的值。上面的 {0}{1}{2} 是 FirstName、LastName 和 Age 参数的占位符,这些参数在格式之后传递。如果您想了解更多信息,请阅读有关string.Format的内容。

1

重写 ToString() 方法:

public class Test
{
   public string FirstName { get; set; }

   public string LastName { get; set; }

   public override string ToString()
   {
      // Do your formatting here
      return LastName + ", " + FirstName;
   }
}

1
你必须在你的类中重写ToString()方法。比如我有一个类,其中包含m_nDays、m_nHours和m_nMinutes等属性...那么我可以按照以下方式重写ToString()方法:
public override string ToString()
{
    return string.Format("{0,5}d - {1:00}:{2:00}", m_nDays, m_nHours, m_nMinutes);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接