【问题标题】:Override .ToString method c#覆盖 .ToString 方法 c#
【发布时间】:2013-08-13 03:59:52
【问题描述】:

好的,所以我根据 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();
    }
}
}

【问题讨论】:

  • 那么你是怎么理解任务的呢?你认为它的结果应该是什么?
  • 运行这段代码的结果是什么?
  • 你为什么还要费心覆盖.ToString()? (作为提示:Console.WriteLine("s = {0}", s) 的结果是什么?你觉得这个结果有用吗?什么会使结果更有用?)
  • return $"{_name} {_number} {_date} {_salary}"; 应该可以。

标签: c#


【解决方案1】:

您返回的字符串仅包含短语 _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 版本的逻辑完全相同。

【讨论】:

    【解决方案2】:

    人们重写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);
    }
    

    【讨论】:

      【解决方案3】:

      不如试试类似的东西

      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

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

      【讨论】:

      • 甚至可能是String.Format()
      • @zerkms,只是把它改成了那个。还将包含 OP 的链接。
      【解决方案4】:

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

      例如:

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

      【讨论】:

        【解决方案5】:

        您可以尝试以良好的格式格式化输出。 (虽然没有测试)

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

        这实际上取决于您的需求上下文。您可能会在网上找到一些可以遵循的良好做法——相信网上有很多资源。

        【讨论】:

          【解决方案6】:

          不覆盖 ToString,如果您尝试“获取”员工的字符串值,例如

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

          你会得到:

          ConsoleApplication1.Program+Employee

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

          我用 return _name + _number + _date + _salary; 默认为字符串,

          或更详细的

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

          【讨论】:

            【解决方案7】:
            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;
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 2018-01-10
              • 2018-07-05
              • 1970-01-01
              • 1970-01-01
              • 2011-11-30
              • 2019-08-20
              • 2015-08-28
              • 2012-01-11
              • 1970-01-01
              相关资源
              最近更新 更多