覆盖.ToString方法c#

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

我做得对吗? 或者我只是成功地编写了编译但什么都不做的代码。 ToString的目的是什么?

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

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(); } } } 

您正在返回一个只显示短语_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版本完全相同。

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

 Console.WriteLine(yourClassObject); 

如果不重写ToString() ,那么它的默认实现是返回对象的完全限定名,如下所示:

 YourNamespace.YourClassName 

通过更改inheritance的实现(来自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); } 

而是尝试类似的东西

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

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

所以

 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方法

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

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

 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()方法中,尽管这可能不是一个好习惯。

它真的取决于您的需求的背景。 您可能会发现一些在线跟踪的好习惯 – 相信网上有大量资源。

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

例如:

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

如果您试图“获取”Employee的字符串值,例如,不要覆盖ToString

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

你得到的是:

ConsoleApplication1.Program +员工

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

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

或者更详细

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