覆盖.ToString方法c#

Zor*_*oro 16 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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ain 42

你正在返回一个只是说短语的字符串_name + _number + _date + _salary.

您可能想要做的是使用这些字段构建一个字符串.如果你想让它们全部融合在一起Concat会起作用,但它会非常难以阅读

public override string ToString()
{
    return String.Concat(_name, _number, _date, _salary);
}
Run Code Online (Sandbox Code Playgroud)

然而,最好的方法是使用Format并在值中包含标签

public override string ToString()
{
    return String.Format("Name:{0}, Number:{1}, Date:{2}, Salary:{3}",_name, _number, _date, _salary);
}
Run Code Online (Sandbox Code Playgroud)

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

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

这与先前String.Format版本的逻辑完全相同.


Kar*_*son 8

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

Console.WriteLine(yourClassObject);
Run Code Online (Sandbox Code Playgroud)

如果不覆盖ToString(),则其默认实现是返回对象的完全限定名称,如下所示:

YourNamespace.YourClassName
Run Code Online (Sandbox Code Playgroud)

通过更改继承的实现(from System.Object),您可以创建一个更好的(read:prettier)表示,如下所示:

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);
}
Run Code Online (Sandbox Code Playgroud)


byt*_*dev 5

如果您使用的是 C# 6(或更高版本),请使用nameof()字符串中的属性名称的方法,以防属性名称发生更改。您还可以使用$""符号而不是使用string.Format()

例如:

public override string ToString()
{
    return $"{nameof(Name)}: {_name}";
}
Run Code Online (Sandbox Code Playgroud)