Переопределить метод .ToString С#

Хорошо, поэтому я написал эту программу из программы программирования С# (я пытаюсь изучить здесь), и она просит " переопределить метод 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();
    }
}
}

Ответ 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);
}

Если вы используете С# 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

Заменяет каждый элемент формата в указанной строке текстом эквивалент соответствующего значения объекта.

Ответ 4

Вы можете попытаться отформатировать вывод в хорошем формате. (но не проверено)

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() позволит им иметь содержательное описание с некоторым идентификатором (например, идентификатор объекта);
  • Некоторые разработчики хотели бы поместить некоторый код сериализации в метод ToString();
  • Некоторые разработчики даже ввели некоторый код отладки в метод .ToString(), хотя это может быть не очень хорошая практика.

это действительно зависит от контекста ваших потребностей. вы можете найти некоторые хорошие практики, чтобы следить за ними в Интернете - верьте, что в Интернете много ресурсов.

Ответ 5

Если вы используете С# 6 (или позже), используйте метод nameof() для имен свойств в строке, если имена свойств изменены. Вы также можете использовать нотацию $"" вместо использования string.Format().

Например:

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

Ответ 6

Без переопределения ToString, если вы попытались "получить" строковое значение Employee, например

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

Что вы получите:

ConsoleApplication1.Program + Employee

Что не дает никакой информации, чтобы помочь вам (или пользовательскому интерфейсу) отобразить соответствующую информацию.

Я использую return _name + _number + _date + _salary; Какая по умолчанию строка,

или более подробный

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