Для чего: публичная статическая DateTime ToDateTime (значение DateTime) в .NET Framework? - PullRequest
0 голосов
/ 17 октября 2018

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

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 имеетво-первых, такой метод, как в документации сказано, что этот метод ничего не делает? Second Могу ли я безопасно удалить вызов этого метода, не влияя на его поведение, пока я выполняю рефакторинг кода?

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

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

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

0 голосов
/ 17 октября 2018

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

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

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

0 голосов
/ 17 октября 2018

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

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

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

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

0 голосов
/ 17 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...