Какова цель: public static DateTime ToDateTime (значение DateTime) в.NET Framework?

Я поддерживаю существующий проект, и я нашел эту строку кода:

Datetime someDate = ....;
var anotherDateTime = Convert.ToDateTime(someDate);

Сначала я ожидал, что someDate будет преобразован в строку, вызвав метод ToString на нем неявно, но я ошибся. Когда я нажал F12 на метод, я вижу определение этого метода в классе System.Convert, которое выглядит следующим образом:

// Summary: Returns the specified System.DateTime object; no actual conversion is performed.
// Parameters:
//   value: A date and time value.
// Returns:
//     value is returned unchanged.
public static DateTime ToDateTime(DateTime value);

Сначала Почему в.NET Framework есть такой метод, в первую очередь, поскольку в документации говорится, что этот метод ничего не делает?
Второй Пока я рефакторинг кода, могу ли я безопасно удалить вызов для этого метода, не влияя на поведение?

Ответ 1

Это связано с тем, что класс Convert предназначен для работы с типами, реализующими интерфейс IConvertible.

Этот интерфейс содержит методы для преобразования типа реализации в типы CLR, такие как decimal, byte, DateTime и т.д. Каждый из этих типов реализует сам IConvertible.

Итак, Convert.ToDateTime(DateTime d) - не единственный метод, который делает "ничего". Он существует для любого из этих типов CLR, реализующих IConvertible, например Convert.ToChar(char c). Это происходит только из-за того, что все эти типы реализуют IConvertible.

Вы можете прочитать об этом в комментариях исходного кода класса Convert.

Ответ 2

Да, вы можете удалить его. Это полностью избыточно. Что касается того, почему: я думаю, кто-то думал, что было бы неплохо избегать людей, случайно вызывающих Convert.ToDateTime(object) (который был бы неявным), что связано с коробкой, проверкой типов и распаковкой. Честно говоря, это похоже на глупую причину для меня, по строкам "писать плохой код, получать плохие результаты".

Ответ 3

Как вы можете видеть в текущих источниках BCL:

public static DateTime ToDateTime(DateTime value) {
        return value;
}

фактическое преобразование отсутствует, поэтому вы можете безопасно удалить эти вызовы.

Ответ 4

Хотя я до сих пор согласен с ответами, я думаю, есть и другой аспект, который является генерацией кода. В первые дни.NET генерация кода очень часто выполнялась с использованием CodeDOM (а иногда и по-прежнему есть, например, с помощью WinForms Designer). CodeDOM на самом деле не отслеживает тип переменных, поскольку этот тип не может быть известен во время генерации кода (например, если тип также генерируется). Поэтому гораздо проще просто создать ссылку на метод ToDate и выяснить, какой из перегрузок использовать компилятор. Учитывая, что эти методы не являются виртуальными, они могут быть встроены, и даже не снижается производительность.

Тем не менее, я уверен, что генератор кода WinForms Designer не использует этот метод, по крайней мере, не в.NET 2.0, самой ранней версии, с которой я работал.