Почему преобразования.ToInt32(типа int32) существует?
происходит перегрузка Convert.ToInt32 Что происходит Int32 в качестве параметра. Но даже документация говорит, что в принципе ничего не происходит и метод возвращает свои входные данные.
вопрос в том, почему у нас такая перегрузка? Есть ли в этом смысл? Может ли кто-нибудь привести мне пример использования этого метода?
мои мысли: я думаю, у нас может быть это, потому что есть перегрузка, которая принимает объект. И поэтому мы хотим исключите бокс и так далее. Но я не уверен.
5 ответов
мои мысли:
-
для генерации кода: особенно в .NET 2.0 было создано много кода, например, типизированных наборов данных. Имея перегрузку, как
Convert.ToInt32(Int32)упрощает генератор кода, но не препятствует производительности во время выполнения, так как вызов, вероятно, JITed прочь немедленно - для последовательности: существует интерфейс IConvertible в .NET с 2.0 или, возможно, даже с 1.0, который используется преобразователем класс. Этот интерфейс требует таких методов, как ToInt32 и т. д.
генерация кода (Подробнее): Обычным методом генерации кода в .NET 2.0 раз была System.CodeDOM, поскольку он предоставляет средства для повторного использования одного и того же генератора кода для нескольких языков, наиболее заметно VB.NET и C#. В CodeDOM вам не нужно знать, какого типа данное выражение должно вызывать метод, вы можете просто создать CodeMethodCallExpression, заданное в выражении целевого объекта и имя метода. С другой стороны, многие операторы cast, такие как C#S as оператор не поддерживается CodeDOM.
как следствие, часто трудно узнать тип данного выражения кода в CodeDOM. Это имеет смысл, поскольку многие методы, которые могут включать выражение, также являются частью сгенерированного кода и, следовательно, неизвестны во время генерации. Однако в некоторых случаях требуется определенное выражение, преобразованное в данный тип, например System.Int32. Могу себе представить. это действительно произошло для типизированных наборов данных, хотя я не уверен на 100%. Потому что Convert.ToInt32 существует, генератору не нужно знать, имеет ли данное выражение тип System.Int32 или нет. Когда компилятор компилирует сгенерированный код, все сигнатуры методов доступны, и компилятор может выяснить, что тип выражения System.Int32 и вызовите соответствующую перегрузку.
С другой стороны, компилятор JIT обнаружит, что метод Convert.ToInt32 просто вернет свой аргумент. Но поскольку метод не является виртуальным, тело методов может быть вставлено в код вызывающих абонентов вместо вызова Convert.ToInt32 поскольку накладные расходы на вызов метода будут намного выше, чем тело метода.
только дизайнеры API знают.
Если бы мне пришлось сделать предположение, я бы предположил, что это ради согласованности - например, когда вы используете отражение для динамического создания вызовов, проще, если вы можете сделать предположение, что каждый Convert.ToX(Y) комбинация существует для любых примитивных типов X и Y.
мы можем получить один возможный ответ из использования ToInt32 (Int32) в классах framework.
Е. Г. Система.Деятельности.DurableInstancing.SerializationUtilities
public static byte[] CreateKeyBinaryBlob(List<CorrelationKey>correlationKeys)
{
[...]
Convert.ToInt32(correlationKey.BinaryData.Count)
и Система.ComponentModel.Дизайн.CollectionEditor
private void PaintArrow(Graphics g, Rectangle dropDownRect)
{
Point point = new Point(Convert.ToInt32(dropDownRect.Left + dropDownRect.Width / 2), Convert.ToInt32(dropDownRect.Top + dropDownRect.Height / 2));
в обоих случаях мы видим, что тип свойства или выражения в настоящее время Int32, но есть разумное ожидание, что /возможно / этот тип может отличаться на разных платформах, архитектурах ЦП, будущих версий платформы и т. д.
таким образом, мой предлагаемый ответ заключается в том, что он существует как своего рода будущая проверка исходного кода, чтобы позволить ему компилироваться без изменений, даже когда некоторые ключевые "сущности" (такие как window X и y coords) изменяют тип.
Общеязыковая среда выполнения используйте внутренне интерфейс IConvertible. Поскольку базовыми типами среды CLR являются Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char y String, для каждого из них есть реализация в классе Convert.
но, например, преобразовать.Toboolean (DateTime) всегда возвращает исключение по дизайну.
Вот описание метода:
//
// Summary:
// Returns the specified 32-bit signed integer; no actual conversion is performed.
//
// Parameters:
// value:
// The 32-bit signed integer to return.
//
// Returns:
// value is returned unchanged.
единственное, о чем я могу думать, это то, что это ярлык/проход, если вход уже int. Это, вероятно, намного эффективнее, чем если int был принят в Convert.ToInt32(object).