覆盖.ToString方法c#

时间:2013-08-13 03:59:53

标签: c#

好的,所以我在编写C#编程书时编写了这个程序(我试图在这里学习)并且它要求“覆盖ToString()方法以返回所有数据成员

我是否正确完成了这项工作?或者我只是成功地编写了编译但什么都不做的代码。 ToString 的目的是什么?

我花了大约30分钟时间查看其他帖子,并没有想出来,所以我决定这样做。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication297
{
class Program
{
    static void Main(string[] args)
    {
        String name = "Stormtrooper";
        Employee s = new Employee(name);
        Console.WriteLine("The type of hire is a {0}", s.Name);
        Console.WriteLine("The identification number is {0}", s.Number);
        Console.WriteLine("The date of hire is {0} ABY", s.Date);
        Console.WriteLine("The standard galactic salary is...{0:C}", s.Salary);

    }

    class Employee
    {
        private string _name;
        private string _number;
        private int _date;
        private int _salary;
        public string Name
        {
            get
            {
                return _name;
            }
        }

        public string Number
        {
            get
            {
                return _number;
            }
        }

        public int Date
        {
            get
            {
                return _date;
            }
        }
        public int Salary
        {
            get
            {
                return _salary;
            }
        }
        public Employee(string n)
        {
            _name = n;
            _number = "AA23TK421";
            _date = 4;
            _salary = 800;
        }
    }

    public override string ToString()

    {
        return "_name + _number + _date + _salary".ToString();
    }
}
}

7 个答案:

答案 0 :(得分:39)

您将返回一个只显示短语_name + _number + _date + _salary的字符串。

您可能想要做的是使用这些字段构建字符串。如果你想要它们全部合在一起Concat会起作用,但它将是高度不可读的

public override string ToString()
{
    return String.Concat(_name, _number, _date, _salary);
}

然而,更好的方法是使用Format并包含值为

的标签
public override string ToString()
{
    return String.Format("Name:{0}, Number:{1}, Date:{2}, Salary:{3}",_name, _number, _date, _salary);
}

如果您使用的是C#6或更新版本,则可以使用以下清洁格式

public override string ToString()
{
    return $"Name:{_name}, Number:{_number}, Date:{_date}, Salary:{_salary}";
}

与前一个String.Format版本的逻辑完全相同。

答案 1 :(得分:8)

人们覆盖ToString()方法的原因是拥有对象的默认字符串表示形式,通常用于显示给用户或显示在日志或控制台中,如下所示:

Console.WriteLine(yourClassObject);

如果你没有覆盖ToString(),那么它的默认实现是返回对象的完全限定名,如下所示:

YourNamespace.YourClassName

通过更改继承的实现(来自System.Object),您可以创建一个更好的(读取:更漂亮)表示,如下所示:

public override string ToString()
{
    return String.Format("This instance of my object has the following: Name = {0}, Number = {1}, Date = {2}, Salary = ${3}", _name, _number, _date, _salary);
}

答案 2 :(得分:2)

而是尝试像

这样的东西
public override string ToString()
{
    return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary);
}

但它很可能成为班级的一部分

所以

class Employee
{
    private string _name;
    private string _number;
    private int _date;
    private int _salary;

    .....

    public override string ToString()
    {
        return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary);
    }
}

查看String.Format Method

  

用文本替换指定字符串中的每个格式项   相当于对应对象的值。

答案 3 :(得分:0)

您可以尝试以漂亮的格式格式化输出。 (虽未测试)

public override string ToString()
{
    return string.Format("Name: {0} Number: {1:n0} Date: {2:yyyy-MM-dd} Salary: {3:n2}", _name, _number, _date, _salary);
}

有很多目的会覆盖.ToString(),具体取决于上下文。例如,

  • 一些开发人员喜欢在进行调试时使用格式良好的对象描述,覆盖.ToString()将允许他们使用某些标识符(例如,对象的Id)进行有意义的描述;
  • 一些开发人员喜欢将一些序列化代码放入ToString()方法;
  • 有些开发人员甚至将一些调试代码放入.ToString()方法,尽管这可能不是一个好习惯。

它实际上取决于您的需求背景。你可能会发现一些在网上关注的好习惯 - 相信网上有很多资源。

答案 4 :(得分:0)

如果您正在使用C#6(或更高版本),请在字符串中使用nameof()方法作为属性名称,以防更改名称。您也可以使用$""表示法而不是使用string.Format()。

例如:

public override string ToString()
{
    return $"{nameof(Name)}: {_name}";
}

答案 5 :(得分:0)

如果你试图"得到"而不是覆盖ToString。 Employee的字符串值,例如

var employee1= new Employee(); Console.WriteLine(employee1);

你得到的是:

ConsoleApplication1.Program + Employee

它根本不提供任何信息来帮助您(或UI)显示相关信息。

我用 return _name + _number + _date + _salary; 默认为string,

或更详细的

return "Name:" + _name + " Number:" + _number + " etc...";

答案 6 :(得分:0)

class Program
{
    static void Main( )
    {
        int Number = 10;
        Console.WriteLine(Number.ToString());

        Customer cc = new Customer();
        cc.FirstName = "Rakibuz";
        cc.LastName = "Sultan";

        Console.WriteLine(Convert.ToString(cc));

    }
}

public class Customer
{
    public string FirstName;
    public string LastName;

    public override string ToString()
    {
        return FirstName + " " + LastName;
    }

}