Почему вы используете ToString () при использовании дат? - PullRequest
0 голосов
/ 01 мая 2018

Я изучаю C # в Microsoft Academy, и во время урока по датам и времени создатель видео использовал метод ToString для даты. Например:

DateTime myValue = DateTime.Now;
Console.WriteLine(myValue.ToString());
Console.ReadLine();

Когда я удалил метод ToString, я получил тот же результат, я предполагаю, что он предназначен для использования данных, но не лучше ли сохранить его таким, какой он есть, вместо того, чтобы превращать его в string?

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Возможно, в учебных целях показать, что string получено от myValue.ToString() вместо того, чтобы полагаться на Console.WriteLine(), чтобы преобразовать его для вас. Конверсия может быть неизвестна новичкам, и явно показано, что string получено из .ToString().

Простое написание Console.WriteLine(myValue); может привести к тому, что новые ученики будут включать объекты, не создавая сначала их ToString(), а затем вызывая их. ToString().

Ниже приведен пример:

public void ShowExample()
{
    DateTime myValue = DateTime.Now;
    Console.WriteLine(myValue.ToString()); // 5/1/2018 10:14:20 AM

    Foo myFoo= new Foo(); // Has no ToString method
    Console.WriteLine(myFoo); // ConsoleApplication.Foo
    Bar myBar = new Bar(); // Has custom ToString method
    Console.WriteLine(myBar); // Hi I'm from ToString()
    Console.ReadLine();
}

public class Foo
{
    int val = 9;
}

public class Bar
{

    public override string ToString()
    {
        return "Hi I'm from ToString()";
    }
}
0 голосов
/ 01 мая 2018

Работает без .ToString(), поскольку Console.WriteLine() имеет перегрузку , которая принимает аргумент Object . Поскольку все происходит от Object, а Object имеет собственный метод ToString(), если нет лучшего соответствия, эта версия метода может принять что угодно и попытаться распечатать его .

Вы можете думать о перегруженном методе так:

public static void WriteLine(object value)
{
    WriteLine(value.ToString());
}

... такой, что эта перегрузка в свою очередь вызывает string перегрузку .

.Net - это строго типизированная платформа. Полезно иметь представление о том, с какими типами вы имеете дело для каждой части утверждения.

Для значений DateTime они не хранятся внутри в удобочитаемом формате. Если вы хотите увидеть хорошее значение «5/1/2018» или «2018-05-01» при печати на консоли, это строки , и вам нужно преобразовать DateTime в string каким-то образом. Делая это в своем коде, вместо того, чтобы перегрузка Object справилась с этим, легче вернуться и определиться с тем, какой формат вы хотите. Но любая версия действительно "хорошо".

0 голосов
/ 01 мая 2018

Метод Console.WriteLine() имеет много перегрузок. Одним из них является Console.WriteLine(string s). Вы используете это в своем первом примере. Он печатает строковый аргумент, переданный напрямую.

Другая перегрузка Console.WriteLine(object o). Он принимает любой экземпляр (поскольку каждый тип является производным от object) и вызывает метод Object.ToString() внутри, а затем печатает полученную строку. Каждый тип, полученный из object, наследует метод ToString() и может переопределить его, как DateTime. Вот почему вы можете удалить ToString() во втором примере.

...