好的,所以我在编写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();
}
}
}
答案 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);
}
}
用文本替换指定字符串中的每个格式项 相当于对应对象的值。
答案 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(),具体取决于上下文。例如,
它实际上取决于您的需求背景。你可能会发现一些在网上关注的好习惯 - 相信网上有很多资源。
答案 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;
}
}